我在这个相对较大的代码库中工作,在那里我看到一个文件描述符泄漏,进程开始抱怨在我运行某些程序之后它们无法打开文件。
尽管这种情况在6天后就会发生,但通过将/proc/sys/fs/file-max中的值减少到9000,我可以在3-4小时内重现这个问题。
在任何时候都有许多进程在运行。我已经能够锁定几个可能导致泄漏的程序。但是,我没有看到任何文件描述符通过lsof或/proc//fd泄漏。
如果我杀死那些我怀疑泄漏的过程(他们彼此交流),泄漏就会消失。FDs被释放。
cat /proc/sys/fs/file in 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& tail -f pid_monitor.txt
正如我前面提到的,我没有看到任何/proc//fd中的任何泄漏,但是泄漏是肯定发生的,并且系统正在耗尽文件描述符。
我怀疑内核里有东西泄漏了。Linux内核版本2.6.23。
我的问题如下:
。
谢谢你耐心地回答这个问题。
会很感激你的帮助。
发布于 2012-04-25 22:40:03
找到了解决问题的方法。
某个函数中有一个共享内存附加,该函数每30秒被调用一次。共享内存附加从未被分离,因此描述符泄漏。我猜/proc//fd没有将共享内存附加作为描述符显示。因此,我的脚本无法捕获文件描述符泄漏。
发布于 2012-04-22 10:49:09
哪个过程开始抱怨?你看到了什么错误?监视脚本的输出是什么?
要打开一个文件,您需要两样东西:一个文件描述符和一个struct file -或文件描述。文件描述符是用户空间所使用的,在内核中它用于查找struct file。我不清楚你在漏水。
https://stackoverflow.com/questions/10218266
复制相似问题