我的NodeJS API遇到了一些问题。
有时候,它会返回ConnectionError: getaddrinfo EMFILE
,并且在此之后都是fuc **。
所以,我开始调查了。我发现它会由“打开多个文件描述符”引起。我们显然可以增加已授权的打开文件的数量,但它不一定能解决问题。
我在this article中发现,我们可以增加文件描述符设置和ulimit。但有什么区别?
然后,为了尝试隔离我的问题,我运行了lsof -i -n -P | grep nodejs
命令。实际上,建立的连接数量正在增加,所以我想我的代码中有一些未关闭的连接。
我有一些fs.readFileSync
和fs.readDirSync
等...但我没有设置autoClose:true
。你觉得那会是吗?
您有任何想法或建议吗?
PS:应用程序在Ubuntu机器上运行
编辑,16-02-2016
我在生产机lsof -i -n -P | grep nodejs
我看到的是这样的:
...
nodejs 27596 root 631u IPv4 109781565 0t0 TCP 127.0.0.1:45268->127.0.0.1:7272 (ESTABLISHED)
nodejs 27596 root 632u IPv4 109782317 0t0 TCP 172.31.58.93:4242->172.31.55.229:61616 (ESTABLISHED)
nodejs 27596 root 633u IPv4 109779882 0t0 TCP 127.0.0.1:45174->127.0.0.1:7272 (ESTABLISHED)
nodejs 27596 root 634u IPv4 109779884 0t0 TCP 127.0.0.1:45175->127.0.0.1:7272 (ESTABLISHED)
nodejs 27596 root 635u IPv4 109781569 0t0 TCP 127.0.0.1:45269->127.0.0.1:7272 (ESTABLISHED)
nodejs 27596 root 636u IPv4 109781571 0t0 TCP 127.0.0.1:45270->127.0.0.1:7272 (ESTABLISHED)
nodejs 27596 root 637u IPv4 109782319 0t0 TCP 127.0.0.1:45293->127.0.0.1:7272 (ESTABLISHED)
nodejs 27596 root 642u IPv4 109781790 0t0 TCP 127.0.0.1:45283->127.0.0.1:7272 (ESTABLISHED)
nodejs 27596 root 643u IPv4 109781794 0t0 TCP 127.0.0.1:45284->127.0.0.1:7272 (ESTABLISHED)
nodejs 27596 root 644u IPv4 109781796 0t0 TCP 127.0.0.1:45285->127.0.0.1:7272 (ESTABLISHED)
nodejs 27596 root 645u IPv4 109781798 0t0 TCP 172.31.58.93:4242->172.31.55.229:61602 (ESTABLISHED)
nodejs 27596 root 646u IPv4 109781800 0t0 TCP 127.0.0.1:45286->127.0.0.1:7272 (ESTABLISHED)
nodejs 27596 root 647u IPv4 109781802 0t0 TCP 172.31.58.93:4242->172.31.0.198:1527 (ESTABLISHED)
nodejs 27596 root 648u IPv4 109781804 0t0 TCP 127.0.0.1:45287->127.0.0.1:7272 (ESTABLISHED)
nodejs 27596 root 649u IPv4 109781806 0t0 TCP 127.0.0.1:45288->127.0.0.1:7272 (ESTABLISHED)
但我不知道这意味着什么,你有什么想法吗?
非常感谢。
答案 0 :(得分:2)
所以我以为我发现了发生了什么!
我使用Redis&我的购物车存储的Redis会话npm模块,但是当我创建,更新时,我在使用之前每次都创建了与Redis的连接。
<body onresize="myFunction()">
<script>
var width = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;
function myFunction() {
if(width<500){
document.getElementById("yy").style.display="none";
}else{
document.getElementById("yy").style.display="absolute";
}
}
</script>
<img id="yy src="..."/>
现在我刚刚在我的应用程序启动时创建了连接,并将其存储为单例并随时使用。
var session = new Sessions({ port : conf.redisPort, host : conf.redisHost});
session.get({
app : rsapp,
token : this.sessionToken },
function(err, resp) {
// here some workin'
})
这很明显,但现在我找到了......如果它可以帮助某人,我会把这个标记为已解决。