calculate total system disk I/O by aggregating the I/O of all physical disks; fixes #2877
Costa Tsaousis (ktsaou) committed
Oct 25, 2017 at 23:18 UTC
cce7ad6e6dd4a8affd95f0a51941fbc0c153b5e7
2 files changed
+46
-3
src/proc_diskstats.c
+43
@@ -348,6 +348,8 @@ int do_proc_diskstats(int update_every, usec_t dt) {
348
349
size_t lines = procfile_lines(ff), l;
350
351
+ collected_number system_read_kb = 0, system_write_kb = 0;
352
+
353
for(l = 0; l < lines ;l++) {
354
// --------------------------------------------------------------------------
355
// Read parameters
@@ -423,6 +425,11 @@ int do_proc_diskstats(int update_every, usec_t dt) {
425
struct disk *d = get_disk(major, minor, disk);
426
d->updated = 1;
427
428
+ if(unlikely(d->type == DISK_TYPE_PHYSICAL)) {
429
+ system_read_kb += readsectors * d->sector_size / 1024;
430
+ system_write_kb += writesectors * d->sector_size / 1024;
431
+ }
432
+
433
// --------------------------------------------------------------------------
434
// Set its family based on mount point
435
@@ -850,6 +857,42 @@ int do_proc_diskstats(int update_every, usec_t dt) {
857
}
858
}
859
860
+
861
+ // ------------------------------------------------------------------------
862
+ // update the system total I/O
863
+
864
+ if(global_do_io == CONFIG_BOOLEAN_YES || (global_do_io == CONFIG_BOOLEAN_AUTO && (system_read_kb || system_write_kb))) {
865
+ static RRDSET *st_io = NULL;
866
+ static RRDDIM *rd_in = NULL, *rd_out = NULL;
867
+
868
+ if(unlikely(!st_io)) {
869
+ st_io = rrdset_create_localhost(
870
+ "system"
871
+ , "io"
872
+ , NULL
873
+ , "disk"
874
+ , NULL
875
+ , "Disk I/O"
876
+ , "kilobytes/s"
877
+ , "proc"
878
+ , "diskstats"
879
+ , 150
880
+ , update_every
881
+ , RRDSET_TYPE_AREA
882
+ );
883
+
884
+ rd_in = rrddim_add(st_io, "in", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
885
+ rd_out = rrddim_add(st_io, "out", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
886
+ }
887
+ else rrdset_next(st_io);
888
+
889
+ rrddim_set_by_pointer(st_io, rd_in, system_read_kb);
890
+ rrddim_set_by_pointer(st_io, rd_out, system_write_kb);
891
+ rrdset_done(st_io);
892
+ }
893
+
894
+
895
+ // ------------------------------------------------------------------------
896
// cleanup removed disks
897
898
struct disk *d = disk_root, *last = NULL;
src/proc_vmstat.c
+3
-3
@@ -128,15 +128,15 @@ int do_proc_vmstat(int update_every, usec_t dt) {
128
if(unlikely(!st_io)) {
129
st_io = rrdset_create_localhost(
130
"system"
131
- , "io"
131
+ , "pgpgio"
132
, NULL
133
, "disk"
134
, NULL
135
- , "Disk I/O"
135
+ , "Memory Paged from/to disk"
136
, "kilobytes/s"
137
, "proc"
138
, "vmstat"
139
- , 150
139
+ , 151
140
, update_every
141
, RRDSET_TYPE_AREA
142
);