Como limitar o número de arquivos abertos para o nfsd com o systemd

2

É bastante simples controlar os limites de arquivos abertos para muitos serviços com o systemd: Você cria um arquivo em /etc/systemd/system/$service_name.service.d/limits.conf, adiciona uma seção [Service] com LimitNOFILE=12345 , execute systemctl daemon-reload , reinicie seu serviço e verifique novamente /proc/$pid/limits para verificar.

No entanto, não consigo obter limites de arquivos abertos para ir além do padrão 1024/4096 para qualquer processo nfsd. Eu tenho o NFS configurado para 512 threads e, portanto, tenho 512 processos nfsd em execução em kthreadd (PID 2).

Aqui está a saída de 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

Como você pode ver, estou tentando definir LimitNOFILE para o infinito ( cat /proc/sys/fs/file-max produz 7171636 ).

No entanto:

# cat /proc/$(pidof -s nfsd)/limits | grep files
Max open files            1024                 4096                 files

Além disso, o SELinux está desativado.

Este é o Candidato do 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

Alguém sabe de onde vem esse limite de arquivos abertos por processo? E como alterá-lo?

    
por davemyron 22.01.2018 / 07:10

2 respostas

3

De man rpc.nfsd :

The rpc.nfsd program implements the user level part of the NFS service. The main functionality is handled by the nfsd kernel module. The user space program merely specifies what sort of sockets the kernel service should listen on, what NFS versions it should support, and how many kernel threads it should use.

Como os processos nfsd reais são iniciados pelo kernel (via kthreadd como você notou), eles não são (até mesmo ordem n grand) filhos de systemd e então systemd não tem como de passar valores ulimit aumentados para eles.

    
por 22.01.2018 / 09:41
0

Eu posso ter encontrado algo que poderia ser pelo menos uma dica útil, embora não seja realmente uma resposta completa. Se você quiser alterar o limite do número de arquivos que podem ser abertos para o processo NFS, você pode executar isto:

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

Isso mudará o limite do processo em execução, mas isso pode não ser realmente o que você deseja. Estou tendo problemas com erros "Muitos arquivos abertos" no NFS, e o comando acima não se livra desses erros. Eu presumo que o comando acima apenas aumente o número de arquivos que o daemon NFS pode abrir, em vez de possibilitar que outros processos que estejam usando NFS para abrir mais arquivos. De qualquer forma, espero que isso acabe sendo útil para alguém em algum momento no futuro.

    
por 13.05.2018 / 01:59