summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2014-11-27 07:15:54 +0100
committerTrevor Norris <trev.norris@gmail.com>2015-01-12 16:49:07 -0800
commit6ebd85e10535dfaa9181842fe73834e51d4d3e6c (patch)
tree8365482db9da3ce70ca4a84d69a8b4bd392c3404
parentfe2019699add29bd903679b56498eef97dda2b4e (diff)
downloadnode-6ebd85e10535dfaa9181842fe73834e51d4d3e6c.tar.gz
v8: don't busy loop in cpu profiler thread
Reduce the overhead of the CPU profiler by replacing sched_yield() with nanosleep() in V8's tick event processor thread. The former only yields the CPU when there is another process scheduled on the same CPU. Before this commit, the thread would effectively busy loop and consume 100% CPU time. By forcing a one nanosecond sleep period rounded up to the task scheduler's granularity (about 50 us on Linux), CPU usage for the processor thread now hovers around 10-20% for a busy application. PR-URL: https://github.com/joyent/node/pull/8789 Ref: https://github.com/strongloop/strong-agent/issues/3 Reviewed-by: Trevor Norris <trev.norris@gmail.com>
-rw-r--r--deps/v8/src/platform-freebsd.cc5
-rw-r--r--deps/v8/src/platform-linux.cc5
-rw-r--r--deps/v8/src/platform-macos.cc5
-rw-r--r--deps/v8/src/platform-openbsd.cc5
-rw-r--r--deps/v8/src/platform-posix.cc6
-rw-r--r--deps/v8/src/platform-solaris.cc5
-rw-r--r--deps/v8/tools/gyp/v8.gyp2
7 files changed, 7 insertions, 26 deletions
diff --git a/deps/v8/src/platform-freebsd.cc b/deps/v8/src/platform-freebsd.cc
index 511759c48..5c90c6bda 100644
--- a/deps/v8/src/platform-freebsd.cc
+++ b/deps/v8/src/platform-freebsd.cc
@@ -539,11 +539,6 @@ void Thread::SetThreadLocal(LocalStorageKey key, void* value) {
}
-void Thread::YieldCPU() {
- sched_yield();
-}
-
-
class FreeBSDMutex : public Mutex {
public:
FreeBSDMutex() {
diff --git a/deps/v8/src/platform-linux.cc b/deps/v8/src/platform-linux.cc
index beb2ccee2..3d6b3044e 100644
--- a/deps/v8/src/platform-linux.cc
+++ b/deps/v8/src/platform-linux.cc
@@ -812,11 +812,6 @@ void Thread::SetThreadLocal(LocalStorageKey key, void* value) {
}
-void Thread::YieldCPU() {
- sched_yield();
-}
-
-
class LinuxMutex : public Mutex {
public:
LinuxMutex() {
diff --git a/deps/v8/src/platform-macos.cc b/deps/v8/src/platform-macos.cc
index a216f6e4c..e54e3e4a4 100644
--- a/deps/v8/src/platform-macos.cc
+++ b/deps/v8/src/platform-macos.cc
@@ -640,11 +640,6 @@ void Thread::SetThreadLocal(LocalStorageKey key, void* value) {
}
-void Thread::YieldCPU() {
- sched_yield();
-}
-
-
class MacOSMutex : public Mutex {
public:
MacOSMutex() {
diff --git a/deps/v8/src/platform-openbsd.cc b/deps/v8/src/platform-openbsd.cc
index 408d4dc0f..72167de92 100644
--- a/deps/v8/src/platform-openbsd.cc
+++ b/deps/v8/src/platform-openbsd.cc
@@ -593,11 +593,6 @@ void Thread::SetThreadLocal(LocalStorageKey key, void* value) {
}
-void Thread::YieldCPU() {
- sched_yield();
-}
-
-
class OpenBSDMutex : public Mutex {
public:
OpenBSDMutex() {
diff --git a/deps/v8/src/platform-posix.cc b/deps/v8/src/platform-posix.cc
index 5c3529d44..8aecd560e 100644
--- a/deps/v8/src/platform-posix.cc
+++ b/deps/v8/src/platform-posix.cc
@@ -392,6 +392,12 @@ void OS::StrNCpy(Vector<char> dest, const char* src, size_t n) {
}
+void Thread::YieldCPU() {
+ const timespec delay = { 0, 1 };
+ nanosleep(&delay, NULL);
+}
+
+
// ----------------------------------------------------------------------------
// POSIX socket support.
//
diff --git a/deps/v8/src/platform-solaris.cc b/deps/v8/src/platform-solaris.cc
index 07718fe50..4e95ecc6a 100644
--- a/deps/v8/src/platform-solaris.cc
+++ b/deps/v8/src/platform-solaris.cc
@@ -527,11 +527,6 @@ void Thread::SetThreadLocal(LocalStorageKey key, void* value) {
}
-void Thread::YieldCPU() {
- sched_yield();
-}
-
-
class SolarisMutex : public Mutex {
public:
SolarisMutex() {
diff --git a/deps/v8/tools/gyp/v8.gyp b/deps/v8/tools/gyp/v8.gyp
index 71cf36649..c30492590 100644
--- a/deps/v8/tools/gyp/v8.gyp
+++ b/deps/v8/tools/gyp/v8.gyp
@@ -715,7 +715,7 @@
['OS=="solaris"', {
'link_settings': {
'libraries': [
- '-lsocket -lnsl',
+ '-lsocket -lnsl -lrt',
]},
'sources': [
'../../src/platform-solaris.cc',