在Linux中查看日志时,发现有Can’t open so many files信息。应该是虚拟机打开文件数或者sockets数太多了。
在Linux下,我们使用ulimit -n命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。
对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象java等单进程处理大量请求的应用来说就有点捉襟见肘了。如果单个进程打开的文件句柄数量超过了系统定义的值,就会提到“too many files open”的错误提示。如下面一段小脚本可以帮你查看:lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more
但是如果系统并发特别大,很有可能会超过1024。这时候就必须要调整系统参数,以适应应用变化。Linux有硬性限制和软性限制。可以通过ulimit来设定这两个参数。
- [root@paragon ~]# ulimit -a
- core file size (blocks, -c) 0
- data seg size (kbytes, -d) unlimited
- scheduling priority (-e) 30
- file size (blocks, -f) unlimited
- pending signals (-i) 30605
- max locked memory (kbytes, -l) 40000
- max memory size (kbytes, -m) unlimited
- open files (-n) 1024
- pipe size (512 bytes, -p) 8
- POSIX message queues (bytes, -q) 819200
- real-time priority (-r) 65
- stack size (kbytes, -s) 8192
- cpu time (seconds, -t) unlimited
- max user processes (-u) 30605
- virtual memory (kbytes, -v) unlimited
- file locks (-x) unlimited
修改方法:
在文件/etc/security/limits.conf中添加:
- * soft nofile 65536
- * hard nofile 65536
- 只需要添加上面两句。
- 最后系统使用这个
# End of file
* - nofile 102400
* - nproc 102400
soft / hard:这个当中的硬限制是实际的限制,而软限制,是warnning限制,只会做出warning.
nofile 代表max number of opened file,
65536:代表最大打开句柄数
另:如果只是添加硬限制,而没有添加软限制,是没有作用的,使用ulimit -a 查看还是没变。
重启机器就ok了