+ // --------------------------------------------------------------------
+
+
+ if (likely(do_swap)) {
+ mibsize = sizeof mib / sizeof mib[0];
+ if (unlikely(sysctlnametomib("vm.swap_info", mib, &mibsize) == -1)) {
+ error("FREEBSD: sysctl(%s...) failed: %s", "vm.swap_info", strerror(errno));
+ do_swap = 0;
+ error("DISABLED: disk.io");
+ } else {
+ for (i = 0; ; i++) {
+ mib[mibsize] = i;
+ size = sizeof(xsw);
+ if (unlikely(sysctl(mib, mibsize + 1, &xsw, &size, NULL, 0) == -1 )) {
+ if (unlikely(errno != ENOENT)) {
+ error("FREEBSD: sysctl(%s...) failed: %s", "vm.swap_info", strerror(errno));
+ do_swap = 0;
+ error("DISABLED: disk.io");
+ } else {
+ if (unlikely(size != sizeof(xsw))) {
+ error("FREEBSD: sysctl(%s...) expected %lu, got %lu", "vm.swap_info", (unsigned long)sizeof(xsw), (unsigned long)size);
+ do_swap = 0;
+ error("DISABLED: disk.io");
+ } else break;
+ }
+ }
+ total_xsw.bytes_used += xsw.xsw_used * system_pagesize;
+ total_xsw.bytes_total += xsw.xsw_nblks * system_pagesize;
+ }
+
+ if (likely(do_swap)) {
+ st = rrdset_find("system.swap");
+ if (unlikely(!st)) {
+ st = rrdset_create("system", "swap", NULL, "swap", NULL, "System Swap", "MB", 201, update_every, RRDSET_TYPE_STACKED);
+ st->isdetail = 1;
+
+ rrddim_add(st, "free", NULL, 1, 1048576, RRDDIM_ABSOLUTE);
+ rrddim_add(st, "used", NULL, 1, 1048576, RRDDIM_ABSOLUTE);
+ }
+ else rrdset_next(st);
+
+ rrddim_set(st, "used", total_xsw.bytes_used);
+ rrddim_set(st, "free", total_xsw.bytes_total - total_xsw.bytes_used);
+ rrdset_done(st);
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ if (likely(do_ram)) {
+ if (unlikely(GETSYSCTL("vm.stats.vm.v_active_count", vmmeter_data.v_active_count) ||
+ GETSYSCTL("vm.stats.vm.v_inactive_count", vmmeter_data.v_inactive_count) ||
+ GETSYSCTL("vm.stats.vm.v_wire_count", vmmeter_data.v_wire_count) ||
+ GETSYSCTL("vm.stats.vm.v_cache_count", vmmeter_data.v_cache_count) ||
+ GETSYSCTL("vfs.bufspace", vfs_bufspace_count) ||
+ GETSYSCTL("vm.stats.vm.v_free_count", vmmeter_data.v_free_count))) {
+ do_swapio = 0;
+ error("DISABLED: system.swapio");
+ } else {
+ st = rrdset_find("system.ram");
+ if (unlikely(!st)) {
+ st = rrdset_create("system", "ram", NULL, "ram", NULL, "System RAM", "MB", 200, update_every, RRDSET_TYPE_STACKED);
+
+ rrddim_add(st, "active", NULL, system_pagesize, 1024, RRDDIM_ABSOLUTE);
+ rrddim_add(st, "inactive", NULL, system_pagesize, 1024, RRDDIM_ABSOLUTE);
+ rrddim_add(st, "wired", NULL, system_pagesize, 1024, RRDDIM_ABSOLUTE);
+ rrddim_add(st, "cache", NULL, system_pagesize, 1024, RRDDIM_ABSOLUTE);
+ rrddim_add(st, "buffers", NULL, 1, 1024, RRDDIM_ABSOLUTE);
+ rrddim_add(st, "free", NULL, system_pagesize, 1024, RRDDIM_ABSOLUTE);
+ }
+ else rrdset_next(st);
+
+ rrddim_set(st, "active", vmmeter_data.v_active_count);
+ rrddim_set(st, "inactive", vmmeter_data.v_inactive_count);
+ rrddim_set(st, "wired", vmmeter_data.v_wire_count);
+ rrddim_set(st, "cache", vmmeter_data.v_cache_count);
+ rrddim_set(st, "buffers", vfs_bufspace_count);
+ rrddim_set(st, "free", vmmeter_data.v_free_count);
+ rrdset_done(st);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ if (likely(do_swapio)) {
+ if (unlikely(GETSYSCTL("vm.stats.vm.v_swappgsin", vmmeter_data.v_swappgsin) || GETSYSCTL("vm.stats.vm.v_vnodepgsout", vmmeter_data.v_swappgsout))) {
+ do_swapio = 0;
+ error("DISABLED: system.swapio");
+ } else {
+ st = rrdset_find("system.swapio");
+ if (unlikely(!st)) {
+ st = rrdset_create("system", "swapio", NULL, "swap", NULL, "Swap I/O", "kilobytes/s", 250, update_every, RRDSET_TYPE_AREA);
+
+ rrddim_add(st, "in", NULL, system_pagesize, 1024, RRDDIM_INCREMENTAL);
+ rrddim_add(st, "out", NULL, -system_pagesize, 1024, RRDDIM_INCREMENTAL);
+ }
+ else rrdset_next(st);
+
+ rrddim_set(st, "in", vmmeter_data.v_swappgsin);
+ rrddim_set(st, "out", vmmeter_data.v_swappgsout);
+ rrdset_done(st);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ if (likely(do_pgfaults)) {
+ if (unlikely(GETSYSCTL("vm.stats.vm.v_vm_faults", vmmeter_data.v_vm_faults) ||
+ GETSYSCTL("vm.stats.vm.v_io_faults", vmmeter_data.v_io_faults) ||
+ GETSYSCTL("vm.stats.vm.v_cow_faults", vmmeter_data.v_cow_faults) ||
+ GETSYSCTL("vm.stats.vm.v_cow_optim", vmmeter_data.v_cow_optim) ||
+ GETSYSCTL("vm.stats.vm.v_intrans", vmmeter_data.v_intrans))) {
+ do_pgfaults = 0;
+ error("DISABLED: mem.pgfaults");
+ } else {
+ st = rrdset_find("mem.pgfaults");
+ if (unlikely(!st)) {
+ st = rrdset_create("mem", "pgfaults", NULL, "system", NULL, "Memory Page Faults", "page faults/s", 500, update_every, RRDSET_TYPE_LINE);
+ st->isdetail = 1;
+
+ rrddim_add(st, "memory", NULL, 1, 1, RRDDIM_INCREMENTAL);
+ rrddim_add(st, "io_requiring", NULL, 1, 1, RRDDIM_INCREMENTAL);
+ rrddim_add(st, "cow", NULL, 1, 1, RRDDIM_INCREMENTAL);
+ rrddim_add(st, "cow_optimized", NULL, 1, 1, RRDDIM_INCREMENTAL);
+ rrddim_add(st, "in_transit", NULL, 1, 1, RRDDIM_INCREMENTAL);
+ }
+ else rrdset_next(st);
+
+ rrddim_set(st, "memory", vmmeter_data.v_vm_faults);
+ rrddim_set(st, "io_requiring", vmmeter_data.v_io_faults);
+ rrddim_set(st, "cow", vmmeter_data.v_cow_faults);
+ rrddim_set(st, "cow_optimized", vmmeter_data.v_cow_optim);
+ rrddim_set(st, "in_transit", vmmeter_data.v_intrans);
+ rrdset_done(st);
+ }
+ }
+