@cryptotaxi247 / netdata-1 / commits / 6d644a8c5

Add ZFS charts to FreeBSD plugin

Vladimir Kobal committed Apr 6, 2017 at 22:11 UTC 6d644a8c5018e942c64262d2ec513d12cf2d23a1
4 files changed +226
src/Makefile.am
+1
@@ -149,6 +149,7 @@ netdata_SOURCES += \
149 freebsd_getmntinfo.c \
150 freebsd_getifaddrs.c \
151 freebsd_devstat.c \
152 + proc_spl_kstat_zfs.c \
153 $(NULL)
154 else
155 if MACOS
src/plugin_freebsd.c
+3
@@ -53,6 +53,9 @@ static struct freebsd_module {
53 // network interfaces metrics
54 { .name = "getifaddrs", .dim = "getifaddrs", .enabled = 1, .func = do_getifaddrs },
55
56 + // ZFS metrics
57 + { .name = "kstat.zfs.misc.arcstats", .dim = "arcstats", .enabled = 1, .func = do_kstat_zfs_misc_arcstats },
58 +
59 // the terminator of this array
60 { .name = NULL, .dim = NULL, .enabled = 0, .func = NULL }
61 };
src/plugin_freebsd.h
+1
@@ -41,6 +41,7 @@ extern int do_net_inet6_icmp6_stats(int update_every, usec_t dt);
41 extern int do_getifaddrs(int update_every, usec_t dt);
42 extern int do_getmntinfo(int update_every, usec_t dt);
43 extern int do_kern_devstat(int update_every, usec_t dt);
44 +extern int do_kstat_zfs_misc_arcstats(int update_every, usec_t dt);
45
46 #define GETSYSCTL_MIB(name, mib) getsysctl_mib(name, mib, sizeof(mib)/sizeof(int))
47
src/proc_spl_kstat_zfs.c
+221
@@ -531,9 +531,13 @@ static void generate_charts_arc_summary(int update_every) {
531
532 {
533 static RRDSET *st_memory = NULL;
534 +#ifndef __FreeBSD__
535 static RRDDIM *rd_direct = NULL;
536 +#endif
537 static RRDDIM *rd_throttled = NULL;
538 +#ifndef __FreeBSD__
539 static RRDDIM *rd_indirect = NULL;
540 +#endif
541
542 if (unlikely(!st_memory)) {
543 st_memory = rrdset_create_localhost(
@@ -549,16 +553,24 @@ static void generate_charts_arc_summary(int update_every) {
553 , RRDSET_TYPE_LINE
554 );
555
556 +#ifndef __FreeBSD__
557 rd_direct = rrddim_add(st_memory, "direct", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
558 +#endif
559 rd_throttled = rrddim_add(st_memory, "throttled", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
560 +#ifndef __FreeBSD__
561 rd_indirect = rrddim_add(st_memory, "indirect", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
562 +#endif
563 }
564 else
565 rrdset_next(st_memory);
566
567 +#ifndef __FreeBSD__
568 rrddim_set_by_pointer(st_memory, rd_direct, arcstats.memory_direct_count);
569 +#endif
570 rrddim_set_by_pointer(st_memory, rd_throttled, arcstats.memory_throttle_count);
571 +#ifndef __FreeBSD__
572 rrddim_set_by_pointer(st_memory, rd_indirect, arcstats.memory_indirect_count);
573 +#endif
574 rrdset_done(st_memory);
575 }
576
@@ -764,6 +776,214 @@ static void generate_charts_arc_summary(int update_every) {
776
777 }
778
779 +#ifdef __FreeBSD__
780 +// kstat.zfs.misc.arcstats
781 +int do_kstat_zfs_misc_arcstats(int update_every, usec_t dt) {
782 + (void)dt;
783 +
784 + unsigned long long l2_size;
785 + size_t uint64_t_size = sizeof(uint64_t);
786 + static struct mibs {
787 + int hits[5];
788 + int misses[5];
789 + int demand_data_hits[5];
790 + int demand_data_misses[5];
791 + int demand_metadata_hits[5];
792 + int demand_metadata_misses[5];
793 + int prefetch_data_hits[5];
794 + int prefetch_data_misses[5];
795 + int prefetch_metadata_hits[5];
796 + int prefetch_metadata_misses[5];
797 + int mru_hits[5];
798 + int mru_ghost_hits[5];
799 + int mfu_hits[5];
800 + int mfu_ghost_hits[5];
801 + int deleted[5];
802 + int mutex_miss[5];
803 + int evict_skip[5];
804 + int evict_not_enough[5];
805 + int evict_l2_cached[5];
806 + int evict_l2_eligible[5];
807 + int evict_l2_ineligible[5];
808 + int evict_l2_skip[5];
809 + int hash_elements[5];
810 + int hash_elements_max[5];
811 + int hash_collisions[5];
812 + int hash_chains[5];
813 + int hash_chain_max[5];
814 + int p[5];
815 + int c[5];
816 + int c_min[5];
817 + int c_max[5];
818 + int size[5];
819 + int hdr_size[5];
820 + int data_size[5];
821 + int metadata_size[5];
822 + int other_size[5];
823 + int anon_size[5];
824 + int anon_evictable_data[5];
825 + int anon_evictable_metadata[5];
826 + int mru_size[5];
827 + int mru_evictable_data[5];
828 + int mru_evictable_metadata[5];
829 + int mru_ghost_size[5];
830 + int mru_ghost_evictable_data[5];
831 + int mru_ghost_evictable_metadata[5];
832 + int mfu_size[5];
833 + int mfu_evictable_data[5];
834 + int mfu_evictable_metadata[5];
835 + int mfu_ghost_size[5];
836 + int mfu_ghost_evictable_data[5];
837 + int mfu_ghost_evictable_metadata[5];
838 + int l2_hits[5];
839 + int l2_misses[5];
840 + int l2_feeds[5];
841 + int l2_rw_clash[5];
842 + int l2_read_bytes[5];
843 + int l2_write_bytes[5];
844 + int l2_writes_sent[5];
845 + int l2_writes_done[5];
846 + int l2_writes_error[5];
847 + int l2_writes_lock_retry[5];
848 + int l2_evict_lock_retry[5];
849 + int l2_evict_reading[5];
850 + int l2_evict_l1cached[5];
851 + int l2_free_on_write[5];
852 + int l2_cdata_free_on_write[5];
853 + int l2_abort_lowmem[5];
854 + int l2_cksum_bad[5];
855 + int l2_io_error[5];
856 + int l2_size[5];
857 + int l2_asize[5];
858 + int l2_hdr_size[5];
859 + int l2_compress_successes[5];
860 + int l2_compress_zeros[5];
861 + int l2_compress_failures[5];
862 + int memory_throttle_count[5];
863 + int duplicate_buffers[5];
864 + int duplicate_buffers_size[5];
865 + int duplicate_reads[5];
866 + int memory_direct_count[5];
867 + int memory_indirect_count[5];
868 + int arc_no_grow[5];
869 + int arc_tempreserve[5];
870 + int arc_loaned_bytes[5];
871 + int arc_prune[5];
872 + int arc_meta_used[5];
873 + int arc_meta_limit[5];
874 + int arc_meta_max[5];
875 + int arc_meta_min[5];
876 + int arc_need_free[5];
877 + int arc_sys_free[5];
878 + } mibs;
879 +
880 + if(unlikely(sysctlbyname("kstat.zfs.misc.arcstats.l2_size", &l2_size, &uint64_t_size, NULL, 0)))
881 + return 0;
882 +
883 + if(likely(l2_size))
884 + l2exist = 1;
885 + else
886 + l2exist = 0;
887 +
888 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.hits", mibs.hits, arcstats.hits);
889 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.misses", mibs.misses, arcstats.misses);
890 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.demand_data_hits", mibs.demand_data_hits, arcstats.demand_data_hits);
891 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.demand_data_misses", mibs.demand_data_misses, arcstats.demand_data_misses);
892 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.demand_metadata_hits", mibs.demand_metadata_hits, arcstats.demand_metadata_hits);
893 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.demand_metadata_misses", mibs.demand_metadata_misses, arcstats.demand_metadata_misses);
894 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.prefetch_data_hits", mibs.prefetch_data_hits, arcstats.prefetch_data_hits);
895 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.prefetch_data_misses", mibs.prefetch_data_misses, arcstats.prefetch_data_misses);
896 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.prefetch_metadata_hits", mibs.prefetch_metadata_hits, arcstats.prefetch_metadata_hits);
897 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.prefetch_metadata_misses", mibs.prefetch_metadata_misses, arcstats.prefetch_metadata_misses);
898 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mru_hits", mibs.mru_hits, arcstats.mru_hits);
899 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mru_ghost_hits", mibs.mru_ghost_hits, arcstats.mru_ghost_hits);
900 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mfu_hits", mibs.mfu_hits, arcstats.mfu_hits);
901 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mfu_ghost_hits", mibs.mfu_ghost_hits, arcstats.mfu_ghost_hits);
902 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.deleted", mibs.deleted, arcstats.deleted);
903 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mutex_miss", mibs.mutex_miss, arcstats.mutex_miss);
904 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.evict_skip", mibs.evict_skip, arcstats.evict_skip);
905 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.evict_not_enough", mibs.evict_not_enough, arcstats.evict_not_enough);
906 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.evict_l2_cached", mibs.evict_l2_cached, arcstats.evict_l2_cached);
907 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.evict_l2_eligible", mibs.evict_l2_eligible, arcstats.evict_l2_eligible);
908 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.evict_l2_ineligible", mibs.evict_l2_ineligible, arcstats.evict_l2_ineligible);
909 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.evict_l2_skip", mibs.evict_l2_skip, arcstats.evict_l2_skip);
910 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.hash_elements", mibs.hash_elements, arcstats.hash_elements);
911 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.hash_elements_max", mibs.hash_elements_max, arcstats.hash_elements_max);
912 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.hash_collisions", mibs.hash_collisions, arcstats.hash_collisions);
913 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.hash_chains", mibs.hash_chains, arcstats.hash_chains);
914 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.hash_chain_max", mibs.hash_chain_max, arcstats.hash_chain_max);
915 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.p", mibs.p, arcstats.p);
916 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.c", mibs.c, arcstats.c);
917 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.c_min", mibs.c_min, arcstats.c_min);
918 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.c_max", mibs.c_max, arcstats.c_max);
919 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.size", mibs.size, arcstats.size);
920 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.hdr_size", mibs.hdr_size, arcstats.hdr_size);
921 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.data_size", mibs.data_size, arcstats.data_size);
922 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.metadata_size", mibs.metadata_size, arcstats.metadata_size);
923 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.other_size", mibs.other_size, arcstats.other_size);
924 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.anon_size", mibs.anon_size, arcstats.anon_size);
925 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.anon_evictable_data", mibs.anon_evictable_data, arcstats.anon_evictable_data);
926 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.anon_evictable_metadata", mibs.anon_evictable_metadata, arcstats.anon_evictable_metadata);
927 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mru_size", mibs.mru_size, arcstats.mru_size);
928 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mru_evictable_data", mibs.mru_evictable_data, arcstats.mru_evictable_data);
929 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mru_evictable_metadata", mibs.mru_evictable_metadata, arcstats.mru_evictable_metadata);
930 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mru_ghost_size", mibs.mru_ghost_size, arcstats.mru_ghost_size);
931 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mru_ghost_evictable_data", mibs.mru_ghost_evictable_data, arcstats.mru_ghost_evictable_data);
932 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mru_ghost_evictable_metadata", mibs.mru_ghost_evictable_metadata, arcstats.mru_ghost_evictable_metadata);
933 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mfu_size", mibs.mfu_size, arcstats.mfu_size);
934 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mfu_evictable_data", mibs.mfu_evictable_data, arcstats.mfu_evictable_data);
935 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mfu_evictable_metadata", mibs.mfu_evictable_metadata, arcstats.mfu_evictable_metadata);
936 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mfu_ghost_size", mibs.mfu_ghost_size, arcstats.mfu_ghost_size);
937 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mfu_ghost_evictable_data", mibs.mfu_ghost_evictable_data, arcstats.mfu_ghost_evictable_data);
938 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.mfu_ghost_evictable_metadata", mibs.mfu_ghost_evictable_metadata, arcstats.mfu_ghost_evictable_metadata);
939 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_hits", mibs.l2_hits, arcstats.l2_hits);
940 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_misses", mibs.l2_misses, arcstats.l2_misses);
941 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_feeds", mibs.l2_feeds, arcstats.l2_feeds);
942 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_rw_clash", mibs.l2_rw_clash, arcstats.l2_rw_clash);
943 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_read_bytes", mibs.l2_read_bytes, arcstats.l2_read_bytes);
944 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_write_bytes", mibs.l2_write_bytes, arcstats.l2_write_bytes);
945 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_writes_sent", mibs.l2_writes_sent, arcstats.l2_writes_sent);
946 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_writes_done", mibs.l2_writes_done, arcstats.l2_writes_done);
947 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_writes_error", mibs.l2_writes_error, arcstats.l2_writes_error);
948 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_writes_lock_retry", mibs.l2_writes_lock_retry, arcstats.l2_writes_lock_retry);
949 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_evict_lock_retry", mibs.l2_evict_lock_retry, arcstats.l2_evict_lock_retry);
950 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_evict_reading", mibs.l2_evict_reading, arcstats.l2_evict_reading);
951 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_evict_l1cached", mibs.l2_evict_l1cached, arcstats.l2_evict_l1cached);
952 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_free_on_write", mibs.l2_free_on_write, arcstats.l2_free_on_write);
953 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_cdata_free_on_write", mibs.l2_cdata_free_on_write, arcstats.l2_cdata_free_on_write);
954 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_abort_lowmem", mibs.l2_abort_lowmem, arcstats.l2_abort_lowmem);
955 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_cksum_bad", mibs.l2_cksum_bad, arcstats.l2_cksum_bad);
956 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_io_error", mibs.l2_io_error, arcstats.l2_io_error);
957 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_size", mibs.l2_size, arcstats.l2_size);
958 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_asize", mibs.l2_asize, arcstats.l2_asize);
959 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_hdr_size", mibs.l2_hdr_size, arcstats.l2_hdr_size);
960 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_compress_successes", mibs.l2_compress_successes, arcstats.l2_compress_successes);
961 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_compress_zeros", mibs.l2_compress_zeros, arcstats.l2_compress_zeros);
962 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.l2_compress_failures", mibs.l2_compress_failures, arcstats.l2_compress_failures);
963 + GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.memory_throttle_count", mibs.memory_throttle_count, arcstats.memory_throttle_count);
964 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.duplicate_buffers", mibs.duplicate_buffers, arcstats.duplicate_buffers);
965 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.duplicate_buffers_size", mibs.duplicate_buffers_size, arcstats.duplicate_buffers_size);
966 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.duplicate_reads", mibs.duplicate_reads, arcstats.duplicate_reads);
967 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.memory_direct_count", mibs.memory_direct_count, arcstats.memory_direct_count);
968 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.memory_indirect_count", mibs.memory_indirect_count, arcstats.memory_indirect_count);
969 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.arc_no_grow", mibs.arc_no_grow, arcstats.arc_no_grow);
970 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.arc_tempreserve", mibs.arc_tempreserve, arcstats.arc_tempreserve);
971 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.arc_loaned_bytes", mibs.arc_loaned_bytes, arcstats.arc_loaned_bytes);
972 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.arc_prune", mibs.arc_prune, arcstats.arc_prune);
973 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.arc_meta_used", mibs.arc_meta_used, arcstats.arc_meta_used);
974 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.arc_meta_limit", mibs.arc_meta_limit, arcstats.arc_meta_limit);
975 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.arc_meta_max", mibs.arc_meta_max, arcstats.arc_meta_max);
976 + // not used: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.arc_meta_min", mibs.arc_meta_min, arcstats.arc_meta_min);
977 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.arc_need_free", mibs.arc_need_free, arcstats.arc_need_free);
978 + // missing mib: GETSYSCTL_SIMPLE("kstat.zfs.misc.arcstats.arc_sys_free", mibs.arc_sys_free, arcstats.arc_sys_free);
979 +
980 + generate_charts_arcstats(update_every);
981 + generate_charts_arc_summary(update_every);
982 +
983 + return 0;
984 +}
985 +
986 +#else
987 int do_proc_spl_kstat_zfs_arcstats(int update_every, usec_t dt) {
988 (void)dt;
989
@@ -908,3 +1128,4 @@ int do_proc_spl_kstat_zfs_arcstats(int update_every, usec_t dt) {
1128
1129 return 0;
1130 }
1131 +#endif /* __FreeBSD__ */