From 02c3b01f0e3398c5e701636229e36ce5861233da Mon Sep 17 00:00:00 2001 From: Vladimir Dronnikov Date: Fri, 1 Jul 2011 02:51:46 -0400 Subject: [PATCH 1/5] added leaking stress tests. need to employ ned backpressure feature --- tests/stress/codec.js | 14 +++++ tests/stress/pubsub/pub.js | 13 +++++ tests/stress/pubsub/run | 3 ++ tests/stress/pubsub/server.js | 22 ++++++++ tests/stress/rpushblpop/pub.js | 13 +++++ tests/stress/rpushblpop/run | 3 ++ tests/stress/rpushblpop/server.js | 26 +++++++++ tests/stress/speed/00 | 13 +++++ tests/stress/speed/plot | 13 +++++ tests/stress/speed/size-rate.png | Bin 0 -> 6672 bytes tests/stress/speed/speed.js | 84 ++++++++++++++++++++++++++++++ 11 files changed, 204 insertions(+) create mode 100644 tests/stress/codec.js create mode 100644 tests/stress/pubsub/pub.js create mode 100755 tests/stress/pubsub/run create mode 100644 tests/stress/pubsub/server.js create mode 100644 tests/stress/rpushblpop/pub.js create mode 100755 tests/stress/rpushblpop/run create mode 100644 tests/stress/rpushblpop/server.js create mode 100644 tests/stress/speed/00 create mode 100755 tests/stress/speed/plot create mode 100644 tests/stress/speed/size-rate.png create mode 100644 tests/stress/speed/speed.js diff --git a/tests/stress/codec.js b/tests/stress/codec.js new file mode 100644 index 0000000000..f963e8fdfa --- /dev/null +++ b/tests/stress/codec.js @@ -0,0 +1,14 @@ +var json = { + encode: JSON.stringify, + decode: JSON.parse +}; + +/*var msgpack = require('node-msgpack'); +msgpack = { + encode: msgpack.pack, + decode: msgpack.unpack +};*/ + +bison = require('bison'); + +module.exports = json; diff --git a/tests/stress/pubsub/pub.js b/tests/stress/pubsub/pub.js new file mode 100644 index 0000000000..1a6301632a --- /dev/null +++ b/tests/stress/pubsub/pub.js @@ -0,0 +1,13 @@ +'use strict'; + +var codec = require('../codec'); + +var pub = require('redis').createClient() + .on('ready', function() { + while (true) { + pub.publish('timeline', codec.encode({ + cmd: Math.random(), + data: Math.random() + })); + } + }); diff --git a/tests/stress/pubsub/run b/tests/stress/pubsub/run new file mode 100755 index 0000000000..5b50d70712 --- /dev/null +++ b/tests/stress/pubsub/run @@ -0,0 +1,3 @@ +#!/bin/sh +node server.js & +node pub.js diff --git a/tests/stress/pubsub/server.js b/tests/stress/pubsub/server.js new file mode 100644 index 0000000000..568e275c22 --- /dev/null +++ b/tests/stress/pubsub/server.js @@ -0,0 +1,22 @@ +'use strict'; + +var freemem = require('os').freemem; +var codec = require('../codec'); + +var recv = 0; + +var sub = require('redis').createClient() + .on('ready', function() { + this.subscribe('timeline'); + }) + .on('message', function(channel, message) { + var self = this; + if (message) { + message = codec.decode(message); + ++recv; + } + }); + +setInterval(function() { + console.log('received', recv, 'free', freemem()); +}, 1000); diff --git a/tests/stress/rpushblpop/pub.js b/tests/stress/rpushblpop/pub.js new file mode 100644 index 0000000000..85166b14bc --- /dev/null +++ b/tests/stress/rpushblpop/pub.js @@ -0,0 +1,13 @@ +'use strict'; + +var codec = require('../codec'); + +var pub = require('redis').createClient() + .on('ready', function() { + while (true) { + pub.rpush('timeline', codec.encode({ + cmd: Math.random(), + data: Math.random() + })); + } + }); diff --git a/tests/stress/rpushblpop/run b/tests/stress/rpushblpop/run new file mode 100755 index 0000000000..5b50d70712 --- /dev/null +++ b/tests/stress/rpushblpop/run @@ -0,0 +1,3 @@ +#!/bin/sh +node server.js & +node pub.js diff --git a/tests/stress/rpushblpop/server.js b/tests/stress/rpushblpop/server.js new file mode 100644 index 0000000000..0af0b65624 --- /dev/null +++ b/tests/stress/rpushblpop/server.js @@ -0,0 +1,26 @@ +'use strict'; + +var freemem = require('os').freemem; +var codec = require('../codec'); + +var recv = 0; + +var sub = require('redis').createClient() + .on('ready', function() { + this.emit('timeline'); + }) + .on('timeline', function() { + var self = this; + this.blpop('timeline', 0, function(err, result) { + var message = result[1]; + if (message) { + message = codec.decode(message); + ++recv; + } + self.emit('timeline'); + }); + }); + +setInterval(function() { + console.log('received', recv, 'free', freemem()); +}, 1000); diff --git a/tests/stress/speed/00 b/tests/stress/speed/00 new file mode 100644 index 0000000000..29d7bf7c5d --- /dev/null +++ b/tests/stress/speed/00 @@ -0,0 +1,13 @@ +# size JSON msgpack bison +26602 2151.0170848180414 +25542 ? 2842.589272665782 +24835 ? ? 7280.4538397469805 +6104 6985.234528557929 +5045 ? 7217.461392841478 +4341 ? ? 14261.406335354604 +4180 15864.633685636572 +4143 ? 12954.806235781925 +4141 ? ? 44650.70733912719 +75 114227.07313350472 +40 ? 30162.440062810834 +39 ? ? 119815.66013519121 diff --git a/tests/stress/speed/plot b/tests/stress/speed/plot new file mode 100755 index 0000000000..2563797cf5 --- /dev/null +++ b/tests/stress/speed/plot @@ -0,0 +1,13 @@ +#!/bin/sh + +gnuplot >size-rate.jpg << _EOF_ + +set terminal png nocrop enhanced font verdana 12 size 640,480 +set logscale x +set logscale y +set grid +set xlabel 'Serialized object size, octets' +set ylabel 'decode(encode(obj)) rate, 1/sec' +plot '00' using 1:2 title 'json' smooth bezier, '00' using 1:3 title 'msgpack' smooth bezier, '00' using 1:4 title 'bison' smooth bezier + +_EOF_ diff --git a/tests/stress/speed/size-rate.png b/tests/stress/speed/size-rate.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c2bee6b076040ccf7e6bc337c307732c400463 GIT binary patch literal 6672 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 H#^C-7XAtZ( literal 0 HcmV?d00001 diff --git a/tests/stress/speed/speed.js b/tests/stress/speed/speed.js new file mode 100644 index 0000000000..8e43cbc03b --- /dev/null +++ b/tests/stress/speed/speed.js @@ -0,0 +1,84 @@ +var msgpack = require('node-msgpack'); +var bison = require('bison'); +var codec = { + JSON: { + encode: JSON.stringify, + decode: JSON.parse + }, + msgpack: { + encode: msgpack.pack, + decode: msgpack.unpack + }, + bison: bison +}; + +var obj, l; + +var s = '0'; +for (var i = 0; i < 12; ++i) s += s; + +obj = { + foo: s, + arrrrrr: [{a:1,b:false,c:null,d:1.0}, 1111, 2222, 33333333], + rand: [], + a: s, + ccc: s, + b: s + s + s +}; +for (i = 0; i < 100; ++i) obj.rand.push(Math.random()); +forObj(obj); + +obj = { + foo: s, + arrrrrr: [{a:1,b:false,c:null,d:1.0}, 1111, 2222, 33333333], + rand: [] +}; +for (i = 0; i < 100; ++i) obj.rand.push(Math.random()); +forObj(obj); + +obj = { + foo: s, + arrrrrr: [{a:1,b:false,c:null,d:1.0}, 1111, 2222, 33333333], + rand: [] +}; +forObj(obj); + +obj = { + arrrrrr: [{a:1,b:false,c:null,d:1.0}, 1111, 2222, 33333333], + rand: [] +}; +forObj(obj); + +function run(obj, codec) { + var t1 = Date.now(); + var n = 10000; + for (var i = 0; i < n; ++i) { + codec.decode(l = codec.encode(obj)); + } + var t2 = Date.now(); + //console.log('DONE', n*1000/(t2-t1), 'codecs/sec, length=', l.length); + return [n*1000/(t2-t1), l.length]; +} + +function series(obj, cname, n) { + var rate = 0; + var len = 0; + for (var i = 0; i < n; ++i) { + var r = run(obj, codec[cname]); + rate += r[0]; + len += r[1]; + } + rate /= n; + len /= n; + console.log(cname + ' ' + rate + ' ' + len); + return [rate, len]; +} + +function forObj(obj) { + var r = { + JSON: series(obj, 'JSON', 20), + msgpack: series(obj, 'msgpack', 20), + bison: series(obj, 'bison', 20) + }; + return r; +} From 9a4e51ee4011ed2fa1ac5d28e1fc6e341987a2ed Mon Sep 17 00:00:00 2001 From: Vladimir Dronnikov Date: Fri, 1 Jul 2011 03:46:50 -0400 Subject: [PATCH 2/5] fix for buffered_writes -- now drain event works --- index.js | 2 +- tests/stress/pubsub/pub.js | 38 +++++++++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index 33ea41042b..f4eacd0a63 100644 --- a/index.js +++ b/index.js @@ -286,7 +286,7 @@ RedisClient.prototype.send_offline_queue = function () { this.offline_queue = new Queue(); // Even though items were shifted off, Queue backing store still uses memory until next add, so just get a new Queue - if (buffered_writes === 0) { + if (!buffered_writes) { this.should_buffer = false; this.emit("drain"); } diff --git a/tests/stress/pubsub/pub.js b/tests/stress/pubsub/pub.js index 1a6301632a..536641cdf1 100644 --- a/tests/stress/pubsub/pub.js +++ b/tests/stress/pubsub/pub.js @@ -1,13 +1,33 @@ 'use strict'; +var freemem = require('os').freemem; var codec = require('../codec'); -var pub = require('redis').createClient() - .on('ready', function() { - while (true) { - pub.publish('timeline', codec.encode({ - cmd: Math.random(), - data: Math.random() - })); - } - }); +var sent = 0; + +var pub = require('redis').createClient(null, null, { + command_queue_high_water: 5, + command_queue_low_water: 1 +}) +.on('ready', function() { + this.emit('drain'); +}) +.on('drain', function() { + process.nextTick(exec); +}); + +var payload = '1'; for (var i = 0; i < 10; ++i) payload += payload; + +function exec() { + pub.publish('timeline', codec.encode({ foo: payload })); + ++sent; + if (!pub.should_buffer) { + process.nextTick(exec); + } +} + +exec(); + +setInterval(function() { + console.log('sent', sent, 'free', freemem(), 'cmdqlen', pub.command_queue.length, 'offqlen', pub.offline_queue.length); +}, 1000); From cc2c3f7776cf0acb7f6132665f84595e7f940ab6 Mon Sep 17 00:00:00 2001 From: Vladimir Dronnikov Date: Fri, 1 Jul 2011 04:27:59 -0400 Subject: [PATCH 3/5] another pub/sub strategy --- tests/stress/codec.js | 10 ++++---- tests/stress/pubsub/pub.js | 4 ++-- tests/stress/rpushblpop/pub.js | 42 +++++++++++++++++++++++++++------- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/tests/stress/codec.js b/tests/stress/codec.js index f963e8fdfa..29276cab8c 100644 --- a/tests/stress/codec.js +++ b/tests/stress/codec.js @@ -3,12 +3,14 @@ var json = { decode: JSON.parse }; -/*var msgpack = require('node-msgpack'); +var MsgPack = require('node-msgpack'); msgpack = { - encode: msgpack.pack, - decode: msgpack.unpack -};*/ + encode: MsgPack.pack, + decode: function(str) { return MsgPack.unpack(new Buffer(str)); } +}; bison = require('bison'); module.exports = json; +//module.exports = msgpack; +module.exports = bison; diff --git a/tests/stress/pubsub/pub.js b/tests/stress/pubsub/pub.js index 536641cdf1..731b4479c2 100644 --- a/tests/stress/pubsub/pub.js +++ b/tests/stress/pubsub/pub.js @@ -6,8 +6,8 @@ var codec = require('../codec'); var sent = 0; var pub = require('redis').createClient(null, null, { - command_queue_high_water: 5, - command_queue_low_water: 1 + //command_queue_high_water: 5, + //command_queue_low_water: 1 }) .on('ready', function() { this.emit('drain'); diff --git a/tests/stress/rpushblpop/pub.js b/tests/stress/rpushblpop/pub.js index 85166b14bc..503ffb17dc 100644 --- a/tests/stress/rpushblpop/pub.js +++ b/tests/stress/rpushblpop/pub.js @@ -1,13 +1,39 @@ 'use strict'; +var freemem = require('os').freemem; var codec = require('../codec'); -var pub = require('redis').createClient() - .on('ready', function() { - while (true) { - pub.rpush('timeline', codec.encode({ - cmd: Math.random(), - data: Math.random() - })); - } +var sent = 0; + +var pub = require('redis').createClient(null, null, { + //command_queue_high_water: 5, + //command_queue_low_water: 1 +}) +.on('ready', function() { + this.del('timeline'); + this.emit('drain'); +}) +.on('drain', function() { + process.nextTick(exec); +}); + +var payload = '1'; for (var i = 0; i < 10; ++i) payload += payload; + +function exec() { + pub.rpush('timeline', codec.encode({ foo: payload })); + ++sent; + if (!pub.should_buffer) { + process.nextTick(exec); + } +} + +exec(); + +setInterval(function() { + pub.llen('timeline', function(err, result) { + console.log('sent', sent, 'free', freemem(), + 'cmdqlen', pub.command_queue.length, 'offqlen', pub.offline_queue.length, + 'llen', result + ); }); +}, 1000); From f93af92facf2654cca7f2c47f1f8c55d6f8bb1f3 Mon Sep 17 00:00:00 2001 From: Vladimir Dronnikov Date: Fri, 1 Jul 2011 08:40:02 -0400 Subject: [PATCH 4/5] updated stress tests --- tests/stress/codec.js | 2 +- tests/stress/pubsub/pub.js | 10 +++++++--- tests/stress/pubsub/run | 4 +++- tests/stress/pubsub/server.js | 5 +++-- tests/stress/rpushblpop/pub.js | 16 +++++++++++++--- tests/stress/rpushblpop/run | 5 ++++- tests/stress/rpushblpop/server.js | 8 ++++++-- 7 files changed, 37 insertions(+), 13 deletions(-) diff --git a/tests/stress/codec.js b/tests/stress/codec.js index 29276cab8c..1a9ceb67ab 100644 --- a/tests/stress/codec.js +++ b/tests/stress/codec.js @@ -11,6 +11,6 @@ msgpack = { bison = require('bison'); -module.exports = json; +//module.exports = json; //module.exports = msgpack; module.exports = bison; diff --git a/tests/stress/pubsub/pub.js b/tests/stress/pubsub/pub.js index 731b4479c2..01e30e65aa 100644 --- a/tests/stress/pubsub/pub.js +++ b/tests/stress/pubsub/pub.js @@ -1,6 +1,7 @@ 'use strict'; var freemem = require('os').freemem; +var profiler = require('v8-profiler'); var codec = require('../codec'); var sent = 0; @@ -16,7 +17,7 @@ var pub = require('redis').createClient(null, null, { process.nextTick(exec); }); -var payload = '1'; for (var i = 0; i < 10; ++i) payload += payload; +var payload = '1'; for (var i = 0; i < 12; ++i) payload += payload; function exec() { pub.publish('timeline', codec.encode({ foo: payload })); @@ -26,8 +27,11 @@ function exec() { } } +profiler.takeSnapshot('s_0'); + exec(); setInterval(function() { - console.log('sent', sent, 'free', freemem(), 'cmdqlen', pub.command_queue.length, 'offqlen', pub.offline_queue.length); -}, 1000); + profiler.takeSnapshot('s_' + sent); + console.error('sent', sent, 'free', freemem(), 'cmdqlen', pub.command_queue.length, 'offqlen', pub.offline_queue.length); +}, 2000); diff --git a/tests/stress/pubsub/run b/tests/stress/pubsub/run index 5b50d70712..067cb71dd2 100755 --- a/tests/stress/pubsub/run +++ b/tests/stress/pubsub/run @@ -1,3 +1,5 @@ #!/bin/sh node server.js & -node pub.js +node server.js & +node server.js & +node --debug pub.js diff --git a/tests/stress/pubsub/server.js b/tests/stress/pubsub/server.js index 568e275c22..035e6b7440 100644 --- a/tests/stress/pubsub/server.js +++ b/tests/stress/pubsub/server.js @@ -3,6 +3,7 @@ var freemem = require('os').freemem; var codec = require('../codec'); +var id = Math.random(); var recv = 0; var sub = require('redis').createClient() @@ -18,5 +19,5 @@ var sub = require('redis').createClient() }); setInterval(function() { - console.log('received', recv, 'free', freemem()); -}, 1000); + console.error('id', id, 'received', recv, 'free', freemem()); +}, 2000); diff --git a/tests/stress/rpushblpop/pub.js b/tests/stress/rpushblpop/pub.js index 503ffb17dc..000458711f 100644 --- a/tests/stress/rpushblpop/pub.js +++ b/tests/stress/rpushblpop/pub.js @@ -1,6 +1,7 @@ 'use strict'; var freemem = require('os').freemem; +//var profiler = require('v8-profiler'); var codec = require('../codec'); var sent = 0; @@ -17,7 +18,8 @@ var pub = require('redis').createClient(null, null, { process.nextTick(exec); }); -var payload = '1'; for (var i = 0; i < 10; ++i) payload += payload; +var payload = '1'; for (var i = 0; i < 12; ++i) payload += payload; +console.log(payload.length); function exec() { pub.rpush('timeline', codec.encode({ foo: payload })); @@ -27,13 +29,21 @@ function exec() { } } +//profiler.takeSnapshot('s_0'); + exec(); setInterval(function() { + //var ss = profiler.takeSnapshot('s_' + sent); + //console.error(ss.stringify()); pub.llen('timeline', function(err, result) { - console.log('sent', sent, 'free', freemem(), + console.error('sent', sent, 'free', freemem(), 'cmdqlen', pub.command_queue.length, 'offqlen', pub.offline_queue.length, 'llen', result ); }); -}, 1000); +}, 2000); + +/*setTimeout(function() { + process.exit(); +}, 30000);*/ diff --git a/tests/stress/rpushblpop/run b/tests/stress/rpushblpop/run index 5b50d70712..5f9073074a 100755 --- a/tests/stress/rpushblpop/run +++ b/tests/stress/rpushblpop/run @@ -1,3 +1,6 @@ #!/bin/sh node server.js & -node pub.js +node server.js & +node server.js & +node server.js & +node --debug pub.js diff --git a/tests/stress/rpushblpop/server.js b/tests/stress/rpushblpop/server.js index 0af0b65624..9cbcdd9ed7 100644 --- a/tests/stress/rpushblpop/server.js +++ b/tests/stress/rpushblpop/server.js @@ -3,8 +3,10 @@ var freemem = require('os').freemem; var codec = require('../codec'); +var id = Math.random(); var recv = 0; +var cmd = require('redis').createClient(); var sub = require('redis').createClient() .on('ready', function() { this.emit('timeline'); @@ -22,5 +24,7 @@ var sub = require('redis').createClient() }); setInterval(function() { - console.log('received', recv, 'free', freemem()); -}, 1000); + cmd.llen('timeline', function(err, result) { + console.error('id', id, 'received', recv, 'free', freemem(), 'llen', result); + }); +}, 2000); From 607cd71208b39812915054c590778bb44ec9451b Mon Sep 17 00:00:00 2001 From: Vladimir Dronnikov Date: Fri, 1 Jul 2011 09:27:03 -0400 Subject: [PATCH 5/5] hz --- tests/stress/codec.js | 4 ++-- tests/stress/pubsub/pub.js | 1 + tests/stress/pubsub/run | 5 +++++ tests/stress/rpushblpop/pub.js | 2 +- tests/stress/rpushblpop/run | 6 +++--- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/tests/stress/codec.js b/tests/stress/codec.js index 1a9ceb67ab..7d764f6072 100644 --- a/tests/stress/codec.js +++ b/tests/stress/codec.js @@ -11,6 +11,6 @@ msgpack = { bison = require('bison'); -//module.exports = json; +module.exports = json; //module.exports = msgpack; -module.exports = bison; +//module.exports = bison; diff --git a/tests/stress/pubsub/pub.js b/tests/stress/pubsub/pub.js index 01e30e65aa..0acde7a6eb 100644 --- a/tests/stress/pubsub/pub.js +++ b/tests/stress/pubsub/pub.js @@ -18,6 +18,7 @@ var pub = require('redis').createClient(null, null, { }); var payload = '1'; for (var i = 0; i < 12; ++i) payload += payload; +console.log('Message payload length', payload.length); function exec() { pub.publish('timeline', codec.encode({ foo: payload })); diff --git a/tests/stress/pubsub/run b/tests/stress/pubsub/run index 067cb71dd2..bd9ac39253 100755 --- a/tests/stress/pubsub/run +++ b/tests/stress/pubsub/run @@ -2,4 +2,9 @@ node server.js & node server.js & node server.js & +node server.js & +node server.js & +node server.js & +node server.js & +node server.js & node --debug pub.js diff --git a/tests/stress/rpushblpop/pub.js b/tests/stress/rpushblpop/pub.js index 000458711f..9caf1d0b82 100644 --- a/tests/stress/rpushblpop/pub.js +++ b/tests/stress/rpushblpop/pub.js @@ -19,7 +19,7 @@ var pub = require('redis').createClient(null, null, { }); var payload = '1'; for (var i = 0; i < 12; ++i) payload += payload; -console.log(payload.length); +console.log('Message payload length', payload.length); function exec() { pub.rpush('timeline', codec.encode({ foo: payload })); diff --git a/tests/stress/rpushblpop/run b/tests/stress/rpushblpop/run index 5f9073074a..8045ae8045 100755 --- a/tests/stress/rpushblpop/run +++ b/tests/stress/rpushblpop/run @@ -1,6 +1,6 @@ #!/bin/sh node server.js & -node server.js & -node server.js & -node server.js & +#node server.js & +#node server.js & +#node server.js & node --debug pub.js