@cryptotaxi247 / netdata-1 / commits / 8fb6baa19

disk performance metrics optimization and cleanup of removed disks

Costa Tsaousis (ktsaou) committed Mar 5, 2017 at 22:13 UTC 8fb6baa19f6646a076d16bc3b722838fb204f9f6
1 file changed +265 -115
src/proc_diskstats.c
+265 -115
@@ -25,9 +25,24 @@ static struct disk {
25 int do_util;
26 int do_backlog;
27
28 + int updated;
29 +
30 + RRDSET *st_avgsz;
31 + RRDSET *st_await;
32 + RRDSET *st_backlog;
33 + RRDSET *st_io;
34 + RRDSET *st_iotime;
35 + RRDSET *st_mops;
36 + RRDSET *st_ops;
37 + RRDSET *st_qops;
38 + RRDSET *st_svctm;
39 + RRDSET *st_util;
40 +
41 struct disk *next;
42 } *disk_root = NULL;
43
44 +#define rrdset_obsolete_and_pointer_null(st) do { if(st) { rrdset_flag_set(st, RRDSET_FLAG_OBSOLETE); st = NULL; } } while(st)
45 +
46 static struct disk *get_disk(unsigned long major, unsigned long minor, char *disk) {
47 static char path_to_get_hw_sector_size[FILENAME_MAX + 1] = "";
48 static char path_to_get_hw_sector_size_partitions[FILENAME_MAX + 1] = "";
@@ -316,7 +331,7 @@ int do_proc_diskstats(int update_every, usec_t dt) {
331 // get a disk structure for the disk
332
333 struct disk *d = get_disk(major, minor, disk);
319 -
334 + d->updated = 1;
335
336 // --------------------------------------------------------------------------
337 // Set its family based on mount point
@@ -409,27 +424,34 @@ int do_proc_diskstats(int update_every, usec_t dt) {
424 d->configured = 1;
425 }
426
412 - RRDSET *st;
413 -
427 // --------------------------------------------------------------------------
428 // Do performance metrics
429
430 if(d->do_io == CONFIG_BOOLEAN_YES || (d->do_io == CONFIG_BOOLEAN_AUTO && (readsectors || writesectors))) {
431 d->do_io = CONFIG_BOOLEAN_YES;
432
420 - st = rrdset_find_bytype_localhost(RRD_TYPE_DISK, disk);
421 - if(unlikely(!st)) {
422 - st = rrdset_create_localhost(RRD_TYPE_DISK, disk, NULL, family, "disk.io", "Disk I/O Bandwidth"
423 - , "kilobytes/s", 2000, update_every, RRDSET_TYPE_AREA);
424 -
425 - rrddim_add(st, "reads", NULL, d->sector_size, 1024, RRD_ALGORITHM_INCREMENTAL);
426 - rrddim_add(st, "writes", NULL, d->sector_size * -1, 1024, RRD_ALGORITHM_INCREMENTAL);
433 + if(unlikely(!d->st_io)) {
434 + d->st_io = rrdset_create_localhost(
435 + RRD_TYPE_DISK
436 + , disk
437 + , NULL
438 + , family
439 + , "disk.io"
440 + , "Disk I/O Bandwidth"
441 + , "kilobytes/s"
442 + , 2000
443 + , update_every
444 + , RRDSET_TYPE_AREA
445 + );
446 +
447 + rrddim_add(d->st_io, "reads", NULL, d->sector_size, 1024, RRD_ALGORITHM_INCREMENTAL);
448 + rrddim_add(d->st_io, "writes", NULL, d->sector_size * -1, 1024, RRD_ALGORITHM_INCREMENTAL);
449 }
428 - else rrdset_next(st);
450 + else rrdset_next(d->st_io);
451
430 - last_readsectors = rrddim_set(st, "reads", readsectors);
431 - last_writesectors = rrddim_set(st, "writes", writesectors);
432 - rrdset_done(st);
452 + last_readsectors = rrddim_set(d->st_io, "reads", readsectors);
453 + last_writesectors = rrddim_set(d->st_io, "writes", writesectors);
454 + rrdset_done(d->st_io);
455 }
456
457 // --------------------------------------------------------------------
@@ -437,20 +459,30 @@ int do_proc_diskstats(int update_every, usec_t dt) {
459 if(d->do_ops == CONFIG_BOOLEAN_YES || (d->do_ops == CONFIG_BOOLEAN_AUTO && (reads || writes))) {
460 d->do_ops = CONFIG_BOOLEAN_YES;
461
440 - st = rrdset_find_bytype_localhost("disk_ops", disk);
441 - if(unlikely(!st)) {
442 - st = rrdset_create_localhost("disk_ops", disk, NULL, family, "disk.ops", "Disk Completed I/O Operations"
443 - , "operations/s", 2001, update_every, RRDSET_TYPE_LINE);
444 - rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
445 -
446 - rrddim_add(st, "reads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
447 - rrddim_add(st, "writes", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
462 + if(unlikely(!d->st_ops)) {
463 + d->st_ops = rrdset_create_localhost(
464 + "disk_ops"
465 + , disk
466 + , NULL
467 + , family
468 + , "disk.ops"
469 + , "Disk Completed I/O Operations"
470 + , "operations/s"
471 + , 2001
472 + , update_every
473 + , RRDSET_TYPE_LINE
474 + );
475 +
476 + rrdset_flag_set(d->st_ops, RRDSET_FLAG_DETAIL);
477 +
478 + rrddim_add(d->st_ops, "reads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
479 + rrddim_add(d->st_ops, "writes", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
480 }
449 - else rrdset_next(st);
481 + else rrdset_next(d->st_ops);
482
451 - last_reads = rrddim_set(st, "reads", reads);
452 - last_writes = rrddim_set(st, "writes", writes);
453 - rrdset_done(st);
483 + last_reads = rrddim_set(d->st_ops, "reads", reads);
484 + last_writes = rrddim_set(d->st_ops, "writes", writes);
485 + rrdset_done(d->st_ops);
486 }
487
488 // --------------------------------------------------------------------
@@ -458,18 +490,28 @@ int do_proc_diskstats(int update_every, usec_t dt) {
490 if(d->do_qops == CONFIG_BOOLEAN_YES || (d->do_qops == CONFIG_BOOLEAN_AUTO && queued_ios)) {
491 d->do_qops = CONFIG_BOOLEAN_YES;
492
461 - st = rrdset_find_bytype_localhost("disk_qops", disk);
462 - if(unlikely(!st)) {
463 - st = rrdset_create_localhost("disk_qops", disk, NULL, family, "disk.qops", "Disk Current I/O Operations"
464 - , "operations", 2002, update_every, RRDSET_TYPE_LINE);
465 - rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
466 -
467 - rrddim_add(st, "operations", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
493 + if(unlikely(!d->st_qops)) {
494 + d->st_qops = rrdset_create_localhost(
495 + "disk_qops"
496 + , disk
497 + , NULL
498 + , family
499 + , "disk.qops"
500 + , "Disk Current I/O Operations"
501 + , "operations"
502 + , 2002
503 + , update_every
504 + , RRDSET_TYPE_LINE
505 + );
506 +
507 + rrdset_flag_set(d->st_qops, RRDSET_FLAG_DETAIL);
508 +
509 + rrddim_add(d->st_qops, "operations", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
510 }
469 - else rrdset_next(st);
511 + else rrdset_next(d->st_qops);
512
471 - rrddim_set(st, "operations", queued_ios);
472 - rrdset_done(st);
513 + rrddim_set(d->st_qops, "operations", queued_ios);
514 + rrdset_done(d->st_qops);
515 }
516
517 // --------------------------------------------------------------------
@@ -477,18 +519,28 @@ int do_proc_diskstats(int update_every, usec_t dt) {
519 if(d->do_backlog == CONFIG_BOOLEAN_YES || (d->do_backlog == CONFIG_BOOLEAN_AUTO && backlog_ms)) {
520 d->do_backlog = CONFIG_BOOLEAN_YES;
521
480 - st = rrdset_find_bytype_localhost("disk_backlog", disk);
481 - if(unlikely(!st)) {
482 - st = rrdset_create_localhost("disk_backlog", disk, NULL, family, "disk.backlog", "Disk Backlog"
483 - , "backlog (ms)", 2003, update_every, RRDSET_TYPE_AREA);
484 - rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
485 -
486 - rrddim_add(st, "backlog", NULL, 1, 10, RRD_ALGORITHM_INCREMENTAL);
522 + if(unlikely(!d->st_backlog)) {
523 + d->st_backlog = rrdset_create_localhost(
524 + "disk_backlog"
525 + , disk
526 + , NULL
527 + , family
528 + , "disk.backlog"
529 + , "Disk Backlog"
530 + , "backlog (ms)"
531 + , 2003
532 + , update_every
533 + , RRDSET_TYPE_AREA
534 + );
535 +
536 + rrdset_flag_set(d->st_backlog, RRDSET_FLAG_DETAIL);
537 +
538 + rrddim_add(d->st_backlog, "backlog", NULL, 1, 10, RRD_ALGORITHM_INCREMENTAL);
539 }
488 - else rrdset_next(st);
540 + else rrdset_next(d->st_backlog);
541
490 - rrddim_set(st, "backlog", backlog_ms);
491 - rrdset_done(st);
542 + rrddim_set(d->st_backlog, "backlog", backlog_ms);
543 + rrdset_done(d->st_backlog);
544 }
545
546 // --------------------------------------------------------------------
@@ -496,18 +548,28 @@ int do_proc_diskstats(int update_every, usec_t dt) {
548 if(d->do_util == CONFIG_BOOLEAN_YES || (d->do_util == CONFIG_BOOLEAN_AUTO && busy_ms)) {
549 d->do_util = CONFIG_BOOLEAN_YES;
550
499 - st = rrdset_find_bytype_localhost("disk_util", disk);
500 - if(unlikely(!st)) {
501 - st = rrdset_create_localhost("disk_util", disk, NULL, family, "disk.util", "Disk Utilization Time"
502 - , "% of time working", 2004, update_every, RRDSET_TYPE_AREA);
503 - rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
504 -
505 - rrddim_add(st, "utilization", NULL, 1, 10, RRD_ALGORITHM_INCREMENTAL);
551 + if(unlikely(!d->st_util)) {
552 + d->st_util = rrdset_create_localhost(
553 + "disk_util"
554 + , disk
555 + , NULL
556 + , family
557 + , "disk.util"
558 + , "Disk Utilization Time"
559 + , "% of time working"
560 + , 2004
561 + , update_every
562 + , RRDSET_TYPE_AREA
563 + );
564 +
565 + rrdset_flag_set(d->st_util, RRDSET_FLAG_DETAIL);
566 +
567 + rrddim_add(d->st_util, "utilization", NULL, 1, 10, RRD_ALGORITHM_INCREMENTAL);
568 }
507 - else rrdset_next(st);
569 + else rrdset_next(d->st_util);
570
509 - last_busy_ms = rrddim_set(st, "utilization", busy_ms);
510 - rrdset_done(st);
571 + last_busy_ms = rrddim_set(d->st_util, "utilization", busy_ms);
572 + rrdset_done(d->st_util);
573 }
574
575 // --------------------------------------------------------------------
@@ -515,20 +577,30 @@ int do_proc_diskstats(int update_every, usec_t dt) {
577 if(d->do_mops == CONFIG_BOOLEAN_YES || (d->do_mops == CONFIG_BOOLEAN_AUTO && (mreads || mwrites))) {
578 d->do_mops = CONFIG_BOOLEAN_YES;
579
518 - st = rrdset_find_bytype_localhost("disk_mops", disk);
519 - if(unlikely(!st)) {
520 - st = rrdset_create_localhost("disk_mops", disk, NULL, family, "disk.mops", "Disk Merged Operations"
521 - , "merged operations/s", 2021, update_every, RRDSET_TYPE_LINE);
522 - rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
523 -
524 - rrddim_add(st, "reads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
525 - rrddim_add(st, "writes", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
580 + if(unlikely(!d->st_mops)) {
581 + d->st_mops = rrdset_create_localhost(
582 + "disk_mops"
583 + , disk
584 + , NULL
585 + , family
586 + , "disk.mops"
587 + , "Disk Merged Operations"
588 + , "merged operations/s"
589 + , 2021
590 + , update_every
591 + , RRDSET_TYPE_LINE
592 + );
593 +
594 + rrdset_flag_set(d->st_mops, RRDSET_FLAG_DETAIL);
595 +
596 + rrddim_add(d->st_mops, "reads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
597 + rrddim_add(d->st_mops, "writes", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
598 }
527 - else rrdset_next(st);
599 + else rrdset_next(d->st_mops);
600
529 - rrddim_set(st, "reads", mreads);
530 - rrddim_set(st, "writes", mwrites);
531 - rrdset_done(st);
601 + rrddim_set(d->st_mops, "reads", mreads);
602 + rrddim_set(d->st_mops, "writes", mwrites);
603 + rrdset_done(d->st_mops);
604 }
605
606 // --------------------------------------------------------------------
@@ -536,20 +608,30 @@ int do_proc_diskstats(int update_every, usec_t dt) {
608 if(d->do_iotime == CONFIG_BOOLEAN_YES || (d->do_iotime == CONFIG_BOOLEAN_AUTO && (readms || writems))) {
609 d->do_iotime = CONFIG_BOOLEAN_YES;
610
539 - st = rrdset_find_bytype_localhost("disk_iotime", disk);
540 - if(unlikely(!st)) {
541 - st = rrdset_create_localhost("disk_iotime", disk, NULL, family, "disk.iotime", "Disk Total I/O Time"
542 - , "milliseconds/s", 2022, update_every, RRDSET_TYPE_LINE);
543 - rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
544 -
545 - rrddim_add(st, "reads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
546 - rrddim_add(st, "writes", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
611 + if(unlikely(!d->st_iotime)) {
612 + d->st_iotime = rrdset_create_localhost(
613 + "disk_iotime"
614 + , disk
615 + , NULL
616 + , family
617 + , "disk.iotime"
618 + , "Disk Total I/O Time"
619 + , "milliseconds/s"
620 + , 2022
621 + , update_every
622 + , RRDSET_TYPE_LINE
623 + );
624 +
625 + rrdset_flag_set(d->st_iotime, RRDSET_FLAG_DETAIL);
626 +
627 + rrddim_add(d->st_iotime, "reads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
628 + rrddim_add(d->st_iotime, "writes", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
629 }
548 - else rrdset_next(st);
630 + else rrdset_next(d->st_iotime);
631
550 - last_readms = rrddim_set(st, "reads", readms);
551 - last_writems = rrddim_set(st, "writes", writems);
552 - rrdset_done(st);
632 + last_readms = rrddim_set(d->st_iotime, "reads", readms);
633 + last_writems = rrddim_set(d->st_iotime, "writes", writems);
634 + rrdset_done(d->st_iotime);
635 }
636
637 // --------------------------------------------------------------------
@@ -559,57 +641,125 @@ int do_proc_diskstats(int update_every, usec_t dt) {
641 if(likely(dt)) {
642 if( (d->do_iotime == CONFIG_BOOLEAN_YES || (d->do_iotime == CONFIG_BOOLEAN_AUTO && (readms || writems))) &&
643 (d->do_ops == CONFIG_BOOLEAN_YES || (d->do_ops == CONFIG_BOOLEAN_AUTO && (reads || writes)))) {
562 - st = rrdset_find_bytype_localhost("disk_await", disk);
563 - if(unlikely(!st)) {
564 - st = rrdset_create_localhost("disk_await", disk, NULL, family, "disk.await"
565 - , "Average Completed I/O Operation Time", "ms per operation", 2005
566 - , update_every, RRDSET_TYPE_LINE);
567 - rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
568 -
569 - rrddim_add(st, "reads", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
570 - rrddim_add(st, "writes", NULL, -1, 1, RRD_ALGORITHM_ABSOLUTE);
644 +
645 + if(unlikely(!d->st_await)) {
646 + d->st_await = rrdset_create_localhost(
647 + "disk_await"
648 + , disk
649 + , NULL
650 + , family
651 + , "disk.await"
652 + , "Average Completed I/O Operation Time"
653 + , "ms per operation"
654 + , 2005
655 + , update_every
656 + , RRDSET_TYPE_LINE
657 + );
658 +
659 + rrdset_flag_set(d->st_await, RRDSET_FLAG_DETAIL);
660 +
661 + rrddim_add(d->st_await, "reads", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
662 + rrddim_add(d->st_await, "writes", NULL, -1, 1, RRD_ALGORITHM_ABSOLUTE);
663 }
572 - else rrdset_next(st);
664 + else rrdset_next(d->st_await);
665
574 - rrddim_set(st, "reads", (reads - last_reads) ? (readms - last_readms) / (reads - last_reads) : 0);
575 - rrddim_set(st, "writes", (writes - last_writes) ? (writems - last_writems) / (writes - last_writes) : 0);
576 - rrdset_done(st);
666 + rrddim_set(d->st_await, "reads", (reads - last_reads) ? (readms - last_readms) / (reads - last_reads) : 0);
667 + rrddim_set(d->st_await, "writes", (writes - last_writes) ? (writems - last_writems) / (writes - last_writes) : 0);
668 + rrdset_done(d->st_await);
669 }
670
671 if( (d->do_io == CONFIG_BOOLEAN_YES || (d->do_io == CONFIG_BOOLEAN_AUTO && (readsectors || writesectors))) &&
672 (d->do_ops == CONFIG_BOOLEAN_YES || (d->do_ops == CONFIG_BOOLEAN_AUTO && (reads || writes)))) {
581 - st = rrdset_find_bytype_localhost("disk_avgsz", disk);
582 - if(unlikely(!st)) {
583 - st = rrdset_create_localhost("disk_avgsz", disk, NULL, family, "disk.avgsz"
584 - , "Average Completed I/O Operation Bandwidth"
585 - , "kilobytes per operation", 2006, update_every, RRDSET_TYPE_AREA);
586 - rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
587 -
588 - rrddim_add(st, "reads", NULL, d->sector_size, 1024, RRD_ALGORITHM_ABSOLUTE);
589 - rrddim_add(st, "writes", NULL, d->sector_size * -1, 1024, RRD_ALGORITHM_ABSOLUTE);
673 +
674 + if(unlikely(!d->st_avgsz)) {
675 + d->st_avgsz = rrdset_create_localhost(
676 + "disk_avgsz"
677 + , disk
678 + , NULL
679 + , family
680 + , "disk.avgsz"
681 + , "Average Completed I/O Operation Bandwidth"
682 + , "kilobytes per operation"
683 + , 2006
684 + , update_every
685 + , RRDSET_TYPE_AREA
686 + );
687 +
688 + rrdset_flag_set(d->st_avgsz, RRDSET_FLAG_DETAIL);
689 +
690 + rrddim_add(d->st_avgsz, "reads", NULL, d->sector_size, 1024, RRD_ALGORITHM_ABSOLUTE);
691 + rrddim_add(d->st_avgsz, "writes", NULL, d->sector_size * -1, 1024, RRD_ALGORITHM_ABSOLUTE);
692 }
591 - else rrdset_next(st);
693 + else rrdset_next(d->st_avgsz);
694
593 - rrddim_set(st, "reads", (reads - last_reads) ? (readsectors - last_readsectors) / (reads - last_reads) : 0);
594 - rrddim_set(st, "writes", (writes - last_writes) ? (writesectors - last_writesectors) / (writes - last_writes) : 0);
595 - rrdset_done(st);
695 + rrddim_set(d->st_avgsz, "reads", (reads - last_reads) ? (readsectors - last_readsectors) / (reads - last_reads) : 0);
696 + rrddim_set(d->st_avgsz, "writes", (writes - last_writes) ? (writesectors - last_writesectors) / (writes - last_writes) : 0);
697 + rrdset_done(d->st_avgsz);
698 }
699
700 if( (d->do_util == CONFIG_BOOLEAN_YES || (d->do_util == CONFIG_BOOLEAN_AUTO && busy_ms)) &&
701 (d->do_ops == CONFIG_BOOLEAN_YES || (d->do_ops == CONFIG_BOOLEAN_AUTO && (reads || writes)))) {
600 - st = rrdset_find_bytype_localhost("disk_svctm", disk);
601 - if(unlikely(!st)) {
602 - st = rrdset_create_localhost("disk_svctm", disk, NULL, family, "disk.svctm", "Average Service Time"
603 - , "ms per operation", 2007, update_every, RRDSET_TYPE_LINE);
604 - rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
702
606 - rrddim_add(st, "svctm", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
703 + if(unlikely(!d->st_svctm)) {
704 + d->st_svctm = rrdset_create_localhost(
705 + "disk_svctm"
706 + , disk
707 + , NULL
708 + , family
709 + , "disk.svctm"
710 + , "Average Service Time"
711 + , "ms per operation"
712 + , 2007
713 + , update_every
714 + , RRDSET_TYPE_LINE
715 + );
716 +
717 + rrdset_flag_set(d->st_svctm, RRDSET_FLAG_DETAIL);
718 +
719 + rrddim_add(d->st_svctm, "svctm", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
720 }
608 - else rrdset_next(st);
721 + else rrdset_next(d->st_svctm);
722 +
723 + rrddim_set(d->st_svctm, "svctm", ((reads - last_reads) + (writes - last_writes)) ? (busy_ms - last_busy_ms) / ((reads - last_reads) + (writes - last_writes)) : 0);
724 + rrdset_done(d->st_svctm);
725 + }
726 + }
727 + }
728
610 - rrddim_set(st, "svctm", ((reads - last_reads) + (writes - last_writes)) ? (busy_ms - last_busy_ms) / ((reads - last_reads) + (writes - last_writes)) : 0);
611 - rrdset_done(st);
729 + // cleanup removed disks
730 +
731 + struct disk *d = disk_root, *last = NULL;
732 + while(d) {
733 + if(unlikely(!d->updated)) {
734 + struct disk *t = d;
735 +
736 + rrdset_obsolete_and_pointer_null(d->st_avgsz);
737 + rrdset_obsolete_and_pointer_null(d->st_await);
738 + rrdset_obsolete_and_pointer_null(d->st_backlog);
739 + rrdset_obsolete_and_pointer_null(d->st_io);
740 + rrdset_obsolete_and_pointer_null(d->st_iotime);
741 + rrdset_obsolete_and_pointer_null(d->st_mops);
742 + rrdset_obsolete_and_pointer_null(d->st_ops);
743 + rrdset_obsolete_and_pointer_null(d->st_qops);
744 + rrdset_obsolete_and_pointer_null(d->st_svctm);
745 + rrdset_obsolete_and_pointer_null(d->st_util);
746 +
747 + if(d == disk_root) {
748 + disk_root = d = d->next;
749 + last = NULL;
750 + }
751 + else if(last) {
752 + last->next = d = d->next;
753 }
754 +
755 + freez(t->disk);
756 + freez(t->mount_point);
757 + freez(t);
758 + }
759 + else {
760 + d->updated = 0;
761 + last = d;
762 + d = d->next;
763 }
764 }
765