使用 systemd 控制许多服务的打开文件限制相当简单:您在 /etc/systemd/system/$service_name.service.d/limits.conf 创建一个文件,添加一个[Service]
包含LimitNOFILE=12345
、 run 的部分systemctl daemon-reload
,重新启动您的服务并双击检查/proc/$pid/limits
以验证。
但是,我无法让任何 nfsd 进程的打开文件限制超出默认的 1024/4096。我为 512 个线程配置了 NFS,因此我有 512 个 nfsd 进程在kthreadd
(PID 2) 下运行。
这是输出systemctl cat nfs
:
# /usr/lib/systemd/system/nfs-server.service
[Unit]
Description=NFS server and services
DefaultDependencies=no
Requires= network.target proc-fs-nfsd.mount
Requires= nfs-mountd.service
Wants=rpcbind.socket network-online.target
Wants=rpc-statd.service nfs-idmapd.service
Wants=rpc-statd-notify.service
After= network-online.target local-fs.target
After= proc-fs-nfsd.mount rpcbind.socket nfs-mountd.service
After= nfs-idmapd.service rpc-statd.service
Before= rpc-statd-notify.service
# GSS services dependencies and ordering
Wants=auth-rpcgss-module.service
After=rpc-gssd.service gssproxy.service
Wants=nfs-config.service
After=nfs-config.service
[Service]
EnvironmentFile=-/run/sysconfig/nfs-utils
Type=oneshot
RemainAfterExit=yes
ExecStartPre=-/usr/sbin/exportfs -r
ExecStartPre=-/bin/sh -c '/bin/kill -HUP `cat /run/gssproxy.pid`'
ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS
ExecStop=/usr/sbin/rpc.nfsd 0
ExecStopPost=/usr/sbin/exportfs -au
ExecStopPost=/usr/sbin/exportfs -f
ExecReload=-/usr/sbin/exportfs -r
[Install]
WantedBy=multi-user.target
# /run/systemd/generator/nfs-server.service.d/order-with-mounts.conf
# Automatically generated by nfs-server-generator
[Unit]
RequiresMountsFor=/mnt/files
# /etc/systemd/system/nfs-server.service.d/override.conf
[Service]
LimitNOFILE=infinity
正如你所看到的,我试图设置LimitNOFILE
为无穷大(cat /proc/sys/fs/file-max
产生7171636
)。
然而:
# cat /proc/$(pidof -s nfsd)/limits | grep files
Max open files 1024 4096 files
此外,SELinux 被禁用。
这是 Amazon Linux 2 LTS 候选版本:
# cat /proc/version
Linux version 4.9.62-10.57.amzn2.x86_64 (mockbuild@ip-10-0-1-120) (gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC) ) #1 SMP Wed Dec 6 00:07:49 UTC 2017
有谁知道这个每个进程的打开文件限制来自哪里?我该如何改变它?
答案1
从man rpc.nfsd
:
rpc.nfsd 程序实现 NFS 服务的用户级部分。主要功能由 nfsd 内核模块处理。用户空间程序仅指定内核服务应侦听哪种类型的套接字、应支持哪些 NFS 版本以及应使用多少个内核线程。
由于实际的nfsd
进程是由内核启动的(正如kthreadd
您所注意到的),它们不是(甚至是 n 阶孙)子进程,systemd
因此systemd
无法将增加的 ulimit 值传递给它们。
答案2
我可能已经找到了一些至少可能是有用的提示,尽管它并不是真正的完整答案。如果要更改 NFS 进程可以打开的文件数量的限制,可以运行以下命令:
echo -n "Max open files=32768:65535" > /proc/<<THE NFS PID>>/limits
这将更改正在运行的进程的限制,但这实际上可能不是您想要的。我在 NFS 上遇到“打开文件过多”错误,并且上述命令无法消除这些错误。我认为上述命令只是增加了 NFS 守护进程本身可以打开的文件数量,而不是使其他进程可以打开的文件数量使用NFS 打开更多文件。无论如何,希望这最终对将来的某个人有用。