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__ */