systemdを使用して多くのサービスのオープンファイル制限を制御するのは非常に簡単です。 /etc/systemd/system/$service_name.service.d/limits.confにファイルを作成し、[Service]
含まれているセクションを追加して実行し、LimitNOFILE=12345
サービスsystemctl daemon-reload
を再起動してダブルクリックします。/proc/$pid/limits
確認するために。
しかし、デフォルトの1024/4096を超えるオープンファイル制限を持つnfsdプロセスを取得することはできません。 512個のスレッドに対してNFSを設定したのでkthreadd
(PID 2)、512個のnfsdプロセスが実行されます。
出力は次のとおりです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
ulimitsystemd
値を渡すことはできません。
答え2
実際には完全な答えではありませんが、少なくとも役立つヒントをいくつか見つけたかもしれません。 NFSプロセスが開くことができるファイル数の制限を変更するには、次のコマンドを実行できます。
echo -n "Max open files=32768:65535" > /proc/<<THE NFS PID>>/limits
これにより、実行中のプロセスの制限が変更されますが、実際には望むものではない可能性があります。 NFSで「オープンファイルが多すぎます」というエラーが発生しますが、上記のコマンドはそのエラーを削除しません。上記のコマンドは、他のプロセスが開くことができるファイルの数ではなく、NFSデーモン自体が開くことができるファイルの数を増やすだけです。使用NFSはより多くのファイルを開きます。とにかく、これが将来誰かに役立つことを願っています。