Jorge,

Please do not make snarky remarks about Node on this mailing list.  If
you have a problem with something, bring it up in a new thread.  If
you have something to add to this thread, then please do so, but this
is not helpful.


On Thu, Oct 25, 2012 at 10:15 PM, Jorge <[email protected]> wrote:
> Threads are evil™, don't use threads.
>
> The Node Way® (just don't ask) is to pipeline processes as in the good ol' 
> 70s. Flower Power, peace and love bro, and etc.
>
> Cheers,
> --
> Jorge.
>
> On 25/10/2012, at 19:24, Vadim Antonov wrote:
>
>> There're 8 processes (1 per core, created with cluster lib) and every 
>> process has got 6 threads.
>> Do you have an ETA for the thread pool updates? Is there a way how can we 
>> help you?
>>
>> Thank you.
>> --
>> Vadim
>>
>> On Wednesday, October 24, 2012 5:41:36 PM UTC-7, Ben Noordhuis wrote:
>> On Thu, Oct 25, 2012 at 12:26 AM, Vadim Antonov <[email protected]> wrote:
>> > Hi everybody,
>> >
>> > I've tried to google about the nodejs zlib performance and didn't find any
>> > useful information.
>> > I work on the high-loaded API which communicates with multiple backend
>> > servers. Throughput on 1 VM with 8 cores is around 200 QPS and for every
>> > query application makes up to 50 queries to cache/backends. Every response
>> > from cache/backends is compressed and requires decompression.
>> > It ends up that application need to make up too 10000 decompressions per
>> > second.
>> >
>> > Based on the zlib code for every decompression new thread from the thread
>> > pool is being used (one binding to the C++ code per decompression, we use
>> > naive method http://nodejs.org/api/zlib.html#zlib_zlib_gunzip_buf_callback 
>> > -
>> > there is no way to use the stream methods):
>> > https://github.com/joyent/node/blob/master/lib/zlib.js#L272
>> > https://github.com/joyent/node/blob/master/src/node_zlib.cc#L430
>> >
>> > Service has started to see huge performance spikes a couple of times during
>> > the day which are coming from the decompression code: from time to time
>> > decompression takes up to 5 seconds and  all decompression calls are 
>> > blocked
>> > during this time.
>> > I think that the issue is coming from the thread pool (uv_work_t) which 
>> > zlib
>> > is using. Does anybody else see the same behavior? Is there any workarounds
>> > for it? Where can I find documentation about it? V8 code?
>> > At this point of time we've started to use snappy library
>> > (https://github.com/kesla/node-snappy) with sync compression/decompression
>> > calls. But service still need to decompress backend responses with gzip...
>> >
>> > To illustrate a little bit what I'm talking about, here is a small example
>> > (it generate 'count' buffers, decompresses them 'count2' times and writes
>> > all + min/max/avg timings).
>> >
>> > var _ = require('underscore');
>> > var rbytes = require('rbytes');
>> > var step = require('step');
>> > var zlib = require('zlib');
>> >
>> > var count = 10;
>> > var count2 = 1000;
>> > var count3 = 0;
>> > var len = 1024;
>> > var buffers = [];
>> > var timings = {};
>> > var totalTime = 0;
>> > var concurrent = 0;
>> > var maxConcurrent = 128;
>> >
>> > function addCompressed(done) {
>> >     zlib.gzip(rbytes.randomBytes(len), function (error, compressed) {
>> >         buffers.push(compressed);
>> >         done();
>> >     });
>> > }
>> >
>> > function decompress(done) {
>> >     var time = Date.now();
>> >     zlib.gunzip(buffers[Math.floor(Math.random() * count)], function 
>> > (error,
>> > decompresed) {
>> >         if (error) {
>> >             console.log(error);
>> >         }
>> >         var total = Date.now() - time;
>> >         totalTime += total;
>> >         if (!timings[total]) {
>> >             timings[total] = 0;
>> >         }
>> >         timings[total]++;
>> >         ++count3;
>> >         if (done && count3 == count2) {
>> >             done();
>> >         }
>> >     });
>> > }
>> >
>> > step(
>> >     function genBuffers() {
>> >         for(var i = 0; i < count; ++i) {
>> >             var next = this.parallel();
>> >             addCompressed(next);
>> >         }
>> >     },
>> >     function runDecompression() {
>> >         var next = this;
>> >         for(var i = 0; i < count2; ++i) {
>> >             decompress(next);
>> >         }
>> >     },
>> >     function writeTotal() {
>> >         var min = null;
>> >         var max = -1;
>> >         _.each(timings, function(total, value) {
>> >             max = Math.max(value, max);
>> >             min = min ? Math.min(min, value) : value;
>> >             console.log(value + ' ' + total);
>> >         });
>> >         console.log('min ' + min);
>> >         console.log('max ' + max);
>> >         console.log('avg ' + totalTime / count2);
>> >     }
>> > );
>> >
>> > Here'are results for different amount decompressions (amount of
>> > compressions, min/max/avg timings):
>> > 10        0       1      0.1
>> > 100       1       6      3.8
>> > 1000     19      47     30.7
>> > 10000   149     382    255.0
>> > 100000 4120   18607  16094.3
>> >
>> > Decompression time grows based on the amount of concurrent decompressions.
>> > Is there a way to make it faster/limit amount of threads which zlib is
>> > using?
>>
>> How many active threads do you see in e.g. htop? There should
>> preferably be as many threads as there are cores in your machine (give
>> or take one).
>>
>> Aside, the current thread pool implementation is a known bottleneck in
>> node right now. We're working on addressing that in master but it's
>> not done yet.
>>
>> --
>> 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
>
> --
> 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

-- 
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