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 2015/03/02 21:17:42 UTC

svn commit: r1663418 - in /uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent: NodeAgent.java launcher/CGroupsManager.java launcher/DuccCommandExecutor.java

Author: cwiklik
Date: Mon Mar  2 20:17:42 2015
New Revision: 1663418

URL: http://svn.apache.org/r1663418
Log:
UIMA-4259 Added support for cgroup cpu control 

Modified:
    uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/NodeAgent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/CGroupsManager.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/DuccCommandExecutor.java

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/NodeAgent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/NodeAgent.java?rev=1663418&r1=1663417&r2=1663418&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/NodeAgent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/NodeAgent.java Mon Mar  2 20:17:42 2015
@@ -267,10 +267,10 @@ public class NodeAgent extends AbstractD
                   cgroupsBaseDir = "/cgroup/ducc";
                 }
                 // get the cgroup subsystems. If not defined, default to the
-                // memory subsystem
+                // memory and cpu subsystem
                 String cgroupsSubsystems = System.getProperty("ducc.agent.launcher.cgroups.subsystems");
                 if (cgroupsSubsystems == null) {
-                  cgroupsSubsystems = "memory";
+                  cgroupsSubsystems = "memory,cpu";
                 }
                 cgroupsManager = new CGroupsManager(cgUtilsPath, cgroupsBaseDir, cgroupsSubsystems, logger);
                 // check if cgroups base directory exists in the filesystem

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/CGroupsManager.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/CGroupsManager.java?rev=1663418&r1=1663417&r2=1663418&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/CGroupsManager.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/CGroupsManager.java Mon Mar  2 20:17:42 2015
@@ -421,7 +421,51 @@ public class CGroupsManager {
 			return false;
 		}
 	}
-
+	/**
+	 * Sets the cpu shares use for an existing cgroup container.
+	 * 
+	 * @param containerId
+	 *            - existing container id for which limit will be set
+	 * @param userId
+	 *            - container owner
+	 * @param useDuccSpawn
+	 *            - run 'cgset' command as a user
+	 * @param containerCpuShares
+	 *            - cpu shares
+	 * 
+	 * @return - true on success, false otherwise
+	 * 
+	 * @throws Exception
+	 */
+	
+	public boolean setContainerCpuShares(String containerId,
+			String userId, boolean useDuccSpawn, long containerCpuShares)
+			throws Exception {
+		try {
+			///usr/bin
+			String[] command = new String[] { cgroupUtilsDir+"/cgset", "-r",
+					"cpu.shares=" + containerCpuShares,
+					"ducc/" + containerId };
+			int retCode = launchCommand(command, useDuccSpawn, "ducc",
+					containerId);
+			if (retCode == 0) {
+				agentLogger.info("setContainerCpuShares", null, ">>>>"
+						+ "SUCCESS - Created CGroup with CPU Shares="+containerCpuShares+" on Container:"
+						+ containerId);
+				return true;
+			} else {
+				agentLogger.info("setContainerCpuShares", null, ">>>>"
+						+ "FAILURE - Unable To Create CGroup Container:"
+						+ containerId);
+				return false;
+			}
+		} catch (Exception e) {
+			agentLogger.error("setContainerCpuShares", null, ">>>>"
+					+ "FAILURE - Unable To Set CPU shares On CGroup Container:"
+					+ containerId, e);
+			return false;
+		}
+	}
 	/**
 	 * Removes cgroup container with a given id. Cgroups are implemented as a
 	 * virtual file system. All is needed here is just rmdir.

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/DuccCommandExecutor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/DuccCommandExecutor.java?rev=1663418&r1=1663417&r2=1663418&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/DuccCommandExecutor.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/DuccCommandExecutor.java Mon Mar  2 20:17:42 2015
@@ -80,6 +80,12 @@ public class DuccCommandExecutor extends
     private boolean createCGroupContainer(IDuccProcess duccProcess, String containerId, String owner ) throws Exception {
   	//	create cgroups container and assign limits
     	if ( agent.cgroupsManager.createContainer( containerId, owner, useDuccSpawn()) ) {
+    		logger.info("createCGroupContainer", null, "Calculating CPU shares \nProcess Max Memory="+duccProcess.getCGroup().getMaxMemoryLimit()+"\nNode Memory Total="+agent.getNodeInfo().getNodeMetrics().getNodeMemory().getMemTotal());
+    		long cpuShares =
+    				duccProcess.getCGroup().getMaxMemoryLimit()/agent.getNodeInfo().getNodeMetrics().getNodeMemory().getMemTotal();
+    		logger.info("createCGroupContainer", null,"\nCalculated Shares="+cpuShares);
+    		agent.cgroupsManager.setContainerCpuShares(containerId, owner, useDuccSpawn(), cpuShares);
+    		
     		return agent.cgroupsManager.setContainerMaxMemoryLimit(containerId,
 					owner, useDuccSpawn(), duccProcess.getCGroup().getMaxMemoryLimit());
 		}