首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试文件描述符泄漏(在内核中?)

调试文件描述符泄漏(在内核中?)
EN

Stack Overflow用户
提问于 2012-04-18 21:26:19
回答 2查看 8K关注 0票数 6

我在这个相对较大的代码库中工作,在那里我看到一个文件描述符泄漏,进程开始抱怨在我运行某些程序之后它们无法打开文件。

尽管这种情况在6天后就会发生,但通过将/proc/sys/fs/file-max中的值减少到9000,我可以在3-4小时内重现这个问题。

在任何时候都有许多进程在运行。我已经能够锁定几个可能导致泄漏的程序。但是,我没有看到任何文件描述符通过lsof或/proc//fd泄漏。

如果我杀死那些我怀疑泄漏的过程(他们彼此交流),泄漏就会消失。FDs被释放。

cat /proc/sys/fs/file in while(1)循环显示泄漏。但是,我没有看到在任何过程中有任何漏洞。

下面是我编写的一个脚本,用于检测泄漏的发生:

代码语言:javascript
复制
#!/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。

我的问题如下:

  1. 将显示与pid链接到进程的任何库的“ls/proc//fd”列表描述符。如果不是,我如何确定我链接到的库中何时有泄漏。
  2. 如何确认泄漏是在用户空间中还是在内核中。
  3. ,如果泄漏在内核中,我可以使用哪些工具来调试?
  4. ,还有其他提示。

谢谢你耐心地回答这个问题。

会很感激你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2012-04-25 22:40:03

找到了解决问题的方法。

某个函数中有一个共享内存附加,该函数每30秒被调用一次。共享内存附加从未被分离,因此描述符泄漏。我猜/proc//fd没有将共享内存附加作为描述符显示。因此,我的脚本无法捕获文件描述符泄漏。

票数 1
EN

Stack Overflow用户

发布于 2012-04-22 10:49:09

哪个过程开始抱怨?你看到了什么错误?监视脚本的输出是什么?

要打开一个文件,您需要两样东西:一个文件描述符和一个struct file -或文件描述。文件描述符是用户空间所使用的,在内核中它用于查找struct file。我不清楚你在漏水。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10218266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档