can't identify protocol问题的定位和解决

本文介绍如何解决Linux系统中进程打开文件句柄数量达到限制的问题,包括使用lsof命令发现问题,通过strace追踪具体错误,并提供两种调整最大文件句柄数的方法。

在观摩了一个关于性能问题排查的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 ——

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值