@cryptotaxi247 / netdata-1 / commits / 4d762461a

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);