compreensão dos descritores máximos de arquivo para linux e nginx e o melhor valor para worker_rlimit_nofile

10

Eu recebi o aparentemente comum erro "muitos descritores de arquivos" no nginx. Após muita pesquisa, a solução é claramente aumentar o número de descritores de arquivos disponíveis para o nginx. Mas não há informações suficientes para me sentir confortável fazendo isso de uma maneira significativa e segura. Aqui estão os principais pontos que a maioria dos tópicos de fórum / email abrange:

  • o sistema operacional possui seu próprio limite total de descritores de arquivos (no meu sistema, cat /proc/sys/fs/file-maxgera "100678")
  • cada usuário também pode ter seu próprio limite (mas no meu sistema, executando ulimitcomo qualquer usuário gera "ilimitado", veja a atualização na parte inferior com mais detalhes )
  • algumas pessoas disseram algo parecido com o que essa pessoa disse: 'A diretiva worker_rlimit_nofile não especifica "quantos", é o limite do sistema operacional que especifica. A diretiva worker_rlimit_nofile apenas permite uma maneira rápida e suja de aumentar esse limite, se não for suficiente. ' Então, acho que a implicação é que é "melhor" definir o limite para o usuário do nginx OS, em vez de na configuração?

Posso apenas inserir um valor worker_rlimit_nofile maior que o número de conexões por trabalhador e chamá-lo por dia, mas acho que realmente não sei o que está acontecendo aqui.

  • por que o limite por trabalhador seria menor que o limite do sistema operacional?
  • Como descubro qual é meu limite agora?

update : para usuários raiz e normais, o ulimit gera "ilimitado", MAS ulimit -Hne ulimit -Snos 1024

John Bachir
fonte

Respostas:

10

worker_rlimit_nofiledefinirá o limite para descritores de arquivo para os processos de trabalho, em oposição ao usuário executando o nginx. Se outros programas executados sob esse usuário não conseguirem lidar normalmente com a falta de descritores de arquivo, defina esse limite um pouco menos do que o que é para o usuário.

Primeiro, o que está usando seus descritores de arquivo?

  1. Cada conexão ativa com um cliente
  2. Usando proxy_pass? Isso abrirá um soquete para o host: porta manipulando esses pedidos
  3. Usando proxy_pass para uma porta local? Isso é outro soquete aberto. (Para o proprietário desse processo)
  4. arquivos estáticos sendo servidos pelo nginx

Por que o limite por trabalhador seria menor que o limite do SO?

Isso é controlado pelo sistema operacional porque o trabalhador não é o único processo em execução na máquina. Para alterá-lo para o usuário executando o nginx, veja abaixo. Seria muito ruim se seus funcionários usassem todos os descritores de arquivos disponíveis para todos os processos, não defina seus limites para que isso seja possível.

#/etc/sysctl.conf
#This sets the value you see when running cat  /proc/sys/fs/file-max
fs.file-max = 65536"


#/etc/security/limits.conf
#this sets the defaults for all users
* soft nofile 4096
* hard nofile 4096

#This overrides the default for user `usernamehere`
usernamehere soft nofile 10240
usernamehere hard nofile 10240

Após essas alterações no limite de segurança, acredito que ainda tinha que aumentar o limite de software para o usuário ulimit.

Como descubro qual é meu limite agora?

ulimit -a Exibe todos os limites associados ao usuário em que você o executa.

Dan R
fonte
1
Obrigado - agora que aumentou o limite do descritor de arquivos, estou ficando sem conexões. Talvez você possa me ajudar com isso também :) serverfault.com/questions/209014/…
John Bachir
1
Nota aos usuários do CentOS / Fedora, se você tiver o SELinux ativado, precisará executar setsebool -P httpd_setrlimit 1para que o nginx tenha permissões para definir seu rlimit.
Jarrett
2

Tem que verificar a fonte para ser honesto, mas é bastante baixo.

Eu usei worker_rlimit_nofile 15000;e não tive problemas. Você pode aumentá-lo com segurança, porém, a chance de ficar sem descritores de arquivo é minúscula.

Martin Fjordvald
fonte