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