YARN-7580. ContainersMonitorImpl logged message lacks detail when exceeding memory limits. Contributed by Wilfred Spiegelenburg.

This commit is contained in:
Miklos Szegedi 2017-12-29 12:35:49 -08:00
parent 6e3e1b8cde
commit b82049b4f0
2 changed files with 15 additions and 7 deletions

View File

@ -650,26 +650,34 @@ private void checkLimit(ContainerId containerId, String pId,
if (isVmemCheckEnabled() if (isVmemCheckEnabled()
&& isProcessTreeOverLimit(containerId.toString(), && isProcessTreeOverLimit(containerId.toString(),
currentVmemUsage, curMemUsageOfAgedProcesses, vmemLimit)) { currentVmemUsage, curMemUsageOfAgedProcesses, vmemLimit)) {
// The current usage (age=0) is always higher than the aged usage. We
// do not show the aged size in the message, base the delta on the
// current usage
long delta = currentVmemUsage - vmemLimit;
// Container (the root process) is still alive and overflowing // Container (the root process) is still alive and overflowing
// memory. // memory.
// Dump the process-tree and then clean it up. // Dump the process-tree and then clean it up.
msg = formatErrorMessage("virtual", msg = formatErrorMessage("virtual",
formatUsageString(currentVmemUsage, vmemLimit, formatUsageString(currentVmemUsage, vmemLimit,
currentPmemUsage, pmemLimit), currentPmemUsage, pmemLimit),
pId, containerId, pTree); pId, containerId, pTree, delta);
isMemoryOverLimit = true; isMemoryOverLimit = true;
containerExitStatus = ContainerExitStatus.KILLED_EXCEEDED_VMEM; containerExitStatus = ContainerExitStatus.KILLED_EXCEEDED_VMEM;
} else if (isPmemCheckEnabled() } else if (isPmemCheckEnabled()
&& isProcessTreeOverLimit(containerId.toString(), && isProcessTreeOverLimit(containerId.toString(),
currentPmemUsage, curRssMemUsageOfAgedProcesses, currentPmemUsage, curRssMemUsageOfAgedProcesses,
pmemLimit)) { pmemLimit)) {
// The current usage (age=0) is always higher than the aged usage. We
// do not show the aged size in the message, base the delta on the
// current usage
long delta = currentPmemUsage - pmemLimit;
// Container (the root process) is still alive and overflowing // Container (the root process) is still alive and overflowing
// memory. // memory.
// Dump the process-tree and then clean it up. // Dump the process-tree and then clean it up.
msg = formatErrorMessage("physical", msg = formatErrorMessage("physical",
formatUsageString(currentVmemUsage, vmemLimit, formatUsageString(currentVmemUsage, vmemLimit,
currentPmemUsage, pmemLimit), currentPmemUsage, pmemLimit),
pId, containerId, pTree); pId, containerId, pTree, delta);
isMemoryOverLimit = true; isMemoryOverLimit = true;
containerExitStatus = ContainerExitStatus.KILLED_EXCEEDED_PMEM; containerExitStatus = ContainerExitStatus.KILLED_EXCEEDED_PMEM;
} }
@ -726,11 +734,11 @@ private void reportResourceUsage(ContainerId containerId,
*/ */
private String formatErrorMessage(String memTypeExceeded, private String formatErrorMessage(String memTypeExceeded,
String usageString, String pId, ContainerId containerId, String usageString, String pId, ContainerId containerId,
ResourceCalculatorProcessTree pTree) { ResourceCalculatorProcessTree pTree, long delta) {
return return
String.format("Container [pid=%s,containerID=%s] is " + String.format("Container [pid=%s,containerID=%s] is " +
"running beyond %s memory limits. ", "running %dB beyond the '%S' memory limit. ",
pId, containerId, memTypeExceeded) + pId, containerId, delta, memTypeExceeded) +
"Current usage: " + usageString + "Current usage: " + usageString +
". Killing container.\n" + ". Killing container.\n" +
"Dump of the process-tree for " + containerId + " :\n" + "Dump of the process-tree for " + containerId + " :\n" +

View File

@ -332,8 +332,8 @@ public void testContainerKillOnMemoryOverflow() throws IOException,
Assert.assertEquals(ContainerExitStatus.KILLED_EXCEEDED_VMEM, Assert.assertEquals(ContainerExitStatus.KILLED_EXCEEDED_VMEM,
containerStatus.getExitStatus()); containerStatus.getExitStatus());
String expectedMsgPattern = String expectedMsgPattern =
"Container \\[pid=" + pid + ",containerID=" + cId "Container \\[pid=" + pid + ",containerID=" + cId + "\\] is running "
+ "\\] is running beyond virtual memory limits. Current usage: " + "[0-9]+B beyond the 'VIRTUAL' memory limit. Current usage: "
+ "[0-9.]+ ?[KMGTPE]?B of [0-9.]+ ?[KMGTPE]?B physical memory used; " + "[0-9.]+ ?[KMGTPE]?B of [0-9.]+ ?[KMGTPE]?B physical memory used; "
+ "[0-9.]+ ?[KMGTPE]?B of [0-9.]+ ?[KMGTPE]?B virtual memory used. " + "[0-9.]+ ?[KMGTPE]?B of [0-9.]+ ?[KMGTPE]?B virtual memory used. "
+ "Killing container.\nDump of the process-tree for " + "Killing container.\nDump of the process-tree for "