src: reduce cpu profiler overhead
authorBen Noordhuis <info@bnoordhuis.nl>
Thu, 29 Jan 2015 17:48:30 +0000 (18:48 +0100)
committerBert Belder <bertbelder@gmail.com>
Wed, 4 Feb 2015 21:19:33 +0000 (22:19 +0100)
Reduce the overhead of the CPU profiler by suppressing SIGPROF signals
when sleeping / polling for events. Avoids unnecessary wakeups when the
CPU profiler is active.

The benefits are quite substantial on systems where it is expensive to
query the system time (most virtualized environments). Before, it was
common to see over 20% of wall clock time being spent on clock_gettime()
system calls.

PR: https://github.com/iojs/io.js/pull/466
Reviewed-by: Bert Belder <bertbelder@gmail.com>
src/node.cc

index 7c9032bf02945b452d5e69c6f80e407cf14d0c0d..4386d372b7460c9233bf365a6831be9b251f7230 100644 (file)
@@ -3384,6 +3384,10 @@ inline void PlatformInit() {
   RegisterSignalHandler(SIGINT, SignalExit, true);
   RegisterSignalHandler(SIGTERM, SignalExit, true);
 
+  // Block SIGPROF signals when sleeping in epoll_wait/kevent/etc.  Avoids the
+  // performance penalty of frequent EINTR wakeups when the profiler is running.
+  uv_loop_configure(uv_default_loop(), UV_LOOP_BLOCK_SIGNAL, SIGPROF);
+
   // Raise the open file descriptor limit.
   struct rlimit lim;
   if (getrlimit(RLIMIT_NOFILE, &lim) == 0 && lim.rlim_cur != lim.rlim_max) {