> Are you saying that node, internally, delegates CPU intensive work to background threads?
What the heck are you talking about? There is no such feature and there shouldn't be. Are you just trolling? If so, quit it. On Thu, Oct 25, 2012 at 2:26 PM, Jorge <[email protected]> wrote: > Are you saying that node, internally, delegates CPU intensive work to > background threads? > > Heresy! > -- > Jorge. > > > On 25/10/2012, at 23:22, Vadim Antonov wrote: > > > We don't use threads by ourselves. It's default nodejs zlib library > implementation. > > -- > > Vadim > > > > On Thursday, October 25, 2012 2:16:35 PM UTC-7, Jorge 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 > -- 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
