Introduce mesos disk collector
authorReza Motamedi <reza.motamedi@gmail.com>
Mon, 26 Mar 2018 20:47:13 +0000 (13:47 -0700)
committerSanthosh Kumar <sshanmugham@twitter.com>
Mon, 26 Mar 2018 20:47:13 +0000 (13:47 -0700)
commita3f8aef6b4dcc13c79d60fc1ce02bcfcdb6e097d
tree357e08d294009648f38fa25dc18b478e56da753a
parent03eb337998b5c394a3f6238922b4701b20fb392b
Introduce mesos disk collector

When disk isolation is enabled in a Mesos agent it calculates the disk usage for each container.
Thermos Observer also monitors disk usage using `twitter.common.dirutil`, essentially repeating the work already done by the agent. In practice, we see that disk monitoring is one of the most expensive resource monitoring tasks. For instance, when there are deeply nested directories, the CPU utilization of the observer process can easily reach 1.5 CPUs. It would be ideal if we delegate the disk monitoring task to the agent and do it only once. With this approach, when disk collection has improved in the agent (for instance by implementing XFS isolation), we can simply benefit from it without any code change. Some more information about the problem is provided in AURORA-1918.

This patch that introduces `MesosDiskCollector` which queries the agent's API endpoint to lookup disk_used_bytes. Note that there is also resource monitoring in thermos executor. Currently, I left the disk collector there to use the `du` implementation. That can be changed in a later patch.

I modified some vagrant config files including `aurora-executor.service` and `etc_mesos-slave/isolation` for testing. They can be left as is. I included them in this patch to show how this would work e2e.

Testing Done:
- I added unit tests.
- Tested in vagrant and it works as intenced.
- I also built and deployed in our test enviroment. In order to measure imporoved performance I created jobs with nested folders and noticed reduction in CPU utilization of the Observer process, by at least 60%. (1.5 CPU cores to 0.4 CPU cores)

Here is one specific test setup: On two hosts I created a two tasks. Each task creates identical nested directory structures and files in them. The overall size is 30GB. test_host_1 runs the current version of observer and test_host_2 runs Observer with this patch and also has mesos_disk_collection enabled. The results are as follows:

```
rezam[7]TEST_HOST_1 ~ $ while true; do echo `date`; curl localhost:1338/vars -s | grep cpu; sleep 10; done
Thu Mar 22 04:36:17 UTC 2018
observer.observer_cpu 108.9
Thu Mar 22 04:36:27 UTC 2018
observer.observer_cpu 123.2
Thu Mar 22 04:36:38 UTC 2018
observer.observer_cpu 123.2
Thu Mar 22 04:36:48 UTC 2018
observer.observer_cpu 123.2
Thu Mar 22 04:36:58 UTC 2018
observer.observer_cpu 111.0
Thu Mar 22 04:37:08 UTC 2018
observer.observer_cpu 111.0
Thu Mar 22 04:37:18 UTC 2018
observer.observer_cpu 111.0

rezam[7]TEST_HOST_2 ~ $ while true; do echo `date`; curl localhost:1338/vars -s | grep cpu; sleep 10; done
Thu Mar 22 04:36:20 UTC 2018
observer.observer_cpu 1.3
Thu Mar 22 04:36:30 UTC 2018
observer.observer_cpu 1.3
Thu Mar 22 04:36:40 UTC 2018
observer.observer_cpu 1.3
Thu Mar 22 04:36:50 UTC 2018
observer.observer_cpu 1.2
Thu Mar 22 04:37:00 UTC 2018
observer.observer_cpu 1.2
Thu Mar 22 04:37:10 UTC 2018
observer.observer_cpu 1.2
Thu Mar 22 04:37:20 UTC 2018
observer.observer_cpu 1.8
```

Reviewed at https://reviews.apache.org/r/66103/
15 files changed:
3rdparty/python/requirements.txt
RELEASE-NOTES.md
docs/reference/observer-configuration.md
examples/jobs/hello_world.aurora
examples/vagrant/mesos_config/etc_mesos-slave/isolation
examples/vagrant/systemd/thermos.service
src/main/python/apache/aurora/tools/thermos_observer.py
src/main/python/apache/thermos/monitoring/BUILD
src/main/python/apache/thermos/monitoring/disk.py
src/main/python/apache/thermos/monitoring/resource.py
src/main/python/apache/thermos/observer/task_observer.py
src/test/python/apache/aurora/executor/common/test_resource_manager_integration.py
src/test/python/apache/thermos/monitoring/BUILD
src/test/python/apache/thermos/monitoring/test_disk.py
src/test/python/apache/thermos/monitoring/test_resource.py