can't identify protocol問題的定位和解決

在觀摩了一個關於性能問題排查的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 ——

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章