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 2016/08/18 13:45:24 UTC

svn commit: r1756785 - in /uima/uima-ducc/trunk: uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/ uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/metrics/collectors/ uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/pr...

Author: cwiklik
Date: Thu Aug 18 13:45:24 2016
New Revision: 1756785

URL: http://svn.apache.org/viewvc?rev=1756785&view=rev
Log:
UIMA-5047 Modified to fetch cpu usage from cgroups cpuacct.stat

Modified:
    uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/CGroupsManager.java
    uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/metrics/collectors/ProcessCpuUsageCollector.java
    uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java
    uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/agent/metrics/cpu/DuccProcessCpuUsage.java
    uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/agent/metrics/cpu/ProcessCpuUsage.java

Modified: uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/CGroupsManager.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/CGroupsManager.java?rev=1756785&r1=1756784&r2=1756785&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/CGroupsManager.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/CGroupsManager.java Thu Aug 18 13:45:24 2016
@@ -57,6 +57,7 @@ public class CGroupsManager {
 	private static final String CGDuccMemoryPath = "/memory/"+SYSTEM+"/";
 	private static final String CGDuccCpuPath = "/cpu/"+SYSTEM+"/";
 	private static final String CGProcsFile = "/cgroup.procs";
+	private static final String CGDuccCpuAcctPath = "/cpu/"+SYSTEM+"/";
 	
 	// legacy means that the cgonfig points to <cgroup location>/ducc
 	private boolean legacyCgConfig = false;
@@ -489,6 +490,33 @@ public class CGroupsManager {
 		return false;
 	}
 
+	public String getCpuUsage(String containerId ) throws Exception {
+		String usage = "0";
+		String file = getCGroupLocation("cpuacct")+containerId+System.getProperty("file.separator")+"cpuacct.stat";
+		agentLogger.trace("getCpuUsage", null, "CPUACCT.STAT file:"+file);
+		File f = new File(file);
+		if ( f.exists() ) {
+			InputStreamReader isr = new InputStreamReader(new FileInputStream(f));
+			BufferedReader br = new BufferedReader(isr);
+			String line;
+			try {
+				while ((line = br.readLine()) != null) {
+					agentLogger.trace("getCpuUsage", null, "CPUACCT.STAT Line:"+line);
+					// The line read from cpuacct.stat has: NAME VALUE syntax. 
+					// Need just the VALUE part
+					usage = (line.trim().split(" "))[1];  // get the CPU in user mode
+					break;
+				}
+			} finally {
+				if (isr != null) {
+					isr.close();
+				}
+				agentLogger.trace("getCpuUsage", null, "Done Reading cpuacct.stat file:"+file);
+
+			}
+		}
+		return usage;
+	}
 	/**
 	 * Sets the max memory use for an existing cgroup container.
 	 * 

Modified: uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/metrics/collectors/ProcessCpuUsageCollector.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/metrics/collectors/ProcessCpuUsageCollector.java?rev=1756785&r1=1756784&r2=1756785&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/metrics/collectors/ProcessCpuUsageCollector.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/metrics/collectors/ProcessCpuUsageCollector.java Thu Aug 18 13:45:24 2016
@@ -18,35 +18,36 @@
 */
 package org.apache.uima.ducc.agent.metrics.collectors;
 
-import java.io.RandomAccessFile;
 import java.util.concurrent.Callable;
 
+import org.apache.uima.ducc.agent.launcher.CGroupsManager;
 import org.apache.uima.ducc.common.agent.metrics.cpu.DuccProcessCpuUsage;
 import org.apache.uima.ducc.common.agent.metrics.cpu.ProcessCpuUsage;
 import org.apache.uima.ducc.common.utils.DuccLogger;
 
-public class ProcessCpuUsageCollector extends AbstractMetricCollector implements
+public class ProcessCpuUsageCollector implements
 		Callable<ProcessCpuUsage> {
-	//private DuccLogger logger;
-	//private String pid;
-
-	public ProcessCpuUsageCollector(DuccLogger logger, String pid,
-			RandomAccessFile fileHandle, int howMany, int offset) {
-		super(fileHandle, howMany, offset);
-		//this.logger = logger;
-		//this.pid = pid;
+	private String containerId=null;
+	private CGroupsManager cgm=null;
+	
+	public ProcessCpuUsageCollector(DuccLogger logger, CGroupsManager mgr, String jobId ) {
+		this.containerId = jobId;
+		this.cgm = mgr;
 	}
 
 	public ProcessCpuUsage call() throws Exception {
 		try {
-			super.parseMetricFile();
-			return new DuccProcessCpuUsage(super.metricFileContents,
-			     super.metricFieldOffsets, super.metricFieldLengths);
+			return new DuccProcessCpuUsage(collect());
 		} catch (Exception e) {
-			e.printStackTrace();
 			throw e;
 		}
 	}
+	
+	private long collect() throws Exception{
+			
+		return Long.parseLong(cgm.getCpuUsage(containerId));
+	
+	}
 /*
 	private String execTopShell() throws Exception {
 		List<String> command = new ArrayList<String>();

Modified: uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java?rev=1756785&r1=1756784&r2=1756785&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java Thu Aug 18 13:45:24 2016
@@ -29,6 +29,7 @@ import java.util.concurrent.Future;
 
 import org.apache.camel.Exchange;
 import org.apache.uima.ducc.agent.NodeAgent;
+import org.apache.uima.ducc.agent.launcher.CGroupsManager;
 import org.apache.uima.ducc.agent.launcher.ManagedProcess;
 import org.apache.uima.ducc.agent.metrics.collectors.DuccGarbageStatsCollector;
 import org.apache.uima.ducc.agent.metrics.collectors.ProcessCpuUsageCollector;
@@ -208,12 +209,15 @@ public class LinuxProcessMetricsProcesso
 									.submit(processMajorFaultUsageCollector);
 							totalFaults += processMajorFaultUsage.get()
 									.getMajorFaults();
-							RandomAccessFile raf = null;
+							//RandomAccessFile raf = null;
 							try {
+								/*
 								raf = new RandomAccessFile("/proc/" + pid + "/stat", "r");
 								ProcessCpuUsageCollector processCpuUsageCollector = new ProcessCpuUsageCollector(
 										logger, pid, raf, 42, 0);
-
+	*/
+								ProcessCpuUsageCollector processCpuUsageCollector = 
+										new ProcessCpuUsageCollector(logger, agent.cgroupsManager, containerId);
 								// if process is stopping or already dead dont
 								// collect metrics. The Camel
 								// route has just been stopped.
@@ -223,19 +227,19 @@ public class LinuxProcessMetricsProcesso
 
 								processCpuUsage = pool
 										.submit(processCpuUsageCollector);
-								totalCpuUsage += (processCpuUsage.get()
-										.getTotalJiffies() / agent.cpuClockRate);
+								long cpuUsage = processCpuUsage.get().getCpuUsage();
+								
+								totalCpuUsage += ( processCpuUsage.get().getCpuUsage() / agent.cpuClockRate );
+								logger.info(
+										"LinuxProcessMetricsProcessor.process",null,
+										"CPU USAGE:"+cpuUsage+ " CLOCK RATE:"+agent.cpuClockRate+" Total CPU USAGE:"+totalCpuUsage);
+								
 								
 							} catch( Exception ee) {
 								logger.warn(
 										"LinuxProcessMetricsProcessor.process",
 										null,ee);
-
-							} finally {
-								if ( raf != null ) {
-									raf.close();
-								}
-							}
+							} 
 
 							currentCpuUsage += collectProcessCurrentCPU(pid);
 
@@ -293,10 +297,11 @@ public class LinuxProcessMetricsProcesso
 						totalFaults = processMajorFaultUsage.get()
 								.getMajorFaults();
 
+						/*
 						ProcessCpuUsageCollector processCpuUsageCollector = new ProcessCpuUsageCollector(
 								logger, process.getPID(), processStatFile, 42,
 								0);
-
+						
 						// if process is stopping or already dead dont collect
 						// metrics. The Camel
 						// route has just been stopped.
@@ -306,6 +311,12 @@ public class LinuxProcessMetricsProcesso
 						processCpuUsage = pool.submit(processCpuUsageCollector);
 						totalCpuUsage = processCpuUsage.get().getTotalJiffies()
 								/ agent.cpuClockRate;
+					
+*/
+
+						// Cgroups are not available so percent CPU is not available
+						totalCpuUsage = 0;
+						
 						currentCpuUsage = collectProcessCurrentCPU(process
 								.getPID());
 

Modified: uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/agent/metrics/cpu/DuccProcessCpuUsage.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/agent/metrics/cpu/DuccProcessCpuUsage.java?rev=1756785&r1=1756784&r2=1756785&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/agent/metrics/cpu/DuccProcessCpuUsage.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/agent/metrics/cpu/DuccProcessCpuUsage.java Thu Aug 18 13:45:24 2016
@@ -18,25 +18,14 @@
 */
 package org.apache.uima.ducc.common.agent.metrics.cpu;
 
-import org.apache.uima.ducc.common.node.metrics.ByteBufferParser;
-
-public class DuccProcessCpuUsage extends ByteBufferParser 
-implements ProcessCpuUsage {
+public class DuccProcessCpuUsage implements ProcessCpuUsage {
 	private static final long serialVersionUID = 1L;
-	public static final int USERJIFFIES=13;
-	public static final int SYSTEMJIFFIES=14;
+    private long cpuUsage=0;
     
-	public DuccProcessCpuUsage(byte[] memInfoBuffer,
-			int[] memInfoFieldOffsets, int[] memInfoFiledLengths) {
-		super(memInfoBuffer, memInfoFieldOffsets, memInfoFiledLengths);
+	public DuccProcessCpuUsage( long cpuUsage ) {
+		this.cpuUsage = cpuUsage;
 	}	
-	public long getUserJiffies() {
-		return super.getFieldAsLong(USERJIFFIES);
-	}
-	public long getKernelJiffies() {
-		return super.getFieldAsLong(SYSTEMJIFFIES);
-	}
-	public long getTotalJiffies() {
-		return (getUserJiffies()+getKernelJiffies());
+	public long getCpuUsage() {
+		return cpuUsage;
 	}
 }

Modified: uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/agent/metrics/cpu/ProcessCpuUsage.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/agent/metrics/cpu/ProcessCpuUsage.java?rev=1756785&r1=1756784&r2=1756785&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/agent/metrics/cpu/ProcessCpuUsage.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/agent/metrics/cpu/ProcessCpuUsage.java Thu Aug 18 13:45:24 2016
@@ -21,7 +21,5 @@ package org.apache.uima.ducc.common.agen
 import java.io.Serializable;
 
 public interface ProcessCpuUsage extends Serializable {
-	public long getUserJiffies();
-	public long getKernelJiffies();
-	public long getTotalJiffies();
+	public long getCpuUsage();
 }