我正在运行一个定期统计和打开文件的守护进程。它还通过网络将这些文件中的数据复制到各个云提供商。该守护进程作为单个进程运行。进程启动后,我将打开文件限制从系统默认值 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