在观摩了一个关于性能问题排查的PPT之后试着用lsof命令来列举linux系统打开的文件,
然后发现出现了很多“ can't identify protocol ” 的信息:
udevd 3117 root 989u sock 0,4 84579 can't identify protocol
udevd 3117 root 990u sock 0,4 84632 can't identify protocol
udevd 3117 root 991u sock 0,4 84757 can't identify protocol
udevd 3117 root 992u sock 0,4 84836 can't identify protocol
udevd 3117 root 993u sock 0,4 84899 can't identify protocol
udevd 3117 root 994u sock 0,4 85018 can't identify protocol
udevd 3117 root 995u sock 0,4 85135 can't identify protocol
udevd 3117 root 996u sock 0,4 85172 can't identify protocol
udevd 3117 root 997u sock 0,4 85213 can't identify protocol
udevd 3117 root 998u sock 0,4 85318 can't identify protocol
可以看到这都是由于3117进程打印出来的,于是使用strace命令追中该进程号:
[root@localhost ~]# strace -p 3117
Process 3117 attached - interrupt to quit
select(0, [], [], NULL, {0, 168000}) = 0 (Timeout)
time([1349686960]) = 1349686960
select(0, [], [], NULL, {1, 0}) = 0 (Timeout)
time([1349686961]) = 1349686961
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = -1 EMFILE (Too many open files)
select(0, [], [], NULL, {1, 0}) = 0 (Timeout)
time([1349686962]) = 1349686962
select(0, [], [], NULL, {1, 0}) = 0 (Timeout)
time([1349686963]) = 1349686963
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = -1 EMFILE (Too many open files)
select(0, [], [], NULL, {1, 0}) = 0 (Timeout)
time([1349686964]) = 1349686964
select(0, [], [], NULL, {1, 0}) = 0 (Timeout)
time([1349686965]) = 1349686965
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = -1 EMFILE (Too many open files)
于是追踪到“Too many open files”错误。
到这里,就很明白了,是进程打开文件句柄的个数达到了linux的限制。
而这种限制分为系统层面的和用户层面的:
系统层面的在:/proc/sys/fs/file-max里设置
[root@localhost ~]# cat /proc/sys/fs/file-max
1602508
用户层面的限制在:/etc/security/limits.conf里设定
使用 ulimit -a 查看系统允许单个进程打开的最大文件数:
[root@localhost ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
pending signals (-i) 1024
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 278528
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
注意“open files (-n) 1024” 这一行,系统只允许每个非root用户(运行不是系统级别的程序一般都是非root用户来启动的)打开1024个文件。
既然问题找到,那就只要把这个值改大就好了,可以使用这两种方法:
1、临时修改
· ulimit -n 131072(重启无效)
· 在/etc/rc/rc.local里加入ulimit -n 131072
2、永久修改
在/etc/security/limits.conf文件里加入以下内容,重启生效:
* soft nofile 131072
* hard nofile 131072
你也可以零时修改和永久修改一起进行,这样重启系统之后还能保持一样的open files限制。
—— EOF ——