Repository: mesos Updated Branches: refs/heads/master 8e5ab0e30 -> 343b150ed
Dynamically change poll interval in the reaper. If pid count <= 50 then use 100 ms (<= 0.5% core usage), if count >= 500 use 1000 ms (<= 1% core usage at 500 pids), else interpolate. Review: https://reviews.apache.org/r/25947 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/343b150e Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/343b150e Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/343b150e Branch: refs/heads/master Commit: 343b150ed4a6649a7b0389f5da3974ed77c90924 Parents: 8e5ab0e Author: Ian Downes <[email protected]> Authored: Mon Sep 22 17:44:07 2014 -0700 Committer: Ian Downes <[email protected]> Committed: Fri Sep 26 10:13:26 2014 -0700 ---------------------------------------------------------------------- 3rdparty/libprocess/src/reap.cpp | 43 +++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/343b150e/3rdparty/libprocess/src/reap.cpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/src/reap.cpp b/3rdparty/libprocess/src/reap.cpp index b350ee1..ac14a86 100644 --- a/3rdparty/libprocess/src/reap.cpp +++ b/3rdparty/libprocess/src/reap.cpp @@ -23,7 +23,29 @@ namespace process { // TODO(bmahler): This can be optimized to use a thread per pid, where // each thread makes a blocking call to waitpid. This eliminates the -// unfortunate 1 second reap delay. +// unfortunate poll delay. +// +// Simple bounded linear model for computing the poll interval. +// Values were chosen such that at (50 pids, 100 ms) the CPU usage is +// less than approx. 0.5% of a single core, and at (500 pids, 1000 ms) +// less than approx. 1.0% of single core. Tested on Linux 3.10 with +// Intel Xeon E5620 and OSX 10.9 with Intel i7 4980HQ. +// +// 1000ms _____ +// / +// (interval) / +// / +// 100ms -----/ +// 50 500 +// +// (# pids) +// +const size_t LOW_PID_COUNT = 50; +const Duration LOW_INTERVAL = Milliseconds(100); + +const size_t HIGH_PID_COUNT = 500; +const Duration HIGH_INTERVAL = Seconds(1); + class ReaperProcess : public Process<ReaperProcess> { @@ -68,7 +90,7 @@ protected: } } - delay(Seconds(1), self(), &ReaperProcess::wait); // Reap forever! + delay(interval(), self(), &ReaperProcess::wait); // Reap forever! } void notify(pid_t pid, Result<int> status) @@ -86,6 +108,23 @@ protected: } private: + const Duration interval() + { + size_t count = promises.size(); + + if (count <= LOW_PID_COUNT) { + return LOW_INTERVAL; + } else if (count >= HIGH_PID_COUNT) { + return HIGH_INTERVAL; + } + + // Linear interpolation between LOW_INTERVAL and HIGH_INTERVAL. + double fraction = + ((double) (count - LOW_PID_COUNT) / (HIGH_PID_COUNT - LOW_PID_COUNT)); + + return LOW_INTERVAL + (HIGH_INTERVAL - LOW_INTERVAL) * fraction; + } + multihashmap<pid_t, Owned<Promise<Option<int> > > > promises; };
