node.js - NodeJs的Redis客户端遇到failed - connect EMFILE错误
迷茫
迷茫 2017-04-17 11:11:51
0
1
607

程序很简单,就是得到http请求后,用一个参数作为Key去blpop一个Redis实例,如果超时就关掉Redis客户端返回空字典的json,如果超时前得到了push的数据就返回数据,最后关掉Redis连接。
结果在Redis用info得到connected client数量才2000多的时候,Nodejs的redis客户端就开始连接出错,然后报

error:Error: Redis connection to xxx.xxx.xxx.xxx - connect EMFILE

events.js:72
throw er; // Unhandled 'error' event
^
Error: Redis connection to xxx.xxx.xxx.xxx:6379 failed - connect EMFILE
at RedisClient.on_error (/var/www/ncodoon/message/broker/node_modules/redis/index.js:185:24)
at Socket. (/var/www/ncodoon/message/broker/node_modules/redis/index.js:95:14)
at Socket.EventEmitter.emit (events.js:95:17)
at net.js:440:14
at process._tickCallback (node.js:415:13)

Redis所在服务器的ulimit -n 是102400,Nodejs所在服务器的也是这个数。离限制还早得很呢。所以叫改ulimit的可以退散了。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(1)
Peter_Zhu

EMFILE 就是打开的文件过多的意思。

誰告訴你執行 ulimit 命令了?這個命令執行之後,隻對其子進程有效。要對係統全局生效,需要配置 /etc/sysctl.conf 文件(並執行 sysctl -p 加載之)。當然使用 sysctl 命令直接修改也是可以的。

你可以通過閱讀 /proc/<pid>/limits 文件來取得指定進程的資源限製設置,以確定你的設置是否已確實對該進程生效。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板