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

2024-11-12 08:36:00
admin
原创
21
摘要:问题描述:我最近遇到一个 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
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用