Add IPC shared memory stats to FreeBSD plugin
Vladimir Kobal committed
Dec 11, 2016 at 23:37 UTC
3cb82d49473578d2292a7b07c09910d8c8c276a1
1 file changed
+58
-1
src/freebsd_sysctl.c
+58
-1
@@ -9,6 +9,7 @@
9
// NEEDED BY: struct ipc_sem_data
10
#define _KERNEL
11
#include <sys/sem.h>
12
+#include <sys/shm.h>
13
#undef _KERNEL
14
// NEEDED BY: do_disk_io
15
#define RRD_TYPE_DISK "disk"
@@ -21,7 +22,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
22
23
static int do_cpu = -1, do_cpu_cores = -1, do_interrupts = -1, do_context = -1, do_forks = -1, do_processes = -1,
24
do_loadavg = -1, do_all_processes = -1, do_disk_io = -1, do_swap = -1, do_ram = -1, do_swapio = -1,
24
- do_pgfaults = -1, do_committed = -1, do_ipc_semaphores = -1;
25
+ do_pgfaults = -1, do_committed = -1, do_ipc_semaphores = -1, do_ipc_shared_mem = -1;
26
27
if (unlikely(do_cpu == -1)) {
28
do_cpu = config_get_boolean("plugin:freebsd:sysctl", "cpu utilization", 1);
@@ -39,6 +40,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
40
do_pgfaults = config_get_boolean("plugin:freebsd:sysctl", "memory page faults", 1);
41
do_committed = config_get_boolean("plugin:freebsd:sysctl", "committed memory", 1);
42
do_ipc_semaphores = config_get_boolean("plugin:freebsd:sysctl", "ipc semaphores", 1);
43
+ do_ipc_shared_mem = config_get_boolean("plugin:freebsd:sysctl", "ipc shared memory", 1);
44
}
45
46
RRDSET *st;
@@ -113,6 +115,13 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
115
} ipc_sem = {0, 0, 0};
116
static struct semid_kernel *ipc_sem_data = NULL;
117
118
+ // NEEDED BY: do_ipc_shared_mem
119
+ struct ipc_shm {
120
+ u_long shmmni;
121
+ collected_number segs;
122
+ collected_number segsize;
123
+ } ipc_shm = {0, 0, 0};
124
+ static struct shmid_kernel *ipc_shm_data = NULL;
125
126
// --------------------------------------------------------------------
127
@@ -728,5 +737,53 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
737
}
738
}
739
740
+ // --------------------------------------------------------------------
741
+
742
+ if (likely(do_ipc_shared_mem)) {
743
+ if (unlikely(GETSYSCTL("kern.ipc.shmmni", ipc_shm.shmmni))) {
744
+ do_ipc_shared_mem = 0;
745
+ error("DISABLED: system.ipc_shared_mem_segs");
746
+ error("DISABLED: system.ipc_shared_mem_size");
747
+ } else {
748
+ ipc_shm_data = reallocz(ipc_shm_data, sizeof(struct shmid_kernel) * ipc_shm.shmmni);
749
+ if (unlikely(getsysctl("kern.ipc.shmsegs", ipc_shm_data, sizeof(struct shmid_kernel) * ipc_shm.shmmni))) {
750
+ do_ipc_shared_mem = 0;
751
+ error("DISABLED: system.ipc_shared_mem_segs");
752
+ error("DISABLED: system.ipc_shared_mem_size");;
753
+ } else {
754
+ for (i = 0; i < ipc_shm.shmmni; i++) {
755
+ if (unlikely(ipc_shm_data[i].u.shm_perm.mode & 0x0800)) {
756
+ ipc_shm.segs += 1;
757
+ ipc_shm.segsize += ipc_shm_data[i].u.shm_segsz;
758
+ }
759
+ }
760
+
761
+ // --------------------------------------------------------------------
762
+
763
+ st = rrdset_find("system.ipc_shared_mem_segs");
764
+ if (unlikely(!st)) {
765
+ st = rrdset_create("system", "ipc_shared_mem_segs", NULL, "ipc shared memory", NULL, "IPC Shared Memory Segments", "segments", 1000, rrd_update_every, RRDSET_TYPE_AREA);
766
+ rrddim_add(st, "segments", NULL, 1, 1, RRDDIM_ABSOLUTE);
767
+ }
768
+ else rrdset_next(st);
769
+
770
+ rrddim_set(st, "segments", ipc_shm.segs);
771
+ rrdset_done(st);
772
+
773
+ // --------------------------------------------------------------------
774
+
775
+ st = rrdset_find("system.ipc_shared_mem_size");
776
+ if (unlikely(!st)) {
777
+ st = rrdset_create("system", "ipc_shared_mem_size", NULL, "ipc shared memory", NULL, "IPC Shared Memory Segments Size", "kilobytes", 1000, rrd_update_every, RRDSET_TYPE_AREA);
778
+ rrddim_add(st, "allocated", NULL, 1, 1024, RRDDIM_ABSOLUTE);
779
+ }
780
+ else rrdset_next(st);
781
+
782
+ rrddim_set(st, "allocated", ipc_shm.segsize);
783
+ rrdset_done(st);
784
+ }
785
+ }
786
+ }
787
+
788
return 0;
789
}