systemd를 사용하여 nfsd에서 열리는 파일 수를 제한하는 방법

systemd를 사용하여 nfsd에서 열리는 파일 수를 제한하는 방법

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하는 systemdulimit 값을 전달할 수 없습니다.

답변2

실제로 완전한 답변은 아니지만 적어도 도움이 될 수 있는 몇 가지 힌트를 찾았을 수도 있습니다. NFS 프로세스가 열 수 있는 파일 수에 대한 제한을 변경하려면 다음 명령을 실행할 수 있습니다.

echo -n "Max open files=32768:65535" > /proc/<<THE NFS PID>>/limits

이렇게 하면 실행 중인 프로세스의 제한이 변경되지만 실제로는 원하는 것이 아닐 수도 있습니다. NFS에서 "열린 파일이 너무 많습니다" 오류가 발생하는데 위 명령으로 해당 오류가 제거되지 않습니다. 위의 명령은 다른 프로세스가 열 수 있는 파일 수가 아니라 NFS 데몬 자체가 열 수 있는 파일 수를 늘리는 것뿐입니다.사용NFS는 더 많은 파일을 엽니다. 어쨌든, 이것이 미래에 누군가에게 도움이 되기를 바랍니다.

관련 정보