Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Dec 2009 11:52:16 +0000 (UTC)
From:      Shteryana Shopova <syrinx@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r200355 - stable/8/contrib/bsnmp/snmp_mibII
Message-ID:  <200912101152.nBABqGB6061515@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: syrinx
Date: Thu Dec 10 11:52:16 2009
New Revision: 200355
URL: http://svn.freebsd.org/changeset/base/200355

Log:
  MFC r200063
  
  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.

Modified:
  stable/8/contrib/bsnmp/snmp_mibII/BEGEMOT-MIB2-MIB.txt
  stable/8/contrib/bsnmp/snmp_mibII/mibII.c
  stable/8/contrib/bsnmp/snmp_mibII/mibII.h
  stable/8/contrib/bsnmp/snmp_mibII/mibII_begemot.c
  stable/8/contrib/bsnmp/snmp_mibII/mibII_tree.def
Directory Properties:
  stable/8/contrib/bsnmp/   (props changed)

Modified: stable/8/contrib/bsnmp/snmp_mibII/BEGEMOT-MIB2-MIB.txt
==============================================================================
--- stable/8/contrib/bsnmp/snmp_mibII/BEGEMOT-MIB2-MIB.txt	Thu Dec 10 10:34:30 2009	(r200354)
+++ stable/8/contrib/bsnmp/snmp_mibII/BEGEMOT-MIB2-MIB.txt	Thu Dec 10 11:52:16 2009	(r200355)
@@ -39,7 +39,7 @@ IMPORTS
 	FROM BEGEMOT-IP-MIB;
 
 begemotMib2 MODULE-IDENTITY
-    LAST-UPDATED "200602130000Z"
+    LAST-UPDATED "200908030000Z"
     ORGANIZATION "German Aerospace Center"
     CONTACT-INFO
 	    "		Hartmut Brandt
@@ -54,6 +54,12 @@ begemotMib2 MODULE-IDENTITY
 	     E-mail:	harti@freebsd.org"
     DESCRIPTION
 	    "The MIB for private mib2 stuff."
+    REVISION	"200908030000Z"
+    DESCRIPTION
+		"Second edition adds begemotIfDataPoll object."
+    REVISION	"200602130000Z"
+    DESCRIPTION
+		"Initial revision."
     ::= { begemotIp 1 }
 
 begemotIfMaxspeed OBJECT-TYPE
@@ -87,4 +93,14 @@ begemotIfForcePoll OBJECT-TYPE
 	     bit rate in its MIB."
     ::= { begemotMib2 3 }
 
+begemotIfDataPoll OBJECT-TYPE
+    SYNTAX	TimeTicks
+    UNITS	"deciseconds"
+    MAX-ACCESS	read-write
+    STATUS	current
+    DESCRIPTION
+	    "The rate at which the mib2 module will poll interface data."
+    DEFVAL	{ 100 }
+    ::= { begemotMib2 4 }
+
 END

Modified: stable/8/contrib/bsnmp/snmp_mibII/mibII.c
==============================================================================
--- stable/8/contrib/bsnmp/snmp_mibII/mibII.c	Thu Dec 10 10:34:30 2009	(r200354)
+++ stable/8/contrib/bsnmp/snmp_mibII/mibII.c	Thu Dec 10 11:52:16 2009	(r200355)
@@ -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
 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,

Modified: stable/8/contrib/bsnmp/snmp_mibII/mibII.h
==============================================================================
--- stable/8/contrib/bsnmp/snmp_mibII/mibII.h	Thu Dec 10 10:34:30 2009	(r200354)
+++ stable/8/contrib/bsnmp/snmp_mibII/mibII.h	Thu Dec 10 11:52:16 2009	(r200355)
@@ -211,6 +211,14 @@ extern u_int mibif_hc_update_interval;
 /* re-compute update interval */
 void mibif_reset_hc_timer(void);
 
+/* interfaces' data poll interval */
+extern u_int mibII_poll_ticks;
+
+/* restart the data poll timer */
+void mibif_restart_mibII_poll_timer(void);
+
+#define MIBII_POLL_TICKS	100
+
 /* get interfaces and interface addresses. */
 void mib_fetch_interfaces(void);
 

Modified: stable/8/contrib/bsnmp/snmp_mibII/mibII_begemot.c
==============================================================================
--- stable/8/contrib/bsnmp/snmp_mibII/mibII_begemot.c	Thu Dec 10 10:34:30 2009	(r200354)
+++ stable/8/contrib/bsnmp/snmp_mibII/mibII_begemot.c	Thu Dec 10 11:52:16 2009	(r200355)
@@ -59,6 +59,11 @@ op_begemot_mibII(struct snmp_context *ct
 			ctx->scratch->int1 = mibif_force_hc_update_interval;
 			mibif_force_hc_update_interval = value->v.uint32;
 			return (SNMP_ERR_NOERROR);
+
+		  case LEAF_begemotIfDataPoll:
+			ctx->scratch->int1 = mibII_poll_ticks;
+			mibII_poll_ticks = value->v.uint32;
+			return (SNMP_ERR_NOERROR);
 		}
 		abort();
 
@@ -68,6 +73,10 @@ op_begemot_mibII(struct snmp_context *ct
 		  case LEAF_begemotIfForcePoll:
 			mibif_force_hc_update_interval = ctx->scratch->int1;
 			return (SNMP_ERR_NOERROR);
+
+		  case LEAF_begemotIfDataPoll:
+			mibII_poll_ticks = ctx->scratch->int1;
+			return (SNMP_ERR_NOERROR);
 		}
 		abort();
 
@@ -78,6 +87,10 @@ op_begemot_mibII(struct snmp_context *ct
 			mibif_force_hc_update_interval = ctx->scratch->int1;
 			mibif_reset_hc_timer();
 			return (SNMP_ERR_NOERROR);
+
+		  case LEAF_begemotIfDataPoll:
+			mibif_restart_mibII_poll_timer();
+			return (SNMP_ERR_NOERROR);
 		}
 		abort();
 	}
@@ -98,6 +111,10 @@ op_begemot_mibII(struct snmp_context *ct
 	  case LEAF_begemotIfForcePoll:
 		value->v.uint32 = mibif_force_hc_update_interval;
 		return (SNMP_ERR_NOERROR);
+
+	  case LEAF_begemotIfDataPoll:
+		value->v.uint32 = mibII_poll_ticks;
+		return (SNMP_ERR_NOERROR);
 	}
 	abort();
 }

Modified: stable/8/contrib/bsnmp/snmp_mibII/mibII_tree.def
==============================================================================
--- stable/8/contrib/bsnmp/snmp_mibII/mibII_tree.def	Thu Dec 10 10:34:30 2009	(r200354)
+++ stable/8/contrib/bsnmp/snmp_mibII/mibII_tree.def	Thu Dec 10 11:52:16 2009	(r200355)
@@ -240,6 +240,7 @@
 		(1 begemotIfMaxspeed COUNTER64 op_begemot_mibII GET)
 		(2 begemotIfPoll TIMETICKS op_begemot_mibII GET)
 		(3 begemotIfForcePoll TIMETICKS op_begemot_mibII GET SET)
+		(4 begemotIfDataPoll TIMETICKS op_begemot_mibII GET SET)
 	      )
 	    )
 	  )



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200912101152.nBABqGB6061515>