检查 Linux 中给定进程的打开 FD 限制

2024-11-12 08:36:00
admin
原创
166
摘要:问题描述:我最近遇到一个 Linux 进程“泄露”了文件描述符:它打开了这些文件描述符,但没有正确关闭其中一些。如果我监控了这一点,我就可以提前知道这个过程已经达到了极限。有没有一种好用的 Bash 或 Python 方法来检查 Ubuntu Linux 系统中给定进程的 FD 使用率?编辑:我现在知道如何检...

问题描述:

我最近遇到一个 Linux 进程“泄露”了文件描述符:它打开了这些文件描述符,但没有正确关闭其中一些。

如果我监控了这一点,我就可以提前知道这个过程已经达到了极限。

有没有一种好用的 Bash 或 Python 方法来检查 Ubuntu Linux 系统中给定进程的 FD 使用率?

编辑:

我现在知道如何检查有多少个打开的文件描述符;我只需要知道一个进程允许多少个文件描述符。有些系统(如 Amazon EC2)没有该/proc/pid/limits文件。


解决方案 1:

计算 中的条目数/proc/<pid>/fd/。可以在 中找到适用于该过程的硬限制和软限制/proc/<pid>/limits

解决方案 2:

Linux 内核提供的唯一用于获取资源限制的接口是getrlimit()/proc/pid/limitsgetrlimit()只能获取调用进程的资源限制。 /proc/pid/limits允许您获取具有相同用户 ID 的任何进程的资源限制,并且可在 RHEL 5.2、RHEL 4.7、Ubuntu 9.04 以及任何具有 2.6.24 或更高版本内核的发行版上使用。

如果您需要支持较旧的 Linux 系统,那么您必须让进程本身调用getrlimit()。当然,最简单的方法是修改程序或它使用的库。如果您正在运行该程序,那么您可以使用LD_PRELOAD将自己的代码加载到程序中。如果这些都不可行,那么您可以使用 gdb 附加到进程并让它在进程内执行调用。您也可以自己做同样的事情,使用ptrace()附加到进程,将调用插入其内存等,但这非常复杂,不建议这样做。

有了适当的权限,执行此操作的其他方法将涉及查看内核内存,加载内核模块或以其他方式修改内核,但我认为这些是不可能的。

解决方案 3:

查看使用进程的前 20 个文件句柄:

for x in `ps -eF| awk '{ print $2 }'`;do echo `ls /proc/$x/fd 2> /dev/null | wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`;done | sort -n -r | head -n 20

输出格式为文件句柄计数、进程的 pid、命令行

示例输出

701 1216 /sbin/rsyslogd-n-c5
169 11835 postgres: spaceuser spaceschema [local] idle
164 13621 postgres: spaceuser spaceschema [local] idle
161 13622 postgres: spaceuser spaceschema [local] idle
161 13618 postgres: spaceuser spaceschema [local] idle

解决方案 4:

您可以尝试编写定期调用lsof -p {PID}给定 pid 的脚本。

解决方案 5:

您要求使用 bash/python 方法。ulimit 将是最好的 bash 方法(无需手动处理/proc/$pid/fd)。对于 python,您可以使用资源模块。

import resource

print(resource.getrlimit(resource.RLIMIT_NOFILE))
$ python test.py

(1024, 65536)

resource.getrlimit对应于getrlimitC 程序中的调用。结果表示所请求资源的当前值和最大值。在上面的示例中,当前(软)限制为 1024。这些值是当今 Linux 系统上的典型默认值。

解决方案 6:

在 CentOS 6 及以下版本(使用 GCC 3 的任何版本)中,您可能会发现调整内核限制无法解决问题。这是因为 GCC 在编译时设置了一个FD_SETSIZE值。为此,您需要增加该值,然后重新编译该过程。

此外,如果您使用该库,您可能会发现由于libpthread 中已知问题而泄漏了文件描述符。此调用已集成到 GCC 4 / CentOS7 / RHEL 7 中的 GCC 中,这似乎已修复了线程问题。

解决方案 7:

使用优秀的 psutil 包的 Python 包装器:

import psutil

for p in psutil.process_iter(attrs=['pid', 'name', 'username', 'num_fds']):
    try:
        soft, hard = p.rlimit(psutil.RLIMIT_NOFILE)
        cur = p.info['num_fds']
        usage = int(cur / soft * 100)
        print('{:>2d}% {}/{}/{}'.format(
            usage,
            p.info['pid'],
            p.info['username'],
            p.info['name'],
            ))
    except psutil.NoSuchProcess:
        pass
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用