Browse Source

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>
v0.10.36-release
Ben Noordhuis 10 years ago
committed by Trevor Norris
parent
commit
6ebd85e105
  1. 5
      deps/v8/src/platform-freebsd.cc
  2. 5
      deps/v8/src/platform-linux.cc
  3. 5
      deps/v8/src/platform-macos.cc
  4. 5
      deps/v8/src/platform-openbsd.cc
  5. 6
      deps/v8/src/platform-posix.cc
  6. 5
      deps/v8/src/platform-solaris.cc
  7. 2
      deps/v8/tools/gyp/v8.gyp

5
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() {

5
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() {

5
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() {

5
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() {

6
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.
//

5
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() {

2
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',

Loading…
Cancel
Save