opened too many files

linux把socket当做文件管理,一个socket就是一个文件描述符,同时linux对文件描述符分别在进程和系统级别进行限制,也就是说一个进程打开多少个文件是受限制的,同时操作系统中所有进程打开的文件数也受限制。
通常出现此问题是由于程序中打开了文件流或者socket,没有关闭,导致超过,进程内最大文件数限制;
使用ulimit -a 查看限制数

[root@localhost ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 30197
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024 //最多打开1024个文件
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 30197
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

然后使用lsof -p pid 来查看进程打开的文件描述符,看看什么样的

opened too many files_操作系统


然后使用lsof -p pid|grep keyword|wc -l 查看某类型的文件描述符一共打开多少;

基于以上3个步骤,基本可以确定是打开文件过多导致,修复办法就是找到程序中,操作文件或socket的地方,确保使用完毕后关闭流或socket

参考

http://langyu.iteye.com/blog/763247