我们一直在尝试使用Socket.IO部署一个小型NodeJS应用程序,并且遇到了一个问题,即当应用程序的堆大小仍然可以接受时,使用的总内存(rss)在大约2小时后爬升到2gb以上,并继续上升.
为了确保问题不在我们的代码中,我们部署了一个简单的应用程序,除了初始化Socket IO之外没有自定义逻辑.我们针对相同的生产流量运行,并遇到了同样的问题.
每隔10秒我们输出以下数据:rss内存使用量,堆总数,堆计数和连接数.这是输出的示例:
523898880 199490816 123040352 2001 537059328 209774080 163828336 2011 538578944 206714368 150879848 2031 535252992 199514880 156743280 2041 542162944 200522752 145077944 2039 539652096 195387136 129486792 2055 551006208 206726400 170918304 2070 553254912 205706496 156447496 2071 550584320 198482944 154005496 2076 564363264 209810176 140442920 2095 561176576 201578752 123214232 2118 562487296 200546816 110638376 2112 572096512 206714368 162713240 2133 569552896 200546816 147439016 2121 577777664 205682432 136653448 2115 582496256 207770368 121204056 2133 582909952 205706496 115449888 2153 597364736 215989760 164582600 2158 590491648 204686592 148962008 2158 598315008 209810176 137608840 2164 598249472 205718528 123472944 2188 607158272 211898112 160187496 2168 609869824 210866176 154986472 2161 618110976 214969856 142425488 2180 615014400 207782400 119745816 2188 623575040 214981888 163602944 2180 624717824 210842112 147051160 2189 627556352 210866176 142542800 2191 636477440 216013824 129968776 2203 643809280 221149440 162858408 2219 644407296 217057792 154994536 2224 642068480 211922176 141626008 2240 649084928 214969856 123126792 2267 662454272 224233216 166539024 2272 659439616 217045760 162742688 2258 662867968 217057792 137425392 2266 667013120 218065664 119616592 2261 673230848 220129536 172101080 2272 677904384 220129536 149771776 2267 676691968 217045760 129936448 2267 674639872 211898112 125941816 2277 689025024 223225344 163745856 2274 689991680 219109632 151478936 2282 698601472 225301248 137102712 2298 706170880 229428992 171321288 2306 705675264 224257280 160088496 2303 701198336 217033728 149326384 2313 701833216 216013824 129806072 2314 718053376 227365120 184078288 2335 718950400 223225344 157977312 2333 717037568 218065664 146137456 2354 714428416 210890240 136566344 2381
正如您所看到的,在相当短的时间内,总内存使用量增加了200mb,即使连接数仅增加了大约400.堆使用率保持大致相同,只是略高一点来考虑更高的连接计数.
我们在64位上运行Debian Wheezy.NodeJS版本为0.10.29,Socket IO版本为1.0.6.我们使用的代码是:
var http = require('http'), io = require('socket.io'); var app = http.createServer(); var server = io(app); app.listen(80); var connections = 0; server.on('connection', function(socket) { connections++; socket.on('disconnect', function() { connections--; }); }); setInterval(function() { var mem = process.memoryUsage(); console.log(mem.rss + ' ' + mem.heapTotal + ' ' + mem.heapUsed + ' ' + connections); }, 10000);
有什么方法可以找出为什么Node总共使用了这么多内存,或者有什么方法可以看到堆外发生的事情以试图找到内存泄漏?我们已经尝试了所有通常的技巧来检查堆使用情况并没有发现任何东西,但没想到,因为问题似乎不是堆上的内存.