disk performance metrics can now be disabled per device major; disk statistics config options cleanup
Costa Tsaousis (ktsaou) committed
Jan 2, 2017 at 14:26 UTC
367505ab88d13d272c0b6c4df3f5106931deed0a
1 file changed
+32
-45
src/proc_diskstats.c
+32
-45
@@ -18,7 +18,6 @@ static struct disk {
18
int type;
19
20
char *mount_point;
21
- uint32_t mount_point_hash;
21
22
// disk options caching
23
int configured;
@@ -29,8 +28,6 @@ static struct disk {
28
int do_qops;
29
int do_util;
30
int do_backlog;
32
- int do_space;
33
- int do_inodes;
31
32
struct disk *next;
33
} *disk_root = NULL;
@@ -339,21 +336,10 @@ static struct disk *get_disk(unsigned long major, unsigned long minor, char *dis
336
337
// mountinfo_find() can be called with NULL disk_mountinfo_root
338
struct mountinfo *mi = mountinfo_find(disk_mountinfo_root, d->major, d->minor);
342
-/* if(unlikely(!mi)) {
343
- mountinfo_reload(1);
344
-
345
- // search again for this disk
346
- mi = mountinfo_find(disk_mountinfo_root, d->major, d->minor);
347
- }
348
-*/
349
- if(unlikely(mi)) {
339
+ if(unlikely(mi))
340
d->mount_point = strdupz(mi->mount_point);
351
- d->mount_point_hash = mi->mount_point_hash;
352
- }
353
- else {
341
+ else
342
d->mount_point = NULL;
355
- d->mount_point_hash = 0;
356
- }
343
344
// ------------------------------------------------------------------------
345
// find the disk sector size
@@ -411,6 +397,33 @@ static inline int select_positive_option(int option1, int option2) {
397
return CONFIG_ONDEMAND_NO;
398
}
399
400
+static inline int is_major_enabled(int major) {
401
+ static char *major_configs = NULL;
402
+ static size_t major_size = 0;
403
+
404
+ if(major < 0) return 1;
405
+
406
+ size_t wanted_size = (size_t)major + 1;
407
+
408
+ if(major_size < wanted_size) {
409
+ major_configs = reallocz(major_configs, wanted_size);
410
+
411
+ size_t i;
412
+ for(i = major_size; i < wanted_size ; i++)
413
+ major_configs[i] = -1;
414
+
415
+ major_size = wanted_size;
416
+ }
417
+
418
+ if(major_configs[major] == -1) {
419
+ char buffer[CONFIG_MAX_NAME + 1];
420
+ snprintfz(buffer, CONFIG_MAX_NAME, "performance metrics for disks with major %d", major);
421
+ major_configs[major] = (char)config_get_boolean("plugin:proc:/proc/diskstats", buffer, 1);
422
+ }
423
+
424
+ return major_configs[major];
425
+}
426
+
427
int do_proc_diskstats(int update_every, usec_t dt) {
428
(void)dt;
429
@@ -419,8 +432,6 @@ int do_proc_diskstats(int update_every, usec_t dt) {
432
global_enable_performance_for_physical_disks = CONFIG_ONDEMAND_ONDEMAND,
433
global_enable_performance_for_virtual_disks = CONFIG_ONDEMAND_NO,
434
global_enable_performance_for_partitions = CONFIG_ONDEMAND_NO,
422
- global_enable_performance_for_mountpoints = CONFIG_ONDEMAND_NO,
423
- global_enable_performance_for_virtual_mountpoints = CONFIG_ONDEMAND_ONDEMAND,
435
global_do_io = CONFIG_ONDEMAND_ONDEMAND,
436
global_do_ops = CONFIG_ONDEMAND_ONDEMAND,
437
global_do_mops = CONFIG_ONDEMAND_ONDEMAND,
@@ -436,8 +447,6 @@ int do_proc_diskstats(int update_every, usec_t dt) {
447
global_enable_performance_for_physical_disks = config_get_boolean_ondemand("plugin:proc:/proc/diskstats", "performance metrics for physical disks", global_enable_performance_for_physical_disks);
448
global_enable_performance_for_virtual_disks = config_get_boolean_ondemand("plugin:proc:/proc/diskstats", "performance metrics for virtual disks", global_enable_performance_for_virtual_disks);
449
global_enable_performance_for_partitions = config_get_boolean_ondemand("plugin:proc:/proc/diskstats", "performance metrics for partitions", global_enable_performance_for_partitions);
439
- global_enable_performance_for_mountpoints = config_get_boolean_ondemand("plugin:proc:/proc/diskstats", "performance metrics for mounted filesystems", global_enable_performance_for_mountpoints);
440
- global_enable_performance_for_virtual_mountpoints = config_get_boolean_ondemand("plugin:proc:/proc/diskstats", "performance metrics for mounted virtual disks", global_enable_performance_for_virtual_mountpoints);
450
451
global_do_io = config_get_boolean_ondemand("plugin:proc:/proc/diskstats", "bandwidth for all disks", global_do_io);
452
global_do_ops = config_get_boolean_ondemand("plugin:proc:/proc/diskstats", "operations for all disks", global_do_ops);
@@ -579,15 +588,12 @@ int do_proc_diskstats(int update_every, usec_t dt) {
588
d->do_qops = CONFIG_ONDEMAND_NO;
589
d->do_util = CONFIG_ONDEMAND_NO;
590
d->do_backlog = CONFIG_ONDEMAND_NO;
582
- d->do_space = CONFIG_ONDEMAND_NO;
583
- d->do_inodes = CONFIG_ONDEMAND_NO;
591
}
592
else {
593
// this disk is enabled
594
// check its direct settings
595
596
int def_performance = CONFIG_ONDEMAND_ONDEMAND;
590
- int def_space = (d->mount_point)?CONFIG_ONDEMAND_ONDEMAND:CONFIG_ONDEMAND_NO;
597
598
// since this is 'on demand' we can figure the performance settings
599
// based on the type of disk
@@ -603,14 +609,12 @@ int do_proc_diskstats(int update_every, usec_t dt) {
609
610
case DISK_TYPE_CONTAINER:
611
def_performance = global_enable_performance_for_virtual_disks;
606
-
607
- if(d->mount_point)
608
- def_performance = select_positive_option(def_performance, global_enable_performance_for_virtual_mountpoints);
612
break;
613
}
614
612
- if(d->mount_point)
613
- def_performance = select_positive_option(def_performance, global_enable_performance_for_mountpoints);
615
+ // check if we have to disable performance for this disk
616
+ if(def_performance)
617
+ def_performance = is_major_enabled((int)major);
618
619
// ------------------------------------------------------------
620
// now we have def_performance and def_space
@@ -646,23 +650,6 @@ int do_proc_diskstats(int update_every, usec_t dt) {
650
d->do_qops = config_get_boolean_ondemand(var_name, "queued operations", ddo_qops);
651
d->do_util = config_get_boolean_ondemand(var_name, "utilization percentage", ddo_util);
652
d->do_backlog = config_get_boolean_ondemand(var_name, "backlog", ddo_backlog);
649
-
650
- // def_space
651
- if(unlikely(d->mount_point)) {
652
- // check the user configuration (this will also show our 'on demand' decision)
653
- def_space = config_get_boolean_ondemand(var_name, "enable space metrics", def_space);
654
-
655
- int ddo_space = def_space,
656
- ddo_inodes = def_space;
657
-
658
- d->do_space = config_get_boolean_ondemand(var_name, "space usage", ddo_space);
659
- d->do_inodes = config_get_boolean_ondemand(var_name, "inodes usage", ddo_inodes);
660
- }
661
- else {
662
- // don't show settings for this disk
663
- d->do_space = CONFIG_ONDEMAND_NO;
664
- d->do_inodes = CONFIG_ONDEMAND_NO;
665
- }
653
}
654
655
d->configured = 1;