文件描述符不够的怪问题。(高分求助)

hzgchina2208 2006-06-13 12:22:46
有一个程序在运行1小时左右总是会出现文件描述符被用光的现象,可以确认的是网络通信这块没有问题,业务处理逻辑也没有打开文件末关闭现象。同时我们发现进程(多线程)top的shr不断的在增长,用strace跟踪某一个线程发现偶尔会有:
14943 1150169025.301972 time(NULL) = 1150169025
14944 1150169025.302033 old_mmap(0x6d123000, 86016, PROT_NONE, MAP_PRIVATE|MAP_FIXED|MAP_
ANONYMOUS, -1, 0) = 0x6d123000
14945 1150169025.302120 old_mmap(0x6d121000, 8192, PROT_NONE, MAP_PRIVATE|MAP_FIXED|MAP_A
NONYMOUS, -1, 0) = 0x6d121000
这个很明显不是由业务调用触发的,兄弟帮忙看看能否指点一二?
...全文
226 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fytzzh 2006-06-14
  • 打赏
  • 举报
回复
线程池中的单个线程退出后是detach的么?如果不是必须要在主线程pthread_join。
我怀疑你的线程终止后,没有释放资源。
hzgchina2208 2006-06-13
  • 打赏
  • 举报
回复
程序是单进程多线程(线程池)方式,操作系统是slackware linux2.4.30
hzgchina2208 2006-06-13
  • 打赏
  • 举报
回复
可以的,
lrwx------ 1 root root 64 2006-06-13 12:57 0 -> /dev/null
l-wx------ 1 root root 64 2006-06-13 12:57 1 -> /dev/null
lrwx------ 1 root root 64 2006-06-13 12:57 10 -> socket:[127507548]
lrwx------ 1 root root 64 2006-06-13 12:57 11 -> socket:[127507542]
lrwx------ 1 root root 64 2006-06-13 12:57 12 -> socket:[127507493]
lrwx------ 1 root root 64 2006-06-13 12:57 13 -> socket:[127507185]
lrwx------ 1 root root 64 2006-06-13 12:57 14 -> socket:[127506654]
lrwx------ 1 root root 64 2006-06-13 12:57 16 -> socket:[127507269]
lrwx------ 1 root root 64 2006-06-13 12:57 17 -> socket:[127507200]
lrwx------ 1 root root 64 2006-06-13 12:57 18 -> socket:[127506965]
lrwx------ 1 root root 64 2006-06-13 12:57 19 -> socket:[127507522]
l-wx------ 1 root root 64 2006-06-13 12:57 2 -> /dev/null
lrwx------ 1 root root 64 2006-06-13 12:57 20 -> socket:[127506695]
lrwx------ 1 root root 64 2006-06-13 12:57 22 -> socket:[127507285]
lrwx------ 1 root root 64 2006-06-13 12:57 23 -> socket:[127507444]
lrwx------ 1 root root 64 2006-06-13 12:57 24 -> socket:[127507556]
lrwx------ 1 root root 64 2006-06-13 12:57 25 -> socket:[127507456]
lrwx------ 1 root root 64 2006-06-13 12:57 26 -> socket:[127507544]
lrwx------ 1 root root 64 2006-06-13 12:57 27 -> socket:[127507550]
lrwx------ 1 root root 64 2006-06-13 12:57 29 -> socket:[127507554]
lr-x------ 1 root root 64 2006-06-13 12:57 3 -> pipe:[127499657]
lrwx------ 1 root root 64 2006-06-13 12:57 30 -> socket:[127507555]
l-wx------ 1 root root 64 2006-06-13 12:57 4 -> pipe:[127499657]
lrwx------ 1 root root 64 2006-06-13 12:57 5 -> socket:[127499658]
lrwx------ 1 root root 64 2006-06-13 12:57 6 -> socket:[127507322]
lrwx------ 1 root root 64 2006-06-13 12:57 7 -> socket:[127507274]
lrwx------ 1 root root 64 2006-06-13 12:57 8 -> socket:[127507427]
lrwx------ 1 root root 64 2006-06-13 12:57 9 -> socket:[127507495]
x86 2006-06-13
  • 打赏
  • 举报
回复
pid是你的进程的进程号
x86 2006-06-13
  • 打赏
  • 举报
回复
/proc/pid下面能看到已打开fd的列表么
eqxu 2006-06-13
  • 打赏
  • 举报
回复
线程池在执行完后最好是wait别退出

socket打开之后执行完要关闭


问题好像是出在socket这里吧


隔段时间多看几次fd
x86 2006-06-13
  • 打赏
  • 举报
回复
你可以多看看proc下的fd列表,看看有什么规律,有没有可疑的fd。

ulimit -a看看有没有fd数目的限制。

〉文件描述符被用光
一般都是什么操作会碰到这种情况?socket?
如果每次都在一个地方出这个错,那有可能跟没有关闭fd有关

另外方便的话可以用gdb跟一下,如果能确定报错的地方,可以设置断点跟踪一下。

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧