Add swap and memory charts to FreeBSD plugin
Vladimir Kobal committed
Dec 10, 2016 at 22:15 UTC
ec611d3144317a45f6310c15c9d977fcf8260edd
2 files changed
+185
-24
src/freebsd_sysctl.c
+184
-23
@@ -1,9 +1,11 @@
1
#include "common.h"
2
3
-// NEEDED BY: struct vmstat
3
+// NEEDED BY: struct vmtotal, struct vmmeter
4
#include <sys/vmmeter.h>
5
// NEEDED BY: struct devstat
6
#include <sys/devicestat.h>
7
+// NEEDED BY: struct xswdev
8
+#include <vm/vm_param.h>
9
// NEEDED BY: do_disk_io
10
#define RRD_TYPE_DISK "disk"
11
@@ -14,7 +16,8 @@ int do_freebsd_sysctl(int update_every, unsigned long long dt) {
16
(void)dt;
17
18
static int do_cpu = -1, do_cpu_cores = -1, do_interrupts = -1, do_context = -1, do_forks = -1, do_processes = -1,
17
- do_loadavg = -1, do_all_processes = -1, do_disk_io = -1;
19
+ do_loadavg = -1, do_all_processes = -1, do_disk_io = -1, do_swap = -1, do_ram = -1, do_swapio = -1,
20
+ do_pgfaults = -1, do_committed = -1;
21
22
if (unlikely(do_cpu == -1)) {
23
do_cpu = config_get_boolean("plugin:freebsd:sysctl", "cpu utilization", 1);
@@ -25,12 +28,17 @@ int do_freebsd_sysctl(int update_every, unsigned long long dt) {
28
do_processes = config_get_boolean("plugin:freebsd:sysctl", "processes running", 1);
29
do_loadavg = config_get_boolean("plugin:freebsd:sysctl", "enable load average", 1);
30
do_all_processes = config_get_boolean("plugin:freebsd:sysctl", "enable total processes", 1);
28
-
31
do_disk_io = config_get_boolean("plugin:freebsd:sysctl", "stats for all disks", 1);
32
+ do_swap = config_get_boolean("plugin:freebsd:sysctl", "system swap", 1);
33
+ do_ram = config_get_boolean("plugin:freebsd:sysctl", "system ram", 1);
34
+ do_swapio = config_get_boolean("plugin:freebsd:sysctl", "swap i/o", 1);
35
+ do_pgfaults = config_get_boolean("plugin:freebsd:sysctl", "memory page faults", 1);
36
+ do_committed = config_get_boolean("plugin:freebsd:sysctl", "committed memory", 1);
37
}
38
39
RRDSET *st;
40
41
+ int system_pagesize = getpagesize(); // wouldn't it be better to get value directly from hw.pagesize?
42
int i;
43
44
// NEEDED BY: do_loadavg
@@ -77,6 +85,21 @@ int do_freebsd_sysctl(int update_every, unsigned long long dt) {
85
collected_number busy_time_ms;
86
} prev_dstat;
87
88
+ // NEEDED BY: do_swap
89
+ size_t mibsize, size;
90
+ int mib[3]; // CTL_MAXNAME = 24 maximum mib components (sysctl.h)
91
+ struct xswdev xsw;
92
+ struct total_xsw {
93
+ collected_number bytes_used;
94
+ collected_number bytes_total;
95
+ } total_xsw = {0, 0};
96
+
97
+ // NEEDED BY: do_swapio, do_ram
98
+ struct vmmeter vmmeter_data;
99
+
100
+ // NEEDED BY: do_ram
101
+ int vfs_bufspace_count;
102
+
103
// --------------------------------------------------------------------
104
105
if (last_loadavg_usec <= dt) {
@@ -108,14 +131,16 @@ int do_freebsd_sysctl(int update_every, unsigned long long dt) {
131
132
// --------------------------------------------------------------------
133
111
- if (likely(do_all_processes | do_processes)) {
134
+ if (likely(do_all_processes | do_processes | do_committed)) {
135
if (unlikely(GETSYSCTL("vm.vmtotal", vmtotal_data))) {
136
do_all_processes = 0;
137
error("DISABLED: system.active_processes");
138
do_processes = 0;
139
error("DISABLED: system.processes");
140
+ do_committed = 0;
141
+ error("DISABLED: mem.committed");
142
} else {
118
- if (likely(do_processes)) {
143
+ if (likely(do_all_processes)) {
144
145
st = rrdset_find_bytype("system", "active_processes");
146
if (unlikely(!st)) {
@@ -127,6 +152,9 @@ int do_freebsd_sysctl(int update_every, unsigned long long dt) {
152
rrddim_set(st, "active", (vmtotal_data.t_rq + vmtotal_data.t_dw + vmtotal_data.t_pw + vmtotal_data.t_sl + vmtotal_data.t_sw));
153
rrdset_done(st);
154
}
155
+
156
+ // --------------------------------------------------------------------
157
+
158
if (likely(do_processes)) {
159
160
st = rrdset_find_bytype("system", "processes");
@@ -143,26 +171,23 @@ int do_freebsd_sysctl(int update_every, unsigned long long dt) {
171
rrdset_done(st);
172
}
173
146
- }
147
- }
148
-
149
- // --------------------------------------------------------------------
174
+ // --------------------------------------------------------------------
175
151
- if (likely(do_processes)) {
176
+ if (likely(do_committed)) {
177
+ st = rrdset_find("mem.committed");
178
+ if (unlikely(!st)) {
179
+ st = rrdset_create("mem", "committed", NULL, "system", NULL, "Committed (Allocated) Memory", "MB", 5000, update_every, RRDSET_TYPE_AREA);
180
+ st->isdetail = 1;
181
153
- st = rrdset_find_bytype("system", "processes");
154
- if (unlikely(!st)) {
155
- st = rrdset_create("system", "processes", NULL, "processes", NULL, "System Processes", "processes", 600, update_every, RRDSET_TYPE_LINE);
182
+ rrddim_add(st, "Committed_AS", NULL, system_pagesize, 1024, RRDDIM_ABSOLUTE);
183
+ }
184
+ else rrdset_next(st);
185
157
- rrddim_add(st, "running", NULL, 1, 1, RRDDIM_ABSOLUTE);
158
- rrddim_add(st, "blocked", NULL, -1, 1, RRDDIM_ABSOLUTE);
186
+ rrddim_set(st, "Committed_AS", vmtotal_data.t_rm);
187
+ rrdset_done(st);
188
}
160
- else rrdset_next(st);
161
-
162
- rrddim_set(st, "running", vmtotal_data.t_rq);
163
- rrddim_set(st, "blocked", (vmtotal_data.t_dw + vmtotal_data.t_pw));
164
- rrdset_done(st);
189
}
190
+ }
191
192
// --------------------------------------------------------------------
193
@@ -339,7 +364,7 @@ int do_freebsd_sysctl(int update_every, unsigned long long dt) {
364
do_disk_io = 0;
365
error("DISABLED: disk.io");
366
} else {
342
- dstat = devstat_data +sizeof(long); // skip generation number
367
+ dstat = devstat_data + sizeof(long); // skip generation number
368
collected_number total_disk_reads = 0;
369
collected_number total_disk_writes = 0;
370
@@ -482,9 +507,7 @@ int do_freebsd_sysctl(int update_every, unsigned long long dt) {
507
rrddim_set(st, "svctm", ((dstat[i].operations[DEVSTAT_READ] - prev_dstat.operations_read) + (dstat[i].operations[DEVSTAT_WRITE] - prev_dstat.operations_write)) ?
508
(cur_dstat.busy_time_ms - prev_dstat.busy_time_ms) / ((dstat[i].operations[DEVSTAT_READ] - prev_dstat.operations_read) + (dstat[i].operations[DEVSTAT_WRITE] - prev_dstat.operations_write)) : 0);
509
rrdset_done(st);
485
-
510
}
487
-
511
}
512
513
// --------------------------------------------------------------------
@@ -505,5 +528,143 @@ int do_freebsd_sysctl(int update_every, unsigned long long dt) {
528
}
529
}
530
531
+ // --------------------------------------------------------------------
532
+
533
+
534
+ if (likely(do_swap)) {
535
+ mibsize = sizeof mib / sizeof mib[0];
536
+ if (unlikely(sysctlnametomib("vm.swap_info", mib, &mibsize) == -1)) {
537
+ error("FREEBSD: sysctl(%s...) failed: %s", "vm.swap_info", strerror(errno));
538
+ do_swap = 0;
539
+ error("DISABLED: disk.io");
540
+ } else {
541
+ for (i = 0; ; i++) {
542
+ mib[mibsize] = i;
543
+ size = sizeof(xsw);
544
+ if (unlikely(sysctl(mib, mibsize + 1, &xsw, &size, NULL, 0) == -1 )) {
545
+ if (unlikely(errno != ENOENT)) {
546
+ error("FREEBSD: sysctl(%s...) failed: %s", "vm.swap_info", strerror(errno));
547
+ do_swap = 0;
548
+ error("DISABLED: disk.io");
549
+ } else {
550
+ if (unlikely(size != sizeof(xsw))) {
551
+ error("FREEBSD: sysctl(%s...) expected %lu, got %lu", "vm.swap_info", (unsigned long)sizeof(xsw), (unsigned long)size);
552
+ do_swap = 0;
553
+ error("DISABLED: disk.io");
554
+ } else break;
555
+ }
556
+ }
557
+ total_xsw.bytes_used += xsw.xsw_used * system_pagesize;
558
+ total_xsw.bytes_total += xsw.xsw_nblks * system_pagesize;
559
+ }
560
+
561
+ if (likely(do_swap)) {
562
+ st = rrdset_find("system.swap");
563
+ if (unlikely(!st)) {
564
+ st = rrdset_create("system", "swap", NULL, "swap", NULL, "System Swap", "MB", 201, update_every, RRDSET_TYPE_STACKED);
565
+ st->isdetail = 1;
566
+
567
+ rrddim_add(st, "free", NULL, 1, 1048576, RRDDIM_ABSOLUTE);
568
+ rrddim_add(st, "used", NULL, 1, 1048576, RRDDIM_ABSOLUTE);
569
+ }
570
+ else rrdset_next(st);
571
+
572
+ rrddim_set(st, "used", total_xsw.bytes_used);
573
+ rrddim_set(st, "free", total_xsw.bytes_total - total_xsw.bytes_used);
574
+ rrdset_done(st);
575
+ }
576
+ }
577
+ }
578
+
579
+ // --------------------------------------------------------------------
580
+
581
+ if (likely(do_ram)) {
582
+ if (unlikely(GETSYSCTL("vm.stats.vm.v_active_count", vmmeter_data.v_active_count) ||
583
+ GETSYSCTL("vm.stats.vm.v_inactive_count", vmmeter_data.v_inactive_count) ||
584
+ GETSYSCTL("vm.stats.vm.v_wire_count", vmmeter_data.v_wire_count) ||
585
+ GETSYSCTL("vm.stats.vm.v_cache_count", vmmeter_data.v_cache_count) ||
586
+ GETSYSCTL("vfs.bufspace", vfs_bufspace_count) ||
587
+ GETSYSCTL("vm.stats.vm.v_free_count", vmmeter_data.v_free_count))) {
588
+ do_swapio = 0;
589
+ error("DISABLED: system.swapio");
590
+ } else {
591
+ st = rrdset_find("system.ram");
592
+ if (unlikely(!st)) {
593
+ st = rrdset_create("system", "ram", NULL, "ram", NULL, "System RAM", "MB", 200, update_every, RRDSET_TYPE_STACKED);
594
+
595
+ rrddim_add(st, "active", NULL, system_pagesize, 1024, RRDDIM_ABSOLUTE);
596
+ rrddim_add(st, "inactive", NULL, system_pagesize, 1024, RRDDIM_ABSOLUTE);
597
+ rrddim_add(st, "wired", NULL, system_pagesize, 1024, RRDDIM_ABSOLUTE);
598
+ rrddim_add(st, "cache", NULL, system_pagesize, 1024, RRDDIM_ABSOLUTE);
599
+ rrddim_add(st, "buffers", NULL, 1, 1024, RRDDIM_ABSOLUTE);
600
+ rrddim_add(st, "free", NULL, system_pagesize, 1024, RRDDIM_ABSOLUTE);
601
+ }
602
+ else rrdset_next(st);
603
+
604
+ rrddim_set(st, "active", vmmeter_data.v_active_count);
605
+ rrddim_set(st, "inactive", vmmeter_data.v_inactive_count);
606
+ rrddim_set(st, "wired", vmmeter_data.v_wire_count);
607
+ rrddim_set(st, "cache", vmmeter_data.v_cache_count);
608
+ rrddim_set(st, "buffers", vfs_bufspace_count);
609
+ rrddim_set(st, "free", vmmeter_data.v_free_count);
610
+ rrdset_done(st);
611
+ }
612
+ }
613
+
614
+ // --------------------------------------------------------------------
615
+
616
+ if (likely(do_swapio)) {
617
+ if (unlikely(GETSYSCTL("vm.stats.vm.v_swappgsin", vmmeter_data.v_swappgsin) || GETSYSCTL("vm.stats.vm.v_vnodepgsout", vmmeter_data.v_swappgsout))) {
618
+ do_swapio = 0;
619
+ error("DISABLED: system.swapio");
620
+ } else {
621
+ st = rrdset_find("system.swapio");
622
+ if (unlikely(!st)) {
623
+ st = rrdset_create("system", "swapio", NULL, "swap", NULL, "Swap I/O", "kilobytes/s", 250, update_every, RRDSET_TYPE_AREA);
624
+
625
+ rrddim_add(st, "in", NULL, system_pagesize, 1024, RRDDIM_INCREMENTAL);
626
+ rrddim_add(st, "out", NULL, -system_pagesize, 1024, RRDDIM_INCREMENTAL);
627
+ }
628
+ else rrdset_next(st);
629
+
630
+ rrddim_set(st, "in", vmmeter_data.v_swappgsin);
631
+ rrddim_set(st, "out", vmmeter_data.v_swappgsout);
632
+ rrdset_done(st);
633
+ }
634
+ }
635
+
636
+ // --------------------------------------------------------------------
637
+
638
+ if (likely(do_pgfaults)) {
639
+ if (unlikely(GETSYSCTL("vm.stats.vm.v_vm_faults", vmmeter_data.v_vm_faults) ||
640
+ GETSYSCTL("vm.stats.vm.v_io_faults", vmmeter_data.v_io_faults) ||
641
+ GETSYSCTL("vm.stats.vm.v_cow_faults", vmmeter_data.v_cow_faults) ||
642
+ GETSYSCTL("vm.stats.vm.v_cow_optim", vmmeter_data.v_cow_optim) ||
643
+ GETSYSCTL("vm.stats.vm.v_intrans", vmmeter_data.v_intrans))) {
644
+ do_pgfaults = 0;
645
+ error("DISABLED: mem.pgfaults");
646
+ } else {
647
+ st = rrdset_find("mem.pgfaults");
648
+ if (unlikely(!st)) {
649
+ st = rrdset_create("mem", "pgfaults", NULL, "system", NULL, "Memory Page Faults", "page faults/s", 500, update_every, RRDSET_TYPE_LINE);
650
+ st->isdetail = 1;
651
+
652
+ rrddim_add(st, "memory", NULL, 1, 1, RRDDIM_INCREMENTAL);
653
+ rrddim_add(st, "io_requiring", NULL, 1, 1, RRDDIM_INCREMENTAL);
654
+ rrddim_add(st, "cow", NULL, 1, 1, RRDDIM_INCREMENTAL);
655
+ rrddim_add(st, "cow_optimized", NULL, 1, 1, RRDDIM_INCREMENTAL);
656
+ rrddim_add(st, "in_transit", NULL, 1, 1, RRDDIM_INCREMENTAL);
657
+ }
658
+ else rrdset_next(st);
659
+
660
+ rrddim_set(st, "memory", vmmeter_data.v_vm_faults);
661
+ rrddim_set(st, "io_requiring", vmmeter_data.v_io_faults);
662
+ rrddim_set(st, "cow", vmmeter_data.v_cow_faults);
663
+ rrddim_set(st, "cow_optimized", vmmeter_data.v_cow_optim);
664
+ rrddim_set(st, "in_transit", vmmeter_data.v_intrans);
665
+ rrdset_done(st);
666
+ }
667
+ }
668
+
669
return 0;
670
}
web/index.html
+1
-1
@@ -1211,7 +1211,7 @@
1211
1212
if(typeof charts['system.ram'] !== 'undefined')
1213
head += '<div style="margin-right: 10px;" data-netdata="system.ram"'
1214
- + ' data-dimensions="used|buffers"'
1214
+ + ' data-dimensions="used|buffers|active|wired"' // active and wired are FreeBSD stats
1215
+ ' data-append-options="percentage"'
1216
+ ' data-chart-library="easypiechart"'
1217
+ ' data-title="Used RAM"'