[collectd] [PATCH] lpar plugin: use pool_idle_time to account for cpu pool usage

Aurelien Reynaud collectd at wattapower.net
Thu Sep 23 11:29:49 CEST 2010


The current implementation uses pool_busy_time (expressed in ns)
but experience shows this metric isn't accurate:
It shows lower cpu usage for the entire pool than the sum of the
participating lpars.
Using pool_idle_time (expressed in clock ticks) in contrast is almost
a perfect match.
This is also what is used by IBM in their sample code:
http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=/com.ibm.aix.prftools/doc/prftools/prftools07.htm

Signed-off-by: Aurelien Reynaud <collectd at wattapower.net>
---
 src/lpar.c |   21 +++++++--------------
 1 files changed, 7 insertions(+), 14 deletions(-)

diff --git a/src/lpar.c b/src/lpar.c
index ec39d5c..fc60c56 100644
--- a/src/lpar.c
+++ b/src/lpar.c
@@ -34,8 +34,6 @@
                    (double)(_system_configuration.Xfrac))
 #endif
 
-#define NS_TO_TICKS(ns) ((ns) / XINTFRAC)
-
 static const char *config_keys[] =
 {
   "CpuPoolStats",
@@ -230,21 +228,16 @@ static int lpar_read (void)
 	if (pool_stats)
 	{
 		char typinst[DATA_MAX_NAME_LEN];
-		u_longlong_t pool_busy_ns;
-	       	u_longlong_t pool_max_ns;
-		u_longlong_t pool_idle_ns = 0;
+		double pool_idle_cpus;
+		double pool_busy_cpus;
 
-		pool_busy_ns = lparstats.pool_busy_time - lparstats_old.pool_busy_time;
-		pool_max_ns  = lparstats.pool_max_time  - lparstats_old.pool_max_time;
-		if (pool_max_ns > pool_busy_ns)
-			pool_idle_ns = pool_max_ns - pool_busy_ns;
+		pool_idle_cpus = (double) (lparstats.pool_idle_time - lparstats_old.pool_idle_time) / XINTFRAC / (double) ticks;
+		ssnprintf (typinst, sizeof (typinst), "pool-%X-idle", lparstats.pool_id);
+		lpar_submit (typinst, pool_idle_cpus);
 
-		/* Pool stats are in CPU x ns */
+		pool_busy_cpus = (double) lparstats.phys_cpus_pool - pool_idle_cpus;
 		ssnprintf (typinst, sizeof (typinst), "pool-%X-busy", lparstats.pool_id);
-		lpar_submit (typinst, NS_TO_TICKS ((double) pool_busy_ns) / (double) ticks);
-
-		ssnprintf (typinst, sizeof (typinst), "pool-%X-idle", lparstats.pool_id);
-		lpar_submit (typinst, NS_TO_TICKS ((double) pool_idle_ns) / (double) ticks);
+		lpar_submit (typinst, pool_busy_cpus);
 	}
 
 	memcpy (&lparstats_old, &lparstats, sizeof (lparstats_old));
-- 
1.7.2.2




More information about the collectd mailing list