Add IPC semaphores stats to FreeBSD plugin
Vladimir Kobal committed
Dec 11, 2016 at 22:31 UTC
0bf65774114ea128022c3b804678f822df2d7f83
1 file changed
+63
-1
src/freebsd_sysctl.c
+63
-1
@@ -6,6 +6,10 @@
6
#include <sys/devicestat.h>
7
// NEEDED BY: struct xswdev
8
#include <vm/vm_param.h>
9
+// NEEDED BY: struct ipc_sem_data
10
+#define _KERNEL
11
+#include <sys/sem.h>
12
+#undef _KERNEL
13
// NEEDED BY: do_disk_io
14
#define RRD_TYPE_DISK "disk"
15
@@ -17,7 +21,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
21
22
static int do_cpu = -1, do_cpu_cores = -1, do_interrupts = -1, do_context = -1, do_forks = -1, do_processes = -1,
23
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;
24
+ do_pgfaults = -1, do_committed = -1, do_ipc_semaphores = -1;
25
26
if (unlikely(do_cpu == -1)) {
27
do_cpu = config_get_boolean("plugin:freebsd:sysctl", "cpu utilization", 1);
@@ -34,6 +38,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
38
do_swapio = config_get_boolean("plugin:freebsd:sysctl", "swap i/o", 1);
39
do_pgfaults = config_get_boolean("plugin:freebsd:sysctl", "memory page faults", 1);
40
do_committed = config_get_boolean("plugin:freebsd:sysctl", "committed memory", 1);
41
+ do_ipc_semaphores = config_get_boolean("plugin:freebsd:sysctl", "ipc semaphores", 1);
42
}
43
44
RRDSET *st;
@@ -100,6 +105,15 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
105
// NEEDED BY: do_ram
106
int vfs_bufspace_count;
107
108
+ // NEEDED BY: do_ipc_semaphores
109
+ struct ipc_sem {
110
+ int semmni;
111
+ collected_number sets;
112
+ collected_number semaphores;
113
+ } ipc_sem = {0, 0, 0};
114
+ static struct semid_kernel *ipc_sem_data = NULL;
115
+
116
+
117
// --------------------------------------------------------------------
118
119
if (last_loadavg_usec <= dt) {
@@ -666,5 +680,53 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
680
}
681
}
682
683
+ // --------------------------------------------------------------------
684
+
685
+ if (likely(do_ipc_semaphores)) {
686
+ if (unlikely(GETSYSCTL("kern.ipc.semmni", ipc_sem.semmni))) {
687
+ do_ipc_semaphores = 0;
688
+ error("DISABLED: system.ipc_semaphores");
689
+ error("DISABLED: system.ipc_semaphore_arrays");
690
+ } else {
691
+ ipc_sem_data = reallocz(ipc_sem_data, sizeof(struct semid_kernel) * ipc_sem.semmni);
692
+ if (unlikely(getsysctl("kern.ipc.sema", ipc_sem_data, sizeof(struct semid_kernel) * ipc_sem.semmni))) {
693
+ do_ipc_semaphores = 0;
694
+ error("DISABLED: system.ipc_semaphores");
695
+ error("DISABLED: system.ipc_semaphore_arrays");;
696
+ } else {
697
+ for (i = 0; i < ipc_sem.semmni; i++) {
698
+ if (unlikely(ipc_sem_data[i].u.sem_perm.mode & SEM_ALLOC)) {
699
+ ipc_sem.sets += 1;
700
+ ipc_sem.semaphores += ipc_sem_data[i].u.sem_nsems;
701
+ }
702
+ }
703
+
704
+ // --------------------------------------------------------------------
705
+
706
+ st = rrdset_find("system.ipc_semaphores");
707
+ if (unlikely(!st)) {
708
+ st = rrdset_create("system", "ipc_semaphores", NULL, "ipc semaphores", NULL, "IPC Semaphores", "semaphores", 1000, rrd_update_every, RRDSET_TYPE_AREA);
709
+ rrddim_add(st, "semaphores", NULL, 1, 1, RRDDIM_ABSOLUTE);
710
+ }
711
+ else rrdset_next(st);
712
+
713
+ rrddim_set(st, "semaphores", ipc_sem.semaphores);
714
+ rrdset_done(st);
715
+
716
+ // --------------------------------------------------------------------
717
+
718
+ st = rrdset_find("system.ipc_semaphore_arrays");
719
+ if (unlikely(!st)) {
720
+ st = rrdset_create("system", "ipc_semaphore_arrays", NULL, "ipc semaphores", NULL, "IPC Semaphore Arrays", "arrays", 1000, rrd_update_every, RRDSET_TYPE_AREA);
721
+ rrddim_add(st, "arrays", NULL, 1, 1, RRDDIM_ABSOLUTE);
722
+ }
723
+ else rrdset_next(st);
724
+
725
+ rrddim_set(st, "arrays", ipc_sem.sets);
726
+ rrdset_done(st);
727
+ }
728
+ }
729
+ }
730
+
731
return 0;
732
}