linux-kernel – 调试文件描述符泄漏(在内核中?)
我正在这个相对较大的代码库工作,我看到文件描述符泄漏,并且进程开始抱怨他们在运行某些程序后无法打开文件.
虽然这发生在6天之后,但我可以通过将/ proc / sys / fs / file-max中的值减少到9000来在3-4小时内重现该问题. 随时都有许多进程在运行.我已经能够确定可能导致泄漏的几个过程.但是,我没有通过lsof或通过/ proc // fd看到任何文件描述符泄漏. 如果我杀死我怀疑泄漏的进程(他们彼此沟通),泄漏就会消失. FD被释放. cat / proc / sys / fs / file-nr在while(1)循环中显示泄漏.但是,我没有发现任何过程中有任何泄漏. 这是我写的一个脚本,用于检测泄漏是否发生: #!/bin/bash if [ "$#" != "2" ];then name=`basename $0` echo "Usage : $name <threshold for number of pids> <check_interval>" exit 1 fi fd_threshold=$1 check_interval=$2 total_num_desc=0 touch pid_monitor.txt nowdate=`date` echo "=================================================================================================================================" >> pid_monitor.txt echo "****************************************MONITORING STARTS AT $nowdate***************************************************" >> pid_monitor.txt while [ 1 ] do for x in `ps -ef | awk '{ print $2 }'` do if [ "$x" != "PID" ];then num_fd=`ls -l /proc/$x/fd 2>/dev/null | wc -l` pname=`cat /proc/$x/cmdline 2> /dev/null` total_num_desc=`expr $total_num_desc + $num_fd` if [ $num_fd -gt $fd_threshold ]; then echo "Proces name $pname($x) and number of open descriptor = $num_fd" >> pid_monitor.txt fi fi done total_nr_desc=`cat /proc/sys/fs/file-nr` lsof_desc=`lsof | wc -l` nowdate=`date` echo "$nowdate : Total number of open file descriptor = $total_num_desc lsof desc: = $lsof_desc file-nr descriptor = $total_nr_desc" >> pid_monitor.txt total_num_desc=0 sleep $2 done ./monitor.fd.sh 500 2& 正如我之前提到的,我没有在/ proc // fd中看到任何泄漏,但是肯定会发生泄漏并且系统正在耗尽文件描述符. 我怀疑内核中的某些东西正在泄漏. Linux内核版本2.6.23. 我的问题如下: >将’ls / proc // fd’显示链接到具有pid的进程的任何库的列表描述符.如果不是,我如何确定我链接到的库中何时发生泄漏. 感谢您耐心地回答这个问题. 非常感谢任何帮助. 解决方法
找到问题的解决方案.
在某个函数中发生了共享内存附加,并且该函数每30秒调用一次.共享内存附加永远不会分离,因此描述符泄漏.我猜/ proc // fd没有显示共享内存附加作为描述符.因此我的脚本无法缓存哪个进程泄漏描述符. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |