前端时间写程序就遇见过一次因为打开文件过多而不能再打开文件的问题,今天早上又遇见了一个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文件来确认最大打开文件数已经被正确设置。
1. 检查/proc/sys/fs/file-max文件来确认最大打开文件数已经被正确设置。
jack@jack-desktop:~$ cat /proc/sys/fs/file-max
100471
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代码在哪儿打开了但是没关闭的错误把!!