检查 Linux 中给定进程的打开 FD 限制
- 2024-11-12 08:36:00
- admin 原创
- 20
问题描述:
我最近遇到一个 Linux 进程“泄露”了文件描述符:它打开了这些文件描述符,但没有正确关闭其中一些。
如果我监控了这一点,我就可以提前知道这个过程已经达到了极限。
有没有一种好用的 Bash 或 Python 方法来检查 Ubuntu Linux 系统中给定进程的 FD 使用率?
编辑:
我现在知道如何检查有多少个打开的文件描述符;我只需要知道一个进程允许多少个文件描述符。有些系统(如 Amazon EC2)没有该/proc/pid/limits
文件。
解决方案 1:
计算 中的条目数/proc/<pid>/fd/
。可以在 中找到适用于该过程的硬限制和软限制/proc/<pid>/limits
。
解决方案 2:
Linux 内核提供的唯一用于获取资源限制的接口是getrlimit()
和/proc/
pid/limits
。 getrlimit()
只能获取调用进程的资源限制。 /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
对应于getrlimit
C 程序中的调用。结果表示所请求资源的当前值和最大值。在上面的示例中,当前(软)限制为 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
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件