尽管打开文件限制足够高,但打开的文件过多

尽管打开文件限制足够高,但打开的文件过多

我正在运行一个定期统计和打开文件的守护进程。它还通过网络将这些文件中的数据复制到各个云提供商。该守护进程作为单个进程运行。进程启动后,我将打开文件限制从系统默认值 1024 增加到 32768 prlimit --pid <the process id> --nofile=32768:32768。我已经验证软硬文件限制确实得到了更新。

笔记lsof:当我提到当前打开的文件时,我指的是在另一个窗口中持续运行所返回的值( while [ true ]; do sudo lsof -p <the process id> | wc -l; done;)。这不仅仅是一些猜测。

服务器运行良好一段时间,即使在高负载下,它也打开了 <3500 个文件。然而,有时在中等负载下,当只有几百个文件打开(<500)时,进程在尝试创建套接字、打开文件、统计文件等时开始收到“打开文件过多”错误。

是否有其他一些我没有考虑到的变量/限制会导致“打开的文件太多”,即使软限制为 32768 并且实际上只有几百个文件显示为打开?

相关信息:

  • 红帽企业 Linux 服务器 7.6
  • 内核3.10.0-957.el7.x86_64(我知道它很古老。它不在我的控制范围内)

需要完全明确的是,根据内核自己的记录(通过lsof),该进程没有使用太多打开的文件。当这些错误开始发生时,内核仅报告几百个打开的文件描述符(进程限制为 32768)。

答案1

我不知道为什么要这样做,但我要做的第一件事就是在守护进程启动之前设置 ulimit

答案2

重新散列symcbean 的回答

systemd 在每个进程的基础上处理限制,这意味着它会忽略其他限制,因此实际上有必要在该服务的单元文件中配置限制。

下面是一个例子:

[Unit]
Description=example systemd service unit file.

[Service]
ExecStart=/bin/bash /usr/sbin/example.sh
LimitNOFILE=32768

[Install]
WantedBy=multi-user.target

附加文档

相关内容