I’m setting up a Chef-based Ubuntu VM on my laptop, so I can get sandboxing and all the usual Ubuntu tools. Most things work on OS X too, but it’s a second-class citizen compared to poster child Ubuntu. I have Mongo and a few services set up there, for school stuff, and I noticed that Mongo regularly uses a significant amount of CPU time, even when it’s not handling any requests.
I attached strace to it with strace -f -p 1056
, and here’s what I saw:
[pid 1118] select(12, [11], NULL, NULL, {0, 10000} <unfinished ...> [pid 1056] select(11, [9 10], NULL, NULL, {0, 10000} <unfinished ...> [pid 1118] <... select resumed> ) = 0 (Timeout) [pid 1056] <... select resumed> ) = 0 (Timeout) [pid 1118] select(12, [11], NULL, NULL, {0, 10000} <unfinished ...> [pid 1056] select(11, [9 10], NULL, NULL, {0, 10000} <unfinished ...> [pid 1112] <... nanosleep resumed> 0x7fd3895319a0) = 0 [pid 1112] nanosleep({0, 34000000}, <unfinished ...> [pid 1118] <... select resumed> ) = 0 (Timeout) [pid 1056] <... select resumed> ) = 0 (Timeout) [pid 1118] select(12, [11], NULL, NULL, {0, 10000} <unfinished ...> [pid 1056] select(11, [9 10], NULL, NULL, {0, 10000} <unfinished ...> [pid 1118] <... select resumed> ) = 0 (Timeout) [pid 1056] <... select resumed> ) = 0 (Timeout) [pid 1118] select(12, [11], NULL, NULL, {0, 10000} <unfinished ...> [pid 1056] select(11, [9 10], NULL, NULL, {0, 10000} <unfinished ...> [pid 1118] <... select resumed> ) = 0 (Timeout) [pid 1056] <... select resumed> ) = 0 (Timeout) [pid 1118] select(12, [11], NULL, NULL, {0, 10000} <unfinished ...> [pid 1056] select(11, [9 10], NULL, NULL, {0, 10000} <unfinished ...> [pid 1112] <... nanosleep resumed> 0x7fd3895319a0) = 0
I looked online for an explanation, and I found this bug about MongoDB power usage. Apparently, it uses select() as a way to do timekeeping for all the ways Mongo uses wall time. Somebody proposed that alternative methods be used instead, which don’t require this kind of tight looping, but it looks like the Mongo team is busy with other stuff right now and won’t consider the patch.
So I added a clause in my Chef config to disable the MongoDB service from starting automatically on boot. I needed to specify the Upstart service provider explicitly in the configuration, since the mongodb package installs both a SysV script and Upstart manifest.