我正在这个相对较大的代码库中工作,我看到文件描述符泄漏,并且进程开始抱怨他们在运行某些程序后无法打开文件。
虽然这种情况在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&amp; tail -f pid_monitor.txt
正如我前面提到的,我没有看到/ proc // fd中的任何泄漏,但是肯定会发生泄漏,系统的文件描述符也已用完。
我怀疑内核中的某些东西正在泄漏。 Linux内核版本2.6.23。
我的问题如下:
Will&#39; ls / proc // fd&#39;显示使用pid链接到进程的任何库的列表描述符。如果不是,我如何确定我链接到的库中何时发生泄漏。
如何确认泄漏是在用户空间与内核中进行的。
如果漏洞在内核中,我可以使用哪些工具进行调试?
您可以提供给我的任何其他提示。
感谢您耐心地回答这个问题。
非常感谢任何帮助。
答案 0 :(得分:1)
找到问题的解决方案。
在某个函数中发生了共享内存附加,并且该函数每30秒调用一次。共享内存附加永远不会分离,因此描述符泄漏。我猜/ proc // fd没有显示共享内存附加作为描述符。因此我的脚本无法缓存哪个进程正在泄漏描述符。
答案 1 :(得分:0)
哪些流程开始抱怨?你看到的错误是什么?监控脚本的输出是什么?
要打开文件,您需要两件事,一个文件描述符和一个struct file
- 或文件描述。文件描述符是用户空间使用的内容,在内核中用于查找struct file
。我不清楚你在泄漏哪个。