如何使用systemd限制nfsd打开文件的数量

如何使用systemd限制nfsd打开文件的数量

使用 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 打开更多文件。无论如何,希望这最终对将来的某个人有用。

相关内容