node.js Error: connect EMFILE 或者 getaddrinfo ENOTFOUND

Error: getaddrinfo ENOTFOUND] code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo'

Error: connect EMFILE

本人在中心服上向800多个ip上发请求,发两次就不行了出现如上报错。

原因是文件句柄不够用了,修改  ulimit 即可,步骤如下:

1.vim /etc/security/limits.conf

2.添加两行内容: 
* soft nofile 65536 
* hard nofile 65536

3.退出当前终端,再进  ulimit -a 查看。

虽然显示对了,经过node.js测试仍报错,怀疑没立即生效,指令: grep "Max open files" /proc/39629/limits   显示还是1024,说明没生效。

解决办法:转自  https://blog.csdn.net/shootyou/article/details/6579139

主要是因为linux在文件句柄的数目上有两个级别的限制。一个是系统级别的总数限制,一个是针对用户的限制。

默认情况下每个用户所能使用的句柄数是1024。一般情况下1024也够用了,但是在大容量的系统上,特别是会频繁使用网络通信和文件IO的系统上,1024很快就被耗光了。所以首先我们要调整这个值。修改方法如下:

1. ulimit -a 查看当前用户的文件句柄限制
2. 用户级别的句柄数限制修改。
修改 /etc/security/limits.conf 增加下面的代码:
用户名(或者用*表示所有用户) soft nofile 65535
用户名 hard nofile 65535
有两种限制,一种是soft软限制,在数目超过软限制的时候系统会给出warning警告,但是达到hard硬限制的时候系统将拒绝或者异常了。
修改之后可能需要重启shell生效。
3. 系统级别的句柄数限制修改。
sysctl -w fs.file-max 65536
或者
echo "65536" > /proc/sys/fs/file-max
两者作用是相同的,前者改内核参数,后者直接作用于内核参数在虚拟文件系统(procfs, psuedo file system)上对应的文件而已。
可以用下面的命令查看新的限制
sysctl -a | grep fs.file-max
或者
cat /proc/sys/fs/file-max
修改内核参数
/etc/sysctl.conf
echo "fs.file-max=65536" >> /etc/sysctl.conf
sysctl -p
查看系统总限制 命令:cat /proc/sys/fs/file-max
查看整个系统目前使用的文件句柄数量命令:cat /proc/sys/fs/file-nr
查看某个进程开了哪些句柄 :lsof -p pid
某个进程开了几个句柄 :lsof -p pid |wc -l
也可以看到某个目录 /文件被什么进程占用了,显示已打开该目录或文件的所有进程信息 :lsof path/filename

原文地址:https://www.cnblogs.com/workharder/p/10372472.html