Skip to content

Commit 4b7f53e

Browse files
committed
Adapt sysusage iand sysusagejqgraph to changes into sar sysstat tool
since version 11.5.7. As per sysstat commit 8d635e0: sar: Update "sar -d" output contents Replace "rd_sec/s" and "wr_sec/s" fields with "rkB/s" and "wkB/s". These fields are now expressed in kilobytes instead of sectors. This also make them consistent with iostat's output. Replace "avgrq-sz" field with "areq-sz". This field is now expressed in kilobytes instead of sectors and make it consistent with iostat's output. Rename "avgqu-sz" field to "aqu-sz" to make it consistent with iostat's output.
1 parent 8d41cbf commit 4b7f53e

File tree

5 files changed

+203
-33
lines changed

5 files changed

+203
-33
lines changed

Sar.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ sub parseSarOutput
198198
$headers[0] = 'name';
199199
next;
200200
}
201-
if ($self->{data}[$i] =~ m#^DEV\s+.*rd_sec#) {
201+
if ($self->{data}[$i] =~ m#^DEV\s+.*(rd_sec/s|rkB/s)#) {
202202
$type = 'dev';
203203
$headers[0] = 'name';
204204
next;

bin/rsysusage

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -356,28 +356,48 @@ sub mon_dev
356356

357357
foreach my $name (keys %devinfo) {
358358
next if ( ($device ne 'all') && ($device ne $name));
359+
if (exists $devinfo{$name}{'rd_sec'}) {
359360
print "DEV $name: %util = $devinfo{$name}{'%util'}, rd_sec/s = $devinfo{$name}{'rd_sec'}, wr_sec/s = $devinfo{$name}{'wr_sec'}, avgqu-sz => $devinfo{$name}{'avgqu-sz'}\n" if ($Config{'GENERAL'}{'DEBUG'});
361+
} else {
362+
print "DEV $name: %util = $devinfo{$name}{'%util'}, rkB/s = $devinfo{$name}{'rkB'}, wkB/s = $devinfo{$name}{'wkB'}, aqu-sz => $devinfo{$name}{'aqu-sz'}\n" if ($Config{'GENERAL'}{'DEBUG'});
363+
}
360364
my $target = 'dev_';
361365
$target .= $name;
362366
if (exists $CMD{$target}) {
363367
$target = $name;
364368
$target =~ s#_#__#g;
365369
$target =~ s#/#_#g;
366370
$target = 'dev_' . $target;
367-
if (!$devinfo{$name}{'%util'} && !$devinfo{$name}{'avgqu-sz'}) {
368-
&insertIntDataNull($host, $target);
371+
if (exists $devinfo{$name}{'avgqu-sz'}) {
372+
if (!$devinfo{$name}{'%util'} && !$devinfo{$name}{'avgqu-sz'}) {
373+
&insertIntDataNull($host, $target);
374+
} else {
375+
&insertIntData($host, $target, $devinfo{$name}{'%util'},$devinfo{$name}{'avgqu-sz'},0);
376+
}
369377
} else {
370-
&insertIntData($host, $target, $devinfo{$name}{'%util'},$devinfo{$name}{'avgqu-sz'},0);
378+
if (!$devinfo{$name}{'%util'} && !$devinfo{$name}{'aqu-sz'}) {
379+
&insertIntDataNull($host, $target);
380+
} else {
381+
&insertIntData($host, $target, $devinfo{$name}{'%util'},$devinfo{$name}{'aqu-sz'},0);
382+
}
371383
}
372384
&send_warning($host, $target, 'dev', "Device $name CPU Usage", $devinfo{$name}{'%util'});
373385
$target = $name;
374386
$target =~ s#_#__#g;
375387
$target =~ s#/#_#g;
376388
$target = 'devio_' . $target;
377-
if (!$devinfo{$name}{'rd_sec'} && !$devinfo{$name}{'wr_sec'}) {
378-
&insertIntDataNull($host, $target);
389+
if (exists $devinfo{$name}{'rd_sec'}) {
390+
if (!$devinfo{$name}{'rd_sec'} && !$devinfo{$name}{'wr_sec'}) {
391+
&insertIntDataNull($host, $target);
392+
} else {
393+
&insertIntData($host, $target, $devinfo{$name}{'rd_sec'}, $devinfo{$name}{'wr_sec'},0);
394+
}
379395
} else {
380-
&insertIntData($host, $target, $devinfo{$name}{'rd_sec'}, $devinfo{$name}{'wr_sec'},0);
396+
if (!$devinfo{$name}{'rkB'} && !$devinfo{$name}{'wkB'}) {
397+
&insertIntDataNull($host, $target);
398+
} else {
399+
&insertIntData($host, $target, $devinfo{$name}{'rkB'}, $devinfo{$name}{'wkB'},0);
400+
}
381401
}
382402
$target = $name;
383403
$target =~ s#_#__#g;
@@ -394,9 +414,16 @@ print "DEV $name: %util = $devinfo{$name}{'%util'}, rd_sec/s = $devinfo{$name}{'
394414
# Get read/write workload
395415
my $r_work = 0;
396416
my $w_work = 0;
397-
if ($devinfo{$name}{'rd_sec'} && $devinfo{$name}{'wr_sec'}) {
398-
$r_work = $devinfo{$name}{'rd_sec'} / (($devinfo{$name}{'rd_sec'} + $devinfo{$name}{'wr_sec'}) || 1);
399-
$w_work = $devinfo{$name}{'wr_sec'} / (($devinfo{$name}{'rd_sec'} + $devinfo{$name}{'wr_sec'}) || 1);
417+
if (exists $devinfo{$name}{'rd_sec'}) {
418+
if ($devinfo{$name}{'rd_sec'} && $devinfo{$name}{'wr_sec'}) {
419+
$r_work = $devinfo{$name}{'rd_sec'} / (($devinfo{$name}{'rd_sec'} + $devinfo{$name}{'wr_sec'}) || 1);
420+
$w_work = $devinfo{$name}{'wr_sec'} / (($devinfo{$name}{'rd_sec'} + $devinfo{$name}{'wr_sec'}) || 1);
421+
}
422+
} else {
423+
if ($devinfo{$name}{'rkB'} && $devinfo{$name}{'wkB'}) {
424+
$r_work = $devinfo{$name}{'rkB'} / (($devinfo{$name}{'rkB'} + $devinfo{$name}{'wkB'}) || 1);
425+
$w_work = $devinfo{$name}{'wkB'} / (($devinfo{$name}{'rkB'} + $devinfo{$name}{'wkB'}) || 1);
426+
}
400427
}
401428
$w_work ||= 1;
402429
$r_work ||= 1;
@@ -417,7 +444,12 @@ print "DEVWORK $name: \%read = $r_work, \%write = $w_work, tps = $tps, iops = $i
417444
}
418445
$target = 'dev_';
419446
$target .= $name;
420-
my $blks = $devinfo{$name}{'rd_sec'} + $devinfo{$name}{'wr_sec'};
447+
my $blks = '';
448+
if (exists $devinfo{$name}{'rd_sec'}) {
449+
$blks = $devinfo{$name}{'rd_sec'} + $devinfo{$name}{'wr_sec'};
450+
} else {
451+
$blks = $devinfo{$name}{'rkB'} + $devinfo{$name}{'wkB'};
452+
}
421453
my $busy = $devinfo{$name}{'%util'};
422454
$busy = 1.00 if ($busy == 0.00);
423455
my $throughput = sprintf("%.2f", ($blks*50)/$busy );

bin/sysusage

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -519,28 +519,49 @@ sub mon_dev
519519

520520
foreach my $name (keys %devinfo) {
521521
next if ( ($device ne 'all') && ($device ne $name));
522+
if (exists $devinfo{$name}{'rd_sec'}) {
522523
print "DEV $name: %util = $devinfo{$name}{'%util'}, rd_sec/s = $devinfo{$name}{'rd_sec'}, wr_sec/s = $devinfo{$name}{'wr_sec'}, avgqu-sz => $devinfo{$name}{'avgqu-sz'}\n" if ($Config{'GENERAL'}{'DEBUG'});
524+
} else {
525+
print "DEV $name: %util = $devinfo{$name}{'%util'}, rkB/s = $devinfo{$name}{'rkB'}, wkB/s = $devinfo{$name}{'wkB'}, aqu-sz => $devinfo{$name}{'aqu-sz'}\n" if ($Config{'GENERAL'}{'DEBUG'});
526+
}
523527
my $target = 'dev_';
524528
$target .= $name;
525529
if (exists $CMD{$target}) {
526530
$target = $name;
527531
$target =~ s#_#__#g;
528532
$target =~ s#/#_#g;
529533
$target = 'dev_' . $target;
530-
if (!$devinfo{$name}{'%util'} && !$devinfo{$name}{'avgqu-sz'}) {
531-
&insertIntDataNull($host, $target);
534+
# Handle change since 11.5.7
535+
if (exists $devinfo{$name}{'avgqu-sz'}) {
536+
if (!$devinfo{$name}{'%util'} && !$devinfo{$name}{'avgqu-sz'}) {
537+
&insertIntDataNull($host, $target);
538+
} else {
539+
&insertIntData($host, $target, $devinfo{$name}{'%util'},$devinfo{$name}{'avgqu-sz'},0);
540+
}
532541
} else {
533-
&insertIntData($host, $target, $devinfo{$name}{'%util'},$devinfo{$name}{'avgqu-sz'},0);
542+
if (!$devinfo{$name}{'%util'} && !$devinfo{$name}{'aqu-sz'}) {
543+
&insertIntDataNull($host, $target);
544+
} else {
545+
&insertIntData($host, $target, $devinfo{$name}{'%util'},$devinfo{$name}{'aqu-sz'},0);
546+
}
534547
}
535548
&send_warning($host, $target, 'dev', "Device $name CPU Usage", $devinfo{$name}{'%util'});
536549
$target = $name;
537550
$target =~ s#_#__#g;
538551
$target =~ s#/#_#g;
539552
$target = 'devio_' . $target;
540-
if (!$devinfo{$name}{'rd_sec'} && !$devinfo{$name}{'wr_sec'}) {
541-
&insertIntDataNull($host, $target);
553+
if (exists $devinfo{$name}{'rd_sec'}) {
554+
if (!$devinfo{$name}{'rd_sec'} && !$devinfo{$name}{'wr_sec'}) {
555+
&insertIntDataNull($host, $target);
556+
} else {
557+
&insertIntData($host, $target, $devinfo{$name}{'rd_sec'}, $devinfo{$name}{'wr_sec'},0);
558+
}
542559
} else {
543-
&insertIntData($host, $target, $devinfo{$name}{'rd_sec'}, $devinfo{$name}{'wr_sec'},0);
560+
if (!$devinfo{$name}{'rkB'} && !$devinfo{$name}{'wkB'}) {
561+
&insertIntDataNull($host, $target);
562+
} else {
563+
&insertIntData($host, $target, $devinfo{$name}{'rkB'}, $devinfo{$name}{'wkB'},0);
564+
}
544565
}
545566
$target = $name;
546567
$target =~ s#_#__#g;
@@ -557,9 +578,16 @@ print "DEV $name: %util = $devinfo{$name}{'%util'}, rd_sec/s = $devinfo{$name}{'
557578
# Get read/write workload
558579
my $r_work = 0;
559580
my $w_work = 0;
560-
if ($devinfo{$name}{'rd_sec'} && $devinfo{$name}{'wr_sec'}) {
561-
$r_work = $devinfo{$name}{'rd_sec'} / (($devinfo{$name}{'rd_sec'} + $devinfo{$name}{'wr_sec'}) || 1);
562-
$w_work = $devinfo{$name}{'wr_sec'} / (($devinfo{$name}{'rd_sec'} + $devinfo{$name}{'wr_sec'}) || 1);
581+
if (exists $devinfo{$name}{'rd_sec'}) {
582+
if ($devinfo{$name}{'rd_sec'} && $devinfo{$name}{'wr_sec'}) {
583+
$r_work = $devinfo{$name}{'rd_sec'} / (($devinfo{$name}{'rd_sec'} + $devinfo{$name}{'wr_sec'}) || 1);
584+
$w_work = $devinfo{$name}{'wr_sec'} / (($devinfo{$name}{'rd_sec'} + $devinfo{$name}{'wr_sec'}) || 1);
585+
}
586+
} else {
587+
if ($devinfo{$name}{'rkB'} && $devinfo{$name}{'wkB'}) {
588+
$r_work = $devinfo{$name}{'rkB'} / (($devinfo{$name}{'rkB'} + $devinfo{$name}{'wkB'}) || 1);
589+
$w_work = $devinfo{$name}{'wkB'} / (($devinfo{$name}{'rkB'} + $devinfo{$name}{'wkB'}) || 1);
590+
}
563591
}
564592
$w_work ||= 1;
565593
$r_work ||= 1;
@@ -580,7 +608,12 @@ print "DEVWORK $name: \%read = $r_work, \%write = $w_work, tps = $tps, iops = $i
580608
}
581609
$target = 'dev_';
582610
$target .= $name;
583-
my $blks = $devinfo{$name}{'rd_sec'} + $devinfo{$name}{'wr_sec'};
611+
my $blks = '';
612+
if (exists $devinfo{$name}{'rd_sec'}) {
613+
$blks = $devinfo{$name}{'rd_sec'} + $devinfo{$name}{'wr_sec'};
614+
} else {
615+
$blks = $devinfo{$name}{'rkB'} + $devinfo{$name}{'wkB'};
616+
}
584617
my $busy = $devinfo{$name}{'%util'};
585618
$busy = 1.00 if ($busy == 0.00);
586619
my $throughput = sprintf("%.2f", ($blks*50)/$busy);

bin/sysusagegraph

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -456,10 +456,17 @@ sub createGraphic
456456
$tmp =~ s#_#/#g;
457457
$tmp =~ s#\{TMPCHAR\}#_#g;
458458
my $dev = $DEVALIAS{$tmp} || $tmp;
459-
$vlabel = 'I/O sectors from device';
460-
$title = "I/O sectors on $dev";
461-
$legend_A = 'Read sectors per second';
462-
$legend_B = 'Write sectors per second';
459+
if ($SYSSTAT_VERSION lt "11.5.7") {
460+
$vlabel = 'I/O sectors from device';
461+
$title = "I/O sectors on $dev";
462+
$legend_A = 'Read sectors per second';
463+
$legend_B = 'Write sectors per second';
464+
} else {
465+
$vlabel = 'I/O from device';
466+
$title = "I/O on $dev";
467+
$legend_A = 'Read Kb per second';
468+
$legend_B = 'Write Kb per second';
469+
}
463470
$legend1 = 'read/s';
464471
$legend2 = 'write/s';
465472
$section = "Device $dev";
@@ -1540,7 +1547,8 @@ Command: sar -u ALL
15401547
If a disk is more than 60% busy over sustained periods of time, this can
15411548
indicate overuse of that resource.
15421549
1543-
Another way to identify a disk bottleneck is to use avgqu-sz >= 2.
1550+
Another way to identify a disk bottleneck is to use avgqu-sz >= 2 or
1551+
aqu-sz in sysstat >= 11.5.7.
15441552
15451553
Command: sar -p -d
15461554
@@ -1554,6 +1562,12 @@ Command: sar -p -d
15541562
The average queue length of the requests that were
15551563
issued to the device.
15561564
1565+
since sysstat >= 11.5.7
1566+
1567+
aqu-sz
1568+
The average queue length of the requests that were issued to the device.
1569+
Note: In previous versions, this field was known as avgqu-sz.
1570+
15571571
};
15581572
} elsif ($target =~ /devio_/) {
15591573
@@ -1567,6 +1581,15 @@ Command: sar -p -d
15671581
wr_sec/s
15681582
Number of sectors written to the device. The size of a
15691583
sector is 512 bytes.
1584+
1585+
since sysstat >= 11.5.7
1586+
1587+
rkB/s
1588+
Number of kilobytes read from the device per second.
1589+
1590+
wkB/s
1591+
Number of kilobytes written to the device per second.
1592+
15701593
};
15711594
} elsif ($target =~ /devtput_/) {
15721595
@@ -1576,6 +1599,10 @@ throughput of a disk, and may suggest where a I/O bottleneck can occur:
15761599
15771600
Maximum disk throughput (KB/s) = (rd_sec/s + wr_sec/s) * 50 / %util
15781601
1602+
or since sysstat 11.5.7:
1603+
1604+
Maximum disk throughput (KB/s) = (rkB/s + wkB/s) * 50 / %util
1605+
15791606
This monitoring comes from <a href="http://osr507doc.sco.com/en/PERFORM/ident_IO_bound.html" target="_new">Identifying disk I/O-bound systems</a>
15801607
15811608
Command: sar -p -d
@@ -1592,7 +1619,19 @@ Command: sar -p -d
15921619
Percentage of CPU time during which I/O requests were
15931620
issued to the device (bandwidth utilization for the
15941621
device). Device saturation occurs when this value is
1595-
close to 100%.
1622+
close to 100% for device serving requests serially. But for
1623+
devices serving requests in parallel, such as RAID arrays
1624+
and modern SSDs, this does not reflect their performance
1625+
limits.
1626+
1627+
since sysstat >= 11.5.7
1628+
1629+
rkB/s
1630+
Number of kilobytes read from the device per second.
1631+
1632+
wkB/s
1633+
Number of kilobytes written to the device per second.
1634+
15961635
};
15971636
} elsif ($target =~ /devwork_/) {
15981637
@@ -1622,6 +1661,11 @@ equation:
16221661
This IOPS monitoring is build following the excellent article of Nick Anderson
16231662
readable from <a href="http://www.cmdln.org/2010/04/22/analyzing-io-performance-in-linux/" target="_new">Analyzing I/O performance in Linux</a>.
16241663
1664+
or since sysstat >= 11.5.7:
1665+
1666+
%r = rkB / (rkB + wkB);
1667+
%w = wkB / (rkB + wkB);
1668+
16251669
Note: you can considere entering into lost of performence when your storage
16261670
system reach 70% utilization of theoretical max IOPS.
16271671
@@ -1641,6 +1685,14 @@ rd_sec, wr_sec iand tps are obtained with the command: sar -p -d
16411685
combined into a single I/O request to the device. A
16421686
transfer is of indeterminate size.
16431687
1688+
since sysstat >= 11.5.7
1689+
1690+
rkB/s
1691+
Number of kilobytes read from the device per second.
1692+
1693+
wkB/s
1694+
Number of kilobytes written to the device per second.
1695+
16441696
};
16451697
16461698
} elsif ($target =~ /devwait_/) {

0 commit comments

Comments
 (0)