@cryptotaxi247 / netdata-1 / commits / ec611d314

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"'