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
来查看进程打开的文件描述符,看看什么样的
然后使用lsof -p pid|grep keyword|wc -l
查看某类型的文件描述符一共打开多少;
基于以上3个步骤,基本可以确定是打开文件过多导致,修复办法就是找到程序中,操作文件或socket的地方,确保使用完毕后关闭流或socket