背景:nodejs做的http游戏服务器,通信协议用的protobuf。今天做压力测试,写了一个机器人逻辑,一个机器人跑10来条游戏主要逻辑。整体压测逻辑是 async.waterfall([ function(callback) { //登陆 callback(null); }, function(callback) { //取数据 callback(null); }, function(callback) { //一些其他游戏逻辑消息 callback(null); } ], function(err) { });
启动脚本如下: #!/bin/bash for ((i = 1; i <= 10; i++));do //10代表后台启动进程数量 { node robot.js $i 100 #100代表单进程机器人数量 } & done wait echo ‘shell over’
当机器人数量设置成200,并启动10个进程时,最终会启动2000个机器人。问题来了:每次启动1000个左右时,服务器就会报错: [ERROR] gameServer/handle/msg.js - { [Error: socket hang up] code: ‘ECONNRESET’ } Error: socket hang up at createHangUpError (_http_client.js:203:15) at Socket.socketOnEnd (_http_client.js:288:23) at emitNone (events.js:72:20) at Socket.emit (events.js:166:7) at endReadableNT (_stream_readable.js:905:12) at doNTCallback2 (node.js:441:9) at process._tickDomainCallback (node.js:396:17)
但是,我只启动10 * 100个机器人时不会报错。只有超过一定数量的机器人才会报错! 请问大家这是怎么回事啊???
- 检查 ulimit -n
- 有没有nginx, 你的nginx process和socket process都必须满足一定的ulimit
- 检查tcp/ip
- 检查memory
一步一步来
是一启动报错还是在压测时报错呢
@jiangliqin 压测开始一段时间是没事的,过一段时间后压测开始有报错。
@HelloKevinTian 貌似不能用for循环来压测的,建议你用siege或者ab。