entendendo os descritores máximos de arquivos para linux e nginx e o melhor valor para worker_rlimit_nofile

9

Eu recebi o erro "muitos descritores de arquivo" aparentemente comuns no nginx. Depois de 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 que eu me sinta 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 / e-mail cobrem:

  • o sistema operacional tem seu próprio limite de descritor de arquivo total (no meu sistema, cat /proc/sys/fs/file-max outputs "100678")
  • cada usuário pode ter seu próprio limite também (mas no meu sistema, executando ulimit como qualquer usuário gera "ilimitado" veja a atualização na parte inferior com mais detalhes )
  • algumas pessoas disseram algo semelhante ao que esta pessoa disse: 'Directiva worker_rlimit_nofile não especifica "quantos", é o limite do sistema operacional que faz. Directiva worker_rlimit_nofile apenas permite uma maneira rápida e suja de ampliar esse limite, se não for suficiente. Então eu acho que a implicação é que é "melhor" para definir o limite para o usuário do sistema operacional nginx em vez de na configuração?

Eu posso adicionar um valor worker_rlimit_nofile maior que o número de conexões por trabalhador e chamá-lo por dia, mas eu sinto que não sei realmente o que está acontecendo aqui.

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

update : para usuário root e normal, o ulimit exibe "unlimited", MAS ulimit -Hn e ulimit -Sn ambos saem 1024

    
por John Bachir 03.12.2010 / 21:01

2 respostas

10

worker_rlimit_nofile definirá o limite para os descritores de arquivo para os processos do operador, em oposição ao usuário que está executando o nginx. Se outros programas executados sob este usuário não puderem lidar com o esgotamento dos descritores de arquivo, você deverá definir 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 vai abrir um socket para o host: port lidando com essas requisições
  3. Usando proxy_pass para uma porta local? Isso é outro soquete aberto. (Para o proprietário desse processo)
  4. arquivos estáticos sendo veiculados por nginx

Por que o limite por trabalhador seria menor que o limite do sistema operacional?

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 nginx, veja abaixo. Seria muito ruim se seus funcionários usassem todos os descritores de arquivos disponíveis para todos os processos, não definindo 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 precisei aumentar o limite suave para o usuário usando ulimit .

Como descubro qual é o meu limite agora?

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

    
por 04.12.2010 / 00:59
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, embora a chance de ficar sem descritores de arquivos seja minúscula.

    
por 03.12.2010 / 21:14