summaryrefslogtreecommitdiffstats
path: root/contrib/bsnmp/snmp_mibII/mibII.c
diff options
context:
space:
mode:
authorsyrinx <syrinx@FreeBSD.org>2009-12-03 16:08:00 +0000
committersyrinx <syrinx@FreeBSD.org>2009-12-03 16:08:00 +0000
commit3f6e5c4df53d4a7718a0f41931a9ff7fdc66e9ca (patch)
tree520582a3b754a46d8d4bf52f165cb0ba8b2d350d /contrib/bsnmp/snmp_mibII/mibII.c
parent879c7d27302e0fb0654529de4b88f210ee11b022 (diff)
downloadFreeBSD-src-3f6e5c4df53d4a7718a0f41931a9ff7fdc66e9ca.zip
FreeBSD-src-3f6e5c4df53d4a7718a0f41931a9ff7fdc66e9ca.tar.gz
Fix a problem with high CPU consumption (up to 30%) by bsnmpd on a loaded system.
Instead of constantly calling the mibII_idle function when the server is not busy call the function only once every 10 seconds to avoid bsnmpd constantly doing gettimeofday syscalls. Make the idle polling interval confugurable via begemotIfDataPoll. Reported and tested by: misho (at) aitbg (dot) com Oked by: harti MFC after: 1 week
Diffstat (limited to 'contrib/bsnmp/snmp_mibII/mibII.c')
-rw-r--r--contrib/bsnmp/snmp_mibII/mibII.c36
1 files changed, 34 insertions, 2 deletions
diff --git a/contrib/bsnmp/snmp_mibII/mibII.c b/contrib/bsnmp/snmp_mibII/mibII.c
index cd4caac..8714695 100644
--- a/contrib/bsnmp/snmp_mibII/mibII.c
+++ b/contrib/bsnmp/snmp_mibII/mibII.c
@@ -117,6 +117,15 @@ u_int mibif_hc_update_interval;
/* HC update timer handle */
static void *hc_update_timer;
+/* Idle poll timer */
+static void *mibII_poll_timer;
+
+/* interfaces' data poll interval */
+u_int mibII_poll_ticks;
+
+/* Idle poll hook */
+static void mibII_idle(void *arg __unused);
+
/*****************************/
static const struct asn_oid oid_ifMIB = OIDX_ifMIB;
@@ -410,6 +419,20 @@ mibif_reset_hc_timer(void)
mibif_hc_update_interval = ticks;
}
+/**
+ * Restart the idle poll timer.
+ */
+void
+mibif_restart_mibII_poll_timer(void)
+{
+ if (mibII_poll_timer != NULL)
+ timer_stop(mibII_poll_timer);
+
+ if ((mibII_poll_timer = timer_start_repeat(mibII_poll_ticks * 10,
+ mibII_poll_ticks * 10, mibII_idle, NULL, module)) == NULL)
+ syslog(LOG_ERR, "timer_start(%u): %m", mibII_poll_ticks);
+}
+
/*
* Fetch new MIB data.
*/
@@ -1553,7 +1576,7 @@ get_cloners(void)
* Idle function
*/
static void
-mibII_idle(void)
+mibII_idle(void *arg __unused)
{
struct mibifa *ifa;
@@ -1608,6 +1631,10 @@ mibII_start(void)
ipForward_reg = or_register(&oid_ipForward,
"The MIB module for the display of CIDR multipath IP Routes.",
module);
+
+ mibII_poll_timer = NULL;
+ mibII_poll_ticks = MIBII_POLL_TICKS;
+ mibif_restart_mibII_poll_timer();
}
/*
@@ -1651,6 +1678,11 @@ mibII_init(struct lmodule *mod, int argc __unused, char *argv[] __unused)
static int
mibII_fini(void)
{
+ if (mibII_poll_timer != NULL ) {
+ timer_stop(mibII_poll_timer);
+ mibII_poll_timer = NULL;
+ }
+
if (route_fd != NULL)
fd_deselect(route_fd);
if (route != -1)
@@ -1690,7 +1722,7 @@ const struct snmp_module config = {
"This module implements the interface and ip groups.",
mibII_init,
mibII_fini,
- mibII_idle, /* idle */
+ NULL, /* idle */
NULL, /* dump */
NULL, /* config */
mibII_start,
OpenPOWER on IntegriCloud