I created a 16MB buffer for every client request, and it's a local 
variable, which means will be GCed soon. When I run a benchmark, the qps 
was much less than expected, only hundreds per second. By the cpu profiler, 
I found that GC used 77% of total cpu time. With --trace_gc option, there 
are many lines like this:

  785292 ms: Mark-sweep 9.5 (46.0) -> 9.4 (46.0) MB, 14 ms [external memory 
allocation limit reached] [GC in old space requested].

I've found in node src, and it's output by 
Heap::AdjustAmountOfExternalAllocatedMemory(), which is called in 
constructor and destructor of Class Buffer. And when 
amount_since_last_global_gc is more than external_allocation_limit_(default 
16MB), CollectAllGarbage() will be executed, which means with 
(16MB/buf_size) times new creation of Buffer, CollectAllGarbage() will be 
called once, which consume 14ms. 

external_allocation_limit_ is relative with v8-option of 
--max_new_space_size, but max_new_space_size is not available when v8 
snapshot is used, which is default true. I rebuild node with "./configure 
--without-snapshot", and run server with "--max_new_space_size=819200", and 
the performance is improved about 3 times. Although, GC is still expensive, 
with 30% of total cpu time.

So, you should be careful with large buffers.

-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to