From 6d80efc0fab95178dc35a1eae75286696fd8015f Mon Sep 17 00:00:00 2001 From: Vladimir Kobal Date: Thu, 9 Mar 2017 19:09:47 +0200 Subject: [PATCH] Separate kern.ipc.msq module --- src/freebsd_sysctl.c | 198 ++++++++++++++++++++++++++----------------- src/plugin_freebsd.c | 1 + src/plugin_freebsd.h | 1 + 3 files changed, 120 insertions(+), 80 deletions(-) diff --git a/src/freebsd_sysctl.c b/src/freebsd_sysctl.c index c82cfa97..e85433cd 100644 --- a/src/freebsd_sysctl.c +++ b/src/freebsd_sysctl.c @@ -1070,12 +1070,129 @@ int do_kern_ipc_shm(int update_every, usec_t dt) { return 0; } +// -------------------------------------------------------------------------------------------------------------------- +// kern.ipc.msq + +int do_kern_ipc_msq(int update_every, usec_t dt) { + static int mib_msgmni[3] = {0, 0, 0}, mib_msqids[3] = {0, 0, 0}; + struct ipc_msq { + int msgmni; + collected_number queues; + collected_number messages; + collected_number usedsize; + collected_number allocsize; + } ipc_msq = {0, 0, 0, 0, 0}; + + if (unlikely(GETSYSCTL_SIMPLE("kern.ipc.msgmni", mib_msgmni, ipc_msq.msgmni))) { + error("DISABLED: system.ipc_msq_queues chart"); + error("DISABLED: system.ipc_msq_messages chart"); + error("DISABLED: system.ipc_msq_size chart"); + error("DISABLED: kern.ipc.msg module"); + return 1; + } else { + static struct msqid_kernel *ipc_msq_data = NULL; + + ipc_msq_data = reallocz(ipc_msq_data, sizeof(struct msqid_kernel) * ipc_msq.msgmni); + if (unlikely( + GETSYSCTL_WSIZE("kern.ipc.msqids", mib_msqids, ipc_msq_data, sizeof(struct msqid_kernel) * ipc_msq.msgmni))) { + error("DISABLED: system.ipc_msq_queues chart"); + error("DISABLED: system.ipc_msq_messages chart"); + error("DISABLED: system.ipc_msq_size chart"); + error("DISABLED: kern.ipc.msg module"); + return 1; + } else { + int i; + + for (i = 0; i < ipc_msq.msgmni; i++) { + if (unlikely(ipc_msq_data[i].u.msg_qbytes != 0)) { + ipc_msq.queues += 1; + ipc_msq.messages += ipc_msq_data[i].u.msg_qnum; + ipc_msq.usedsize += ipc_msq_data[i].u.msg_cbytes; + ipc_msq.allocsize += ipc_msq_data[i].u.msg_qbytes; + } + } + + // -------------------------------------------------------------------- + + static RRDSET *st_queues = NULL, *st_messages = NULL, *st_size = NULL; + static RRDDIM *rd_queues = NULL, *rd_messages = NULL, *rd_allocated = NULL, *rd_used = NULL; + + if (unlikely(!st_queues)) { + st_queues = rrdset_create_localhost("system", + "ipc_msq_queues", + NULL, + "ipc message queues", + NULL, + "Number of IPC Message Queues", + "queues", + 990, + localhost->rrd_update_every, + RRDSET_TYPE_AREA + ); + + rd_queues = rrddim_add(st_queues, "queues", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); + } + else rrdset_next(st_queues); + + rrddim_set_by_pointer(st_queues, rd_queues, ipc_msq.queues); + rrdset_done(st_queues); + + // -------------------------------------------------------------------- + + if (unlikely(!st_messages)) { + st_messages = rrdset_create_localhost("system", + "ipc_msq_messages", + NULL, + "ipc message queues", + NULL, + "Number of Messages in IPC Message Queues", + "messages", + 1000, + localhost->rrd_update_every, + RRDSET_TYPE_AREA + ); + + rd_messages = rrddim_add(st_messages, "messages", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); + } + else rrdset_next(st_messages); + + rrddim_set_by_pointer(st_messages, rd_messages, ipc_msq.messages); + rrdset_done(st_messages); + + // -------------------------------------------------------------------- + + if (unlikely(!st_size)) { + st_size = rrdset_create_localhost("system", + "ipc_msq_size", + NULL, + "ipc message queues", + NULL, + "Size of IPC Message Queues", + "bytes", + 1100, + localhost->rrd_update_every, + RRDSET_TYPE_LINE + ); + + rd_allocated = rrddim_add(st_size, "allocated", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); + rd_used = rrddim_add(st_size, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); + } + else rrdset_next(st_size); + + rrddim_set_by_pointer(st_size, rd_allocated, ipc_msq.allocsize); + rrddim_set_by_pointer(st_size, rd_used, ipc_msq.usedsize); + rrdset_done(st_size); + } + } + + return 0; +} + // -------------------------------------------------------------------------------------------------------------------- // old sources int do_freebsd_sysctl_old(int update_every, usec_t dt) { static int do_disk_io = -1, - do_ipc_msg_queues = -1, do_netisr = -1, do_netisr_per_core = -1, do_bandwidth = -1, do_tcp_sockets = -1, do_tcp_packets = -1, do_tcp_errors = -1, do_tcp_handshake = -1, do_ecn = -1, do_tcpext_syscookies = -1, do_tcpext_ofo = -1, do_tcpext_connaborts = -1, @@ -1087,7 +1204,6 @@ int do_freebsd_sysctl_old(int update_every, usec_t dt) { if (unlikely(do_uptime == -1)) { do_disk_io = config_get_boolean("plugin:freebsd:sysctl", "stats for all disks", 1); - do_ipc_msg_queues = config_get_boolean("plugin:freebsd:sysctl", "ipc message queues", 1); do_netisr = config_get_boolean("plugin:freebsd:sysctl", "netisr", 1); do_netisr_per_core = config_get_boolean("plugin:freebsd:sysctl", "netisr per core", 1); do_bandwidth = config_get_boolean("plugin:freebsd:sysctl", "bandwidth", 1); @@ -1155,16 +1271,6 @@ int do_freebsd_sysctl_old(int update_every, usec_t dt) { collected_number busy_time_ms; } prev_dstat; - // NEEDED BY: do_ipc_msg_queues - struct ipc_msq { - int msgmni; - collected_number queues; - collected_number messages; - collected_number usedsize; - collected_number allocsize; - } ipc_msq = {0, 0, 0, 0, 0}; - static struct msqid_kernel *ipc_msq_data = NULL; - // NEEDED BY: do_netisr, do_netisr_per_core size_t netisr_workstream_size; size_t netisr_work_size; @@ -1402,74 +1508,6 @@ int do_freebsd_sysctl_old(int update_every, usec_t dt) { // -------------------------------------------------------------------- - if (likely(do_ipc_msg_queues)) { - if (unlikely(GETSYSCTL_BY_NAME("kern.ipc.msgmni", ipc_msq.msgmni))) { - do_ipc_msg_queues = 0; - error("DISABLED: system.ipc_msq_queues"); - error("DISABLED: system.ipc_msq_messages"); - error("DISABLED: system.ipc_msq_size"); - } else { - ipc_msq_data = reallocz(ipc_msq_data, sizeof(struct msqid_kernel) * ipc_msq.msgmni); - if (unlikely( - getsysctl_by_name("kern.ipc.msqids", ipc_msq_data, sizeof(struct msqid_kernel) * ipc_msq.msgmni))) { - do_ipc_msg_queues = 0; - error("DISABLED: system.ipc_msq_queues"); - error("DISABLED: system.ipc_msq_messages"); - error("DISABLED: system.ipc_msq_size"); - } else { - for (i = 0; i < ipc_msq.msgmni; i++) { - if (unlikely(ipc_msq_data[i].u.msg_qbytes != 0)) { - ipc_msq.queues += 1; - ipc_msq.messages += ipc_msq_data[i].u.msg_qnum; - ipc_msq.usedsize += ipc_msq_data[i].u.msg_cbytes; - ipc_msq.allocsize += ipc_msq_data[i].u.msg_qbytes; - } - } - - // -------------------------------------------------------------------- - - st = rrdset_find_localhost("system.ipc_msq_queues"); - if (unlikely(!st)) { - st = rrdset_create_localhost("system", "ipc_msq_queues", NULL, "ipc message queues", NULL, "Number of IPC Message Queues", "queues", 990, localhost->rrd_update_every, RRDSET_TYPE_AREA); - rrddim_add(st, "queues", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - } - else rrdset_next(st); - - rrddim_set(st, "queues", ipc_msq.queues); - rrdset_done(st); - - // -------------------------------------------------------------------- - - st = rrdset_find_localhost("system.ipc_msq_messages"); - if (unlikely(!st)) { - st = rrdset_create_localhost("system", "ipc_msq_messages", NULL, "ipc message queues", NULL, "Number of Messages in IPC Message Queues", "messages", 1000, localhost->rrd_update_every, RRDSET_TYPE_AREA); - rrddim_add(st, "messages", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - } - else rrdset_next(st); - - rrddim_set(st, "messages", ipc_msq.messages); - rrdset_done(st); - - // -------------------------------------------------------------------- - - st = rrdset_find_localhost("system.ipc_msq_size"); - if (unlikely(!st)) { - st = rrdset_create_localhost("system", "ipc_msq_size", NULL, "ipc message queues", NULL, "Size of IPC Message Queues", "bytes", 1100, localhost->rrd_update_every, RRDSET_TYPE_LINE); - rrddim_add(st, "allocated", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - rrddim_add(st, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - } - else rrdset_next(st); - - rrddim_set(st, "allocated", ipc_msq.allocsize); - rrddim_set(st, "used", ipc_msq.usedsize); - rrdset_done(st); - - } - } - } - - // -------------------------------------------------------------------- - if (likely(do_netisr || do_netisr_per_core)) { if (unlikely(GETSYSCTL_BY_NAME("kern.smp.cpus", ncpus))) { common_error = 1; diff --git a/src/plugin_freebsd.c b/src/plugin_freebsd.c index 78e223f2..bc2adbdf 100644 --- a/src/plugin_freebsd.c +++ b/src/plugin_freebsd.c @@ -29,6 +29,7 @@ static struct freebsd_module { { .name = "vm.stats.vm.v_swappgs", .dim = "swap_io", .enabled = 1, .func = do_vm_stats_sys_v_swappgs }, { .name = "kern.ipc.sem", .dim = "semaphores", .enabled = 1, .func = do_kern_ipc_sem }, { .name = "kern.ipc.shm", .dim = "shared_memory", .enabled = 1, .func = do_kern_ipc_shm }, + { .name = "kern.ipc.msq", .dim = "message_queues", .enabled = 1, .func = do_kern_ipc_msq }, // CPU metrics { .name = "kern.cp_times", .dim = "cp_times", .enabled = 1, .func = do_kern_cp_times }, diff --git a/src/plugin_freebsd.h b/src/plugin_freebsd.h index d9a8bd2c..77e24a43 100644 --- a/src/plugin_freebsd.h +++ b/src/plugin_freebsd.h @@ -22,6 +22,7 @@ extern int do_vm_stats_sys_v_swappgs(int update_every, usec_t dt); extern int do_vm_stats_sys_v_pgfaults(int update_every, usec_t dt); extern int do_kern_ipc_sem(int update_every, usec_t dt); extern int do_kern_ipc_shm(int update_every, usec_t dt); +extern int do_kern_ipc_msq(int update_every, usec_t dt); extern int do_freebsd_sysctl_old(int update_every, usec_t dt); -- 2.39.2