This patch fixes CPU system and idle metrics. Ganglia uses float
variables (double) to store the jiffies and the
jiffies sums. But, Float numbers have a problem with
precision and Ganglia is getting lost with big ppc64 numbers on its
calculations. This patch changes libmetrics/linux/metrics.c to use
integers
(unsined long long) to store the jiffies and jiffies sums and floats
(double) to store the calculated numbers only. Signed off by: Rafael Xavier <rxavi...@br.ibm.com> OBS: 1) This patch has been sniff tested, but not extensively. 2) It fixes it for linux only. The ideal approach would be to make the same changes for other OSes as well. --
|
diff --git a/libmetrics/linux/metrics.c b/libmetrics/linux/metrics.c index 7544f6e..83f706d 100644 --- a/libmetrics/linux/metrics.c +++ b/libmetrics/linux/metrics.c @@ -21,6 +21,8 @@ #define OSNAME "Linux" #define OSNAME_LEN strlen(OSNAME) +#define JT unsigned long long + /* /proc/net/dev hash table stuff */ typedef struct net_dev_stats net_dev_stats; struct net_dev_stats { @@ -616,11 +618,11 @@ os_release_func ( void ) /* * A helper function to return the total number of cpu jiffies */ -unsigned long +JT total_jiffies_func ( void ) { char *p; - unsigned long user_jiffies, nice_jiffies, system_jiffies, idle_jiffies, + JT user_jiffies, nice_jiffies, system_jiffies, idle_jiffies, wio_jiffies, irq_jiffies, sirq_jiffies; p = update_file(&proc_stat); @@ -655,8 +657,8 @@ cpu_user_func ( void ) char *p; static g_val_t val; static struct timeval stamp={0,0}; - static double last_user_jiffies, user_jiffies, - last_total_jiffies, total_jiffies, diff; + static JT last_user_jiffies, user_jiffies, + last_total_jiffies, total_jiffies, diff; p = update_file(&proc_stat); if((proc_stat.last_read.tv_sec != stamp.tv_sec) && @@ -670,7 +672,7 @@ cpu_user_func ( void ) diff = user_jiffies - last_user_jiffies; if ( diff ) - val.f = (diff/(total_jiffies - last_total_jiffies))*100; + val.f = ((double)diff/(double)(total_jiffies - last_total_jiffies))*100.0; else val.f = 0.0; @@ -687,8 +689,8 @@ cpu_nice_func ( void ) char *p; static g_val_t val; static struct timeval stamp={0,0}; - static double last_nice_jiffies, nice_jiffies, - last_total_jiffies, total_jiffies, diff; + static JT last_nice_jiffies, nice_jiffies, + last_total_jiffies, total_jiffies, diff; p = update_file(&proc_stat); if((proc_stat.last_read.tv_sec != stamp.tv_sec) && @@ -703,7 +705,7 @@ cpu_nice_func ( void ) diff = (nice_jiffies - last_nice_jiffies); if ( diff ) - val.f = (diff/(total_jiffies - last_total_jiffies))*100; + val.f = ((double)diff/(double)(total_jiffies - last_total_jiffies))*100.0; else val.f = 0.0; @@ -720,8 +722,8 @@ cpu_system_func ( void ) char *p; static g_val_t val; static struct timeval stamp={0,0}; - static double last_system_jiffies, system_jiffies, - last_total_jiffies, total_jiffies, diff; + static JT last_system_jiffies, system_jiffies, + last_total_jiffies, total_jiffies, diff; p = update_file(&proc_stat); if((proc_stat.last_read.tv_sec != stamp.tv_sec) && @@ -745,7 +747,7 @@ cpu_system_func ( void ) diff = system_jiffies - last_system_jiffies; if ( diff ) - val.f = (diff/(total_jiffies - last_total_jiffies))*100; + val.f = ((double)diff/(double)(total_jiffies - last_total_jiffies))*100.0; else val.f = 0.0; @@ -762,8 +764,8 @@ cpu_idle_func ( void ) char *p; static g_val_t val; static struct timeval stamp={0,0}; - static double last_idle_jiffies, idle_jiffies, - last_total_jiffies, total_jiffies, diff; + static JT last_idle_jiffies, idle_jiffies, + last_total_jiffies, total_jiffies, diff; p = update_file(&proc_stat); if((proc_stat.last_read.tv_sec != stamp.tv_sec) && @@ -780,7 +782,7 @@ cpu_idle_func ( void ) diff = idle_jiffies - last_idle_jiffies; if ( diff ) - val.f = (diff/(total_jiffies - last_total_jiffies))*100; + val.f = ((double)diff/(double)(total_jiffies - last_total_jiffies))*100.0; else val.f = 0.0; @@ -797,7 +799,7 @@ cpu_aidle_func ( void ) { char *p; g_val_t val; - double idle_jiffies, total_jiffies; + JT idle_jiffies, total_jiffies; p = update_file(&proc_stat); @@ -805,10 +807,10 @@ cpu_aidle_func ( void ) p = skip_token(p); p = skip_token(p); p = skip_token(p); - idle_jiffies = strtod( p , (char **)NULL ); + idle_jiffies = (JT) strtod( p , (char **)NULL ); total_jiffies = total_jiffies_func(); - val.f = (idle_jiffies/total_jiffies)*100; + val.f = ((double)(idle_jiffies/total_jiffies))*100.0; return val; } @@ -818,8 +820,8 @@ cpu_wio_func ( void ) char *p; static g_val_t val; static struct timeval stamp={0,0}; - static double last_wio_jiffies, wio_jiffies, - last_total_jiffies, total_jiffies, diff; + static JT last_wio_jiffies, wio_jiffies, + last_total_jiffies, total_jiffies, diff; if (num_cpustates == NUM_CPUSTATES_24X) { val.f = 0.; @@ -842,7 +844,7 @@ cpu_wio_func ( void ) diff = wio_jiffies - last_wio_jiffies; if ( diff ) - val.f = (diff/(total_jiffies - last_total_jiffies))*100; + val.f = ((double)diff/(double)(total_jiffies - last_total_jiffies))*100.0; else val.f = 0.0; @@ -860,8 +862,8 @@ cpu_intr_func ( void ) char *p; static g_val_t val; static struct timeval stamp={0,0}; - static double last_intr_jiffies, intr_jiffies, - last_total_jiffies, total_jiffies, diff; + static JT last_intr_jiffies, intr_jiffies, + last_total_jiffies, total_jiffies, diff; if (num_cpustates == NUM_CPUSTATES_24X) { val.f = 0.; @@ -885,7 +887,7 @@ cpu_intr_func ( void ) diff = intr_jiffies - last_intr_jiffies; if ( diff ) - val.f = (diff/(total_jiffies - last_total_jiffies))*100; + val.f = ((double)diff/(double)(total_jiffies - last_total_jiffies))*100.0; else val.f = 0.0; @@ -903,8 +905,8 @@ cpu_sintr_func ( void ) char *p; static g_val_t val; static struct timeval stamp={0,0}; - static double last_sintr_jiffies, sintr_jiffies, - last_total_jiffies, total_jiffies, diff; + static JT last_sintr_jiffies, sintr_jiffies, + last_total_jiffies, total_jiffies, diff; if (num_cpustates == NUM_CPUSTATES_24X) { val.f = 0.; @@ -929,7 +931,7 @@ cpu_sintr_func ( void ) diff = sintr_jiffies - last_sintr_jiffies; if ( diff ) - val.f = (diff/(total_jiffies - last_total_jiffies))*100; + val.f = ((double)diff/(double)(total_jiffies - last_total_jiffies))*100.0; else val.f = 0.0;
------------------------------------------------------------------------------
_______________________________________________ Ganglia-developers mailing list Ganglia-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ganglia-developers