added writeback rate
Costa Tsaousis (ktsaou) committed
Mar 5, 2018 at 17:37 UTC
4d762461a4904b970f7230df6a95c92a1512b6f7
1 file changed
+121
-100
src/proc_diskstats.c
+121
-100
@@ -34,14 +34,16 @@ static struct disk {
34
35
int device_is_bcache;
36
37
+ char *bcache_filename_readahead;
38
char *bcache_filename_dirty_data;
38
- char *bcache_filename_cache_available_percent;
39
- char *bcache_filename_cache_hits;
40
- char *bcache_filename_cache_misses;
41
- char *bcache_filename_cache_miss_collisions;
42
- char *bcache_filename_cache_bypass_hits;
43
- char *bcache_filename_cache_bypass_misses;
44
- char *bcache_filename_cache_readaheads;
39
+ char *bcache_filename_writeback_rate;
40
+
41
+ char *bcache_filename_stats_total_cache_available_percent;
42
+ char *bcache_filename_stats_total_cache_hits;
43
+ char *bcache_filename_stats_total_cache_misses;
44
+ char *bcache_filename_stats_total_cache_miss_collisions;
45
+ char *bcache_filename_stats_total_cache_bypass_hits;
46
+ char *bcache_filename_stats_total_cache_bypass_misses;
47
48
RRDSET *st_io;
49
RRDDIM *rd_io_reads;
@@ -94,8 +96,9 @@ static struct disk {
96
RRDDIM *rd_bcache_bypass_hits;
97
RRDDIM *rd_bcache_bypass_misses;
98
97
- RRDSET *st_bcache_readaheads;
98
- RRDDIM *rd_bcache_readaheads;
99
+ RRDSET *st_bcache_rates;
100
+ RRDDIM *rd_bcache_rate_readahead;
101
+ RRDDIM *rd_bcache_rate_writeback;
102
103
struct disk *next;
104
} *disk_root = NULL;
@@ -130,6 +133,32 @@ static int global_enable_new_disks_detected_at_runtime = CONFIG_BOOLEAN_YES,
133
134
static SIMPLE_PATTERN *excluded_disks = NULL;
135
136
+static unsigned long long int bcache_read_number_with_units(const char *filename) {
137
+ char buffer[50 + 1];
138
+ if(read_file(filename, buffer, 50) == 0) {
139
+ static int unknown_units_error = 10;
140
+
141
+ char *end = NULL;
142
+ long double value = str2ld(buffer, &end);
143
+ if(end && *end) {
144
+ if(*end == 'k')
145
+ return (unsigned long long int)(value * 1024.0);
146
+ else if(*end == 'M')
147
+ return (unsigned long long int)(value * 1024.0 * 1024.0);
148
+ else if(*end == 'G')
149
+ return (unsigned long long int)(value * 1024.0 * 1024.0 * 1024.0);
150
+ else if(unknown_units_error > 0) {
151
+ error("bcache file '%s' provides value '%s' with unknown units '%s'", filename, buffer, end);
152
+ unknown_units_error--;
153
+ }
154
+ }
155
+
156
+ return (unsigned long long int)value;
157
+ }
158
+
159
+ return 0;
160
+}
161
+
162
static inline int is_major_enabled(int major) {
163
static int8_t *major_configs = NULL;
164
static size_t major_size = 0;
@@ -480,51 +509,57 @@ static struct disk *get_disk(unsigned long major, unsigned long minor, char *dis
509
510
char buffer2[FILENAME_MAX + 1];
511
512
+ snprintfz(buffer2, FILENAME_MAX, "%s/readahead", buffer);
513
+ if(access(buffer2, R_OK) == 0)
514
+ d->bcache_filename_readahead = strdupz(buffer2);
515
+ else
516
+ error("bcache file '%s' cannot be read.", buffer2);
517
+
518
snprintfz(buffer2, FILENAME_MAX, "%s/dirty_data", buffer);
519
if(access(buffer2, R_OK) == 0)
520
d->bcache_filename_dirty_data = strdupz(buffer2);
521
else
522
error("bcache file '%s' cannot be read.", buffer2);
523
524
+ snprintfz(buffer2, FILENAME_MAX, "%s/writeback_rate", buffer);
525
+ if(access(buffer2, R_OK) == 0)
526
+ d->bcache_filename_writeback_rate = strdupz(buffer2);
527
+ else
528
+ error("bcache file '%s' cannot be read.", buffer2);
529
+
530
snprintfz(buffer2, FILENAME_MAX, "%s/cache/cache_available_percent", buffer);
531
if(access(buffer2, R_OK) == 0)
491
- d->bcache_filename_cache_available_percent = strdupz(buffer2);
532
+ d->bcache_filename_stats_total_cache_available_percent = strdupz(buffer2);
533
else
534
error("bcache file '%s' cannot be read.", buffer2);
535
536
snprintfz(buffer2, FILENAME_MAX, "%s/stats_total/cache_hits", buffer);
537
if(access(buffer2, R_OK) == 0)
497
- d->bcache_filename_cache_hits = strdupz(buffer2);
538
+ d->bcache_filename_stats_total_cache_hits = strdupz(buffer2);
539
else
540
error("bcache file '%s' cannot be read.", buffer2);
541
542
snprintfz(buffer2, FILENAME_MAX, "%s/stats_total/cache_misses", buffer);
543
if(access(buffer2, R_OK) == 0)
503
- d->bcache_filename_cache_misses = strdupz(buffer2);
544
+ d->bcache_filename_stats_total_cache_misses = strdupz(buffer2);
545
else
546
error("bcache file '%s' cannot be read.", buffer2);
547
548
snprintfz(buffer2, FILENAME_MAX, "%s/stats_total/cache_bypass_hits", buffer);
549
if(access(buffer2, R_OK) == 0)
509
- d->bcache_filename_cache_bypass_hits = strdupz(buffer2);
550
+ d->bcache_filename_stats_total_cache_bypass_hits = strdupz(buffer2);
551
else
552
error("bcache file '%s' cannot be read.", buffer2);
553
554
snprintfz(buffer2, FILENAME_MAX, "%s/stats_total/cache_bypass_misses", buffer);
555
if(access(buffer2, R_OK) == 0)
515
- d->bcache_filename_cache_bypass_misses = strdupz(buffer2);
556
+ d->bcache_filename_stats_total_cache_bypass_misses = strdupz(buffer2);
557
else
558
error("bcache file '%s' cannot be read.", buffer2);
559
560
snprintfz(buffer2, FILENAME_MAX, "%s/stats_total/cache_miss_collisions", buffer);
561
if(access(buffer2, R_OK) == 0)
521
- d->bcache_filename_cache_miss_collisions = strdupz(buffer2);
522
- else
523
- error("bcache file '%s' cannot be read.", buffer2);
524
-
525
- snprintfz(buffer2, FILENAME_MAX, "%s/stats_total/cache_readaheads", buffer);
526
- if(access(buffer2, R_OK) == 0)
527
- d->bcache_filename_cache_readaheads = strdupz(buffer2);
562
+ d->bcache_filename_stats_total_cache_miss_collisions = strdupz(buffer2);
563
else
564
error("bcache file '%s' cannot be read.", buffer2);
565
}
@@ -1030,58 +1065,71 @@ int do_proc_diskstats(int update_every, usec_t dt) {
1065
cache_hits = 0,
1066
cache_miss_collisions = 0,
1067
cache_misses = 0,
1033
- cache_readaheads = 0,
1034
- dirty_size = 0,
1035
- cache_available_percent = 0;
1068
+ cache_available_percent = 0,
1069
+ readahead = 0,
1070
+ dirty_data = 0,
1071
+ writeback_rate = 0;
1072
1073
// read the bcache values
1074
1039
- if(d->bcache_filename_dirty_data) {
1040
- char buffer[50 + 1];
1041
- if(read_file(d->bcache_filename_dirty_data, buffer, 50) == 0) {
1042
- static int unknown_units_error = 10;
1043
-
1044
- char *end = NULL;
1045
- long double value = str2ld(buffer, &end);
1046
- if(end && *end) {
1047
- if(*end == 'k' || *end == 'K')
1048
- dirty_size = (unsigned long long int)(value * 1024.0);
1049
- else if(*end == 'M')
1050
- dirty_size = (unsigned long long int)(value * 1024.0 * 1024.0);
1051
- else if(*end == 'G' || *end == 'g')
1052
- dirty_size = (unsigned long long int)(value * 1024.0 * 1024.0 * 1024.0);
1053
- else if(unknown_units_error > 0) {
1054
- error("bcache provides value '%s' with unknown units '%s'", buffer, end);
1055
- unknown_units_error--;
1056
- }
1057
- }
1058
- }
1059
- }
1075
+ if(d->bcache_filename_readahead)
1076
+ readahead = bcache_read_number_with_units(d->bcache_filename_readahead);
1077
+
1078
+ if(d->bcache_filename_dirty_data)
1079
+ dirty_data = bcache_read_number_with_units(d->bcache_filename_dirty_data);
1080
1061
- if(d->bcache_filename_cache_available_percent)
1062
- read_single_number_file(d->bcache_filename_cache_available_percent, &cache_available_percent);
1081
+ if(d->bcache_filename_writeback_rate)
1082
+ writeback_rate = bcache_read_number_with_units(d->bcache_filename_writeback_rate);
1083
1064
- if(d->bcache_filename_cache_hits)
1065
- read_single_number_file(d->bcache_filename_cache_hits, &cache_hits);
1084
+ if(d->bcache_filename_stats_total_cache_available_percent)
1085
+ read_single_number_file(d->bcache_filename_stats_total_cache_available_percent, &cache_available_percent);
1086
1067
- if(d->bcache_filename_cache_misses)
1068
- read_single_number_file(d->bcache_filename_cache_misses, &cache_misses);
1087
+ if(d->bcache_filename_stats_total_cache_hits)
1088
+ read_single_number_file(d->bcache_filename_stats_total_cache_hits, &cache_hits);
1089
1070
- if(d->bcache_filename_cache_miss_collisions)
1071
- read_single_number_file(d->bcache_filename_cache_miss_collisions, &cache_miss_collisions);
1090
+ if(d->bcache_filename_stats_total_cache_misses)
1091
+ read_single_number_file(d->bcache_filename_stats_total_cache_misses, &cache_misses);
1092
1073
- if(d->bcache_filename_cache_bypass_hits)
1074
- read_single_number_file(d->bcache_filename_cache_bypass_hits, &cache_bypass_hits);
1093
+ if(d->bcache_filename_stats_total_cache_miss_collisions)
1094
+ read_single_number_file(d->bcache_filename_stats_total_cache_miss_collisions, &cache_miss_collisions);
1095
1076
- if(d->bcache_filename_cache_bypass_misses)
1077
- read_single_number_file(d->bcache_filename_cache_bypass_misses, &cache_bypass_misses);
1096
+ if(d->bcache_filename_stats_total_cache_bypass_hits)
1097
+ read_single_number_file(d->bcache_filename_stats_total_cache_bypass_hits, &cache_bypass_hits);
1098
1079
- if(d->bcache_filename_cache_readaheads)
1080
- read_single_number_file(d->bcache_filename_cache_readaheads, &cache_readaheads);
1099
+ if(d->bcache_filename_stats_total_cache_bypass_misses)
1100
+ read_single_number_file(d->bcache_filename_stats_total_cache_bypass_misses, &cache_bypass_misses);
1101
1102
1103
// update the charts
1104
1105
+ {
1106
+
1107
+ if(unlikely(!d->st_bcache_rates)) {
1108
+ d->st_bcache_rates = rrdset_create_localhost(
1109
+ "disk_bcache_rates"
1110
+ , d->device
1111
+ , d->disk
1112
+ , family
1113
+ , "disk.bcache_rates"
1114
+ , "Block Cache I/O Rates"
1115
+ , "KB/s"
1116
+ , "proc"
1117
+ , "diskstats"
1118
+ , 2120
1119
+ , update_every
1120
+ , RRDSET_TYPE_AREA
1121
+ );
1122
+
1123
+ d->rd_bcache_rate_readahead = rrddim_add(d->st_bcache_rates, "readahead", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
1124
+ d->rd_bcache_rate_writeback = rrddim_add(d->st_bcache_rates, "writeback", NULL, -1, 1024, RRD_ALGORITHM_ABSOLUTE);
1125
+ }
1126
+ else rrdset_next(d->st_bcache_rates);
1127
+
1128
+ rrddim_set_by_pointer(d->st_bcache_rates, d->rd_bcache_rate_writeback, writeback_rate);
1129
+ rrddim_set_by_pointer(d->st_bcache_rates, d->rd_bcache_rate_readahead, readahead);
1130
+ rrdset_done(d->st_bcache_rates);
1131
+ }
1132
+
1133
{
1134
if(unlikely(!d->st_bcache_size)) {
1135
d->st_bcache_size = rrdset_create_localhost(
@@ -1094,7 +1142,7 @@ int do_proc_diskstats(int update_every, usec_t dt) {
1142
, "MB"
1143
, "proc"
1144
, "diskstats"
1097
- , 2120
1145
+ , 2121
1146
, update_every
1147
, RRDSET_TYPE_AREA
1148
);
@@ -1103,7 +1151,7 @@ int do_proc_diskstats(int update_every, usec_t dt) {
1151
}
1152
else rrdset_next(d->st_bcache_size);
1153
1106
- rrddim_set_by_pointer(d->st_bcache_size, d->rd_bcache_dirty_size, dirty_size);
1154
+ rrddim_set_by_pointer(d->st_bcache_size, d->rd_bcache_dirty_size, dirty_data);
1155
rrdset_done(d->st_bcache_size);
1156
}
1157
@@ -1119,7 +1167,7 @@ int do_proc_diskstats(int update_every, usec_t dt) {
1167
, "percent"
1168
, "proc"
1169
, "diskstats"
1122
- , 2121
1170
+ , 2122
1171
, update_every
1172
, RRDSET_TYPE_AREA
1173
);
@@ -1147,7 +1195,7 @@ int do_proc_diskstats(int update_every, usec_t dt) {
1195
, "operations/s"
1196
, "proc"
1197
, "diskstats"
1150
- , 2122
1198
+ , 2123
1199
, update_every
1200
, RRDSET_TYPE_LINE
1201
);
@@ -1179,7 +1227,7 @@ int do_proc_diskstats(int update_every, usec_t dt) {
1227
, "operations/s"
1228
, "proc"
1229
, "diskstats"
1182
- , 2123
1230
+ , 2124
1231
, update_every
1232
, RRDSET_TYPE_LINE
1233
);
@@ -1195,34 +1243,6 @@ int do_proc_diskstats(int update_every, usec_t dt) {
1243
rrddim_set_by_pointer(d->st_bcache_bypass, d->rd_bcache_bypass_misses, cache_bypass_misses);
1244
rrdset_done(d->st_bcache_bypass);
1245
}
1198
-
1199
- if(d->do_bcache == CONFIG_BOOLEAN_YES || (d->do_bcache == CONFIG_BOOLEAN_AUTO && cache_readaheads != 0)) {
1200
-
1201
- if(unlikely(!d->st_bcache_readaheads)) {
1202
- d->st_bcache_readaheads = rrdset_create_localhost(
1203
- "disk_bcache_readahead"
1204
- , d->device
1205
- , d->disk
1206
- , family
1207
- , "disk.bcache_readahead"
1208
- , "Block Cache Readaheads"
1209
- , "events/s"
1210
- , "proc"
1211
- , "diskstats"
1212
- , 2124
1213
- , update_every
1214
- , RRDSET_TYPE_LINE
1215
- );
1216
-
1217
- rrdset_flag_set(d->st_bcache_readaheads, RRDSET_FLAG_DETAIL);
1218
-
1219
- d->rd_bcache_readaheads = rrddim_add(d->st_bcache_readaheads, "readaheads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1220
- }
1221
- else rrdset_next(d->st_bcache_readaheads);
1222
-
1223
- rrddim_set_by_pointer(d->st_bcache_readaheads, d->rd_bcache_readaheads, cache_readaheads);
1224
- rrdset_done(d->st_bcache_readaheads);
1225
- }
1246
}
1247
}
1248
@@ -1281,7 +1301,7 @@ int do_proc_diskstats(int update_every, usec_t dt) {
1301
rrdset_obsolete_and_pointer_null(d->st_util);
1302
rrdset_obsolete_and_pointer_null(d->st_bcache);
1303
rrdset_obsolete_and_pointer_null(d->st_bcache_bypass);
1284
- rrdset_obsolete_and_pointer_null(d->st_bcache_readaheads);
1304
+ rrdset_obsolete_and_pointer_null(d->st_bcache_rates);
1305
rrdset_obsolete_and_pointer_null(d->st_bcache_size);
1306
rrdset_obsolete_and_pointer_null(d->st_bcache_usage);
1307
@@ -1294,13 +1314,14 @@ int do_proc_diskstats(int update_every, usec_t dt) {
1314
}
1315
1316
freez(t->bcache_filename_dirty_data);
1297
- freez(t->bcache_filename_cache_available_percent);
1298
- freez(t->bcache_filename_cache_hits);
1299
- freez(t->bcache_filename_cache_misses);
1300
- freez(t->bcache_filename_cache_miss_collisions);
1301
- freez(t->bcache_filename_cache_bypass_hits);
1302
- freez(t->bcache_filename_cache_bypass_misses);
1303
- freez(t->bcache_filename_cache_readaheads);
1317
+ freez(t->bcache_filename_writeback_rate);
1318
+ freez(t->bcache_filename_stats_total_cache_available_percent);
1319
+ freez(t->bcache_filename_stats_total_cache_hits);
1320
+ freez(t->bcache_filename_stats_total_cache_misses);
1321
+ freez(t->bcache_filename_stats_total_cache_miss_collisions);
1322
+ freez(t->bcache_filename_stats_total_cache_bypass_hits);
1323
+ freez(t->bcache_filename_stats_total_cache_bypass_misses);
1324
+ freez(t->bcache_filename_readahead);
1325
1326
freez(t->disk);
1327
freez(t->device);