You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by cw...@apache.org on 2013/08/22 18:07:47 UTC

svn commit: r1516497 - /uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java

Author: cwiklik
Date: Thu Aug 22 16:07:47 2013
New Revision: 1516497

URL: http://svn.apache.org/r1516497
Log:
UIMA-3208 Fixed how process CPU usage is calculated

Modified:
    uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java?rev=1516497&r1=1516496&r2=1516497&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java Thu Aug 22 16:07:47 2013
@@ -50,7 +50,7 @@ public class LinuxProcessMetricsProcesso
   // private RandomAccessFile nodeStatFile;
   private RandomAccessFile processStatFile;
 
-  private long initTimeinSeconds = 0;
+  private long totalCpuInitUsage = 0;
   
   private boolean initializing = true;
   
@@ -72,6 +72,10 @@ public class LinuxProcessMetricsProcesso
 
   private volatile boolean closed = true;
   
+  private long clockAtStartOfRun=0;
+  
+  private long percentCPU=0;
+  
   // private int logCounter=0;
   public LinuxProcessMetricsProcessor(DuccLogger logger, IDuccProcess process, NodeAgent agent,
           String statmFilePath, String nodeStatFilePath, String processStatFilePath,
@@ -159,7 +163,7 @@ public class LinuxProcessMetricsProcesso
                         pid, processStatFile, 42, 0);
 
                 processCpuUsage = pool.submit(processCpuUsageCollector);
-                totalCpuUsage += processCpuUsage.get().getTotalJiffies();
+                totalCpuUsage += (processCpuUsage.get().getTotalJiffies()/ agent.cpuClockRate);
                 
                 RandomAccessFile rStatmFile =
                         new RandomAccessFile("/proc/" + pid + "/statm", "r");
@@ -188,7 +192,7 @@ public class LinuxProcessMetricsProcesso
                      process.getPID(), processStatFile, 42, 0);
 
              processCpuUsage = pool.submit(processCpuUsageCollector);
-             totalCpuUsage = processCpuUsage.get().getTotalJiffies();
+             totalCpuUsage = processCpuUsage.get().getTotalJiffies()/ agent.cpuClockRate;
              
              ProcessResidentMemoryCollector collector = new ProcessResidentMemoryCollector(statmFile, 2,
                      0);
@@ -205,18 +209,24 @@ public class LinuxProcessMetricsProcesso
         // report cpu utilization while the process is running
         if ( managedProcess.getDuccProcess().getProcessState().equals(ProcessState.Running)) {
           if (agent.cpuClockRate > 0) {
+        	  // if the process just change state from Initializing to Running ...
             if ( initializing ) {
               initializing = false;
               // cache how much cpu was used up during initialization of the process
-              initTimeinSeconds = totalCpuUsage / agent.cpuClockRate;
+              totalCpuInitUsage = totalCpuUsage;
+              // capture time when process state changed to Running
+              clockAtStartOfRun = System.currentTimeMillis();
             }
-            //  normalize cpu usage to report in seconds. Also subtract how much cpu was
+            // normalize time in running state into seconds
+            long timeSinceRunningInSeconds = (System.currentTimeMillis() - clockAtStartOfRun)/1000;
+            //  normalize cpu % usage to report in seconds. Also subtract how much cpu was
             //  used during initialization
-            long cpu = ( totalCpuUsage/agent.cpuClockRate)-initTimeinSeconds;
+            percentCPU = 100* ( totalCpuUsage - totalCpuInitUsage )/timeSinceRunningInSeconds;
+            
             logger.info("process", null, "----------- PID:" + process.getPID()
-                    + " CPU Time (seconds):" + cpu);
+                    + " CPU Time:" + percentCPU+"%");
             // Publish cumulative CPU usage
-            process.setCpuTime(cpu);
+            process.setCpuTime(percentCPU);
           } else {
             process.setCpuTime(0);
             logger.info("process", null,
@@ -224,9 +234,13 @@ public class LinuxProcessMetricsProcesso
                             + process.getPID());
           }
           
-        } else {
-          //   report 0 for CPU while the process is initializing
-          process.setCpuTime(0);
+        } else if ( managedProcess.getDuccProcess().getProcessState().equals(ProcessState.Initializing)) {
+            //   report 0 for CPU while the process is initializing
+            process.setCpuTime(0);
+        }
+        else {
+          //   if process is not dead, report the last known percentCPU
+          process.setCpuTime(percentCPU);
         }
        // long majorFaults = processMajorFaultUsage.get().getMajorFaults();
         // collects process Major faults (swap in memory)