浏览 6905 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-10-08
在观摩了一个关于性能问题排查的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 ——
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |