文件socket描述符打开过多导致i无法打开文件的错误



前端时间写程序就遇见过一次因为打开文件过多而不能再打开文件的问题,今天早上又遇见了一个socket打开过多而connect不成功没关闭的情况,导致每次创建socket都不成功的问题,记录下以前找问题和解决问题的方法

原因:

每个系统给每个用户设定了基本的打开文件个数的权限,一般的linux下为1024个,可以用ulimit命令查看

jack@jack-desktop:~$ 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) 7851
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 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) 7851
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
jack@jack-desktop:~$


如果发现open files项比较小,可以按如下方式更改: 
1. 检查/proc/sys/fs/file-max文件来确认最大打开文件数已经被正确设置。 
jack@jack-desktop:~$ cat /proc/sys/fs/file-max   
100471
如果设置值太小,修改文件/etc/sysctl.conf的变量到合适的值。这样会在每次重启之后生效。 如果设置值够大,跳过这一步。 
编辑文件/etc/sysctl.conf,插入下行: 
fs.file-max =  8192   
2. 在/etc/security/limits.conf文件中设置最大打开文件数, 下面是一行提示: 
* - nofile  8192   
这行设置了每个用户的默认打开文件数为2048。 注意"nofile"项有两个可能的限制措施。就是<type>项下的hard和soft。 要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用"-"字符设定<type>, 则hard和soft设定会同时被设定。

================================================================================

查看的方法是在proc文件系统中查找某个进程号的文件夹,里面是打开的一些文件,比如
我的进程5913
jack@jack-desktop :~$cd /proc/5913/fd
jack@jack-desktop:fd$ ll
总用量 0
dr-x------ 2 jack jack  0  9月 22 14:53 ./
dr-xr-xr-x 8 jack jack  0  9月 22 14:34 ../
lrwx------ 1 jack jack 64  9月 22 14:53 0 -> /dev/pts/2
lrwx------ 1 jack jack 64  9月 22 14:53 1 -> /dev/pts/2
lrwx------ 1 jack jack 64  9月 22 14:53 2 -> /dev/pts/2
lrwx------ 1 jack jack 64  9月 22 14:53 3 -> socket:[20210]
l-wx------ 1 jack jack 64  9月 22 14:53 6 -> /home/jack/monitor_svn/webservice_src/debug/debug_err.txt
l-wx------ 1 jack jack 64  9月 22 14:53 8 -> /home/jack/monitor_svn/webservice_src/debug/debug_db_sentence.txt

这次打开socket过多的问题表现
# cd /proc/3892/fd
# ls -l
lrwx------    1 0        0              64 27 -> socket:[30162]
lrwx------    1 0        0              64 26 -> socket:[30145]
lrwx------    1 0        0              64 25 -> socket:[30142]
lrwx------    1 0        0              64 24 -> socket:[30128]
lrwx------    1 0        0              64 23 -> socket:[30127]
lrwx------    1 0        0              64 22 -> socket:[30124]
lrwx------    1 0        0              64 21 -> socket:[30123]
lrwx------    1 0        0              64 20 -> socket:[30122]
lrwx------    1 0        0              64 19 -> socket:[30121]
lrwx------    1 0        0              64 18 -> socket:[30120]
lrwx------    1 0        0              64 17 -> socket:[30119]
lrwx------    1 0        0              64 16 -> socket:[30118]
lrwx------    1 0        0              64 15 -> socket:[30117]
lrwx------    1 0        0              64 14 -> socket:[30116]
lrwx------    1 0        0              64 13 -> socket:[30115]
lrwx------    1 0        0              64 12 -> socket:[30114]
lrwx------    1 0        0              64 11 -> socket:[30113]
lrwx------    1 0        0              64 10 -> socket:[30112]
lrwx------    1 0        0              64 9 -> socket:[30111]
lrwx------    1 0        0              64 8 -> socket:[30110]
lrwx------    1 0        0              64 7 -> socket:[30109]
lrwx------    1 0        0              64 6 -> socket:[30108]
lrwx------    1 0        0              64 5 -> socket:[30107]
l-wx------    1 0        0              64 4 -> pipe:[30106]
lr-x------    1 0        0              64 3 -> pipe:[30106]
lrwx------    1 0        0              64 2 -> /dev/ttyS1
lrwx------    1 0        0              64 1 -> /dev/ttyS1
lr-x------    1 0        0              64 0 -> /dev/null

能看出来是socket打开过多啊!!找找i代码在哪儿打开了但是没关闭的错误把!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值