[
https://issues.apache.org/jira/browse/MAPREDUCE-4334?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13415452#comment-13415452
]
Andrew Ferguson commented on MAPREDUCE-4334:
--------------------------------------------
Hi Bikas, thanks for thinking about this! Comments inline:
bq. Somewhere in this thread it was mentioned controlling memory via OS. In my
experience this is not an optimal choice because
bq. 1) makes it hard to debug task failures due to memory issues. Abrupt OS
termination or denial or more memory resulting in NPE/bad pointers etc. Its
better to just monitor the memory and then enforce limits with clear error
message saying - task was terminated because it used more memory than alloted.
On Linux, enforcing memory limits via Cgroups feels a bit like simply running a
process on a machine with less memory installed. When the memory allocation is
pushing the threshold, the Linux OOM killer destroys the task. The patch above
detects that the process has been killed and logs a error message indicating
that the task was killed for consuming too many reousrces.
bq. 2) due to different scenarios, tasks may have memory spikes or temporary
increases. The OS will enforce tight limits but NodeManager monitoring can be
more flexible and not terminate a task because it shot to 2.1GB instead of
staying under 2.
I would argue that the strict enforcement of Cgroups is exactly the behavior we
want because it provides isolation. If two containers are running on a node
with 4 GB of RAM, and each are using 2 GB, and one happens to spike to 3 GB
momentarily, the spiking container should suffer -- if we continue monitoring
the memory as done today, then the well-behaved container might suffer by being
swapped-out to make room for the spiking container.
I believe the spiking concern is mitigated by the fact that Cgroups allows you
to set both a physical memory limit, and a virtual memory limit (which my patch
above makes use of). For example, I set the physical memory limit to say, 1 GB
of RAM, and the virtual memory limit to 2.1 GB. When a process momentarily
spikes above it's 1 GB of RAM, it will be allocated memory from swap without a
problem. This is configurable by the already extant
"yarn.nodemanager.vmem-pmem-ratio" setting.
bq. Disk scheduling and monitoring would be a hard to achieve goal with
multiple writers to disk spinning things their own way and expecting something
that will likely not happen.
Sure, it is tricky, and the feasibility depends on the semantics YARN promises
applications. However, the Linux Completely Fair Queuing I/O scheduler has
semantics which are quite similar to the semantics I'm proposing we promise for
CPUs (proportional weights). The blkio Cgroup subsystem already today provides
both proportional sharing and throttling:
http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/ch-Subsystems_and_Tunable_Parameters.html#sec-blkio
bq. Network scheduling and monitoring shares choke points at multiple levels
beyond the machines and trying to optimally and proportionally use the network
tends to be a problem thats better served globally.
YARN is a global scheduler. Linux traffic controls [1], in combination with the
network controller for Cgroups, can be used to implement the results of Seawall
[2], FairCloud [3], and similar projects. There are many datacenter designs
these days; some will be a perfect match for end-host-only bandwidth control,
and others an imperfect match. While end-host-only bandwidth control is not a
magic bullet, I strongly believe that it is both useful enough, and easy enough
to implement, to warrant pursuit.
bq. My 2 cents would be to limit this to just CPU for now.
It is. However, I believe the patch above is easily extensible to other
resources (you can see for yourself that there is a small difference between
the memory-only patch, and the memory+cpu patch).
bq. Based on the comments above, I would agree that we need to make sure
platform specific stuff should not leak into the code so that other platforms
(imminently Windows) can support this stuff.
Totally agree. That's why I proposed making it pluggable with MAPREDUCE-4351.
bq. An alternative to pluggable ContainersMonitor would be to make CPU
management a pluggable component of ContainersManager. My POV is that
ContainersManager manages the resources of containers and has logic that will
be common across platforms. The tools it uses will change. Eg.
ProcfsBaseProcessTree is the tool used to monitor and manage memory. I can see
that being changed to a MemoryMonitor interface with platform specific
implementations. Thats whats happening on the Windows port in branch 1. I can
see a CPUMonitor interface for CPU. Or maybe a ResourceMonitor that has methods
for both memory and CPU.
I'm afraid I'm a bit confused by your suggestion here -- ContainersMonitor is
already a part of the ContainersManager. Are you proposing that we create a
pluggable interface for each type of resource independently? Perhaps you can
point me to the code & branch which has the suggestion you are describing?
There are two pieces to resource management: monitoring & enforcement, and both
are platform-specific. Because multiple Linux enforcement solutions (the
current Java-native, the above Cgroups, and the planned taskset) can all use
the same Linux-specific monitoring code, it seems reasonable to keep the two
features separate. The monitoring code is already pluggable
(ResourceCalculatorPlugin).
Thanks!
Andrew
[1] http://lartc.org/howto/ and 'man tc'
[2]
http://research.microsoft.com/en-us/UM/people/srikanth/data/nsdi11_seawall.pdf
[3] http://www.hpl.hp.com/people/lucian_popa/faircloud_hotnets.pdf
> Add support for CPU isolation/monitoring of containers
> ------------------------------------------------------
>
> Key: MAPREDUCE-4334
> URL: https://issues.apache.org/jira/browse/MAPREDUCE-4334
> Project: Hadoop Map/Reduce
> Issue Type: Sub-task
> Reporter: Arun C Murthy
> Assignee: Andrew Ferguson
> Attachments: MAPREDUCE-4334-pre1.patch,
> MAPREDUCE-4334-pre2-with_cpu.patch, MAPREDUCE-4334-pre2.patch,
> MAPREDUCE-4334-pre3-with_cpu.patch, MAPREDUCE-4334-pre3.patch
>
>
> Once we get in MAPREDUCE-4327, it will be important to actually enforce
> limits on CPU consumption of containers.
> Several options spring to mind:
> # taskset (RHEL5+)
> # cgroups (RHEL6+)
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira