![Reduzindo IO causado pelo nginx](https://rvso.com/image/567627/Reduzindo%20IO%20causado%20pelo%20nginx.png)
Tenho muita RAM livre, mas meu IO é sempre 100% util ou muito próximo. De que maneiras posso reduzir IO usando mais RAM? Meu iotop mostra processos de trabalho nginx com a maior taxa de io. Este é um servidor de arquivos que atende arquivos de 1 MB a 2 GB. Aqui está meu nginx.conf
#user nobody;
worker_processes 32;
worker_rlimit_nofile 10240;
worker_rlimit_sigpending 32768;
error_log logs/error.log crit;
#pid logs/nginx.pid;
events {
worker_connections 51200;
}
http {
include mime.types;
default_type application/octet-stream;
access_log off;
limit_conn_log_level info;
log_format xfs '$arg_id|$arg_usr|$remote_addr|$body_bytes_sent|$status';
sendfile off;
tcp_nopush off;
tcp_nodelay on;
directio 4m;
output_buffers 3 512k;
reset_timedout_connection on;
open_file_cache max=5000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
client_body_buffer_size 32k;
server_tokens off;
autoindex off;
keepalive_timeout 0;
#keepalive_timeout 65;
Responder1
Ative o envio de arquivo. Deixe output_buffers padrão. Desligue a direção. Adicione mais RAM.
Não há nada melhor do que o cache VFS do Linux.
Responder2
Por favor, não aceite esta resposta, pois é apenas uma observação. Mas você usa IO direto para arquivos acima de 4M e permite ao nginx apenas 1,5 MB de buffer de memória para arquivos.
directio 4m;
output_buffers 3 512k;
Se bem me lembro, o IO direto basicamente ignora o cache de IO do sistema de arquivos para ler diretamente do HDD. Portanto, para arquivos acima de 4M, você não usa memória para armazenar o arquivo em buffer e para arquivos abaixo de 4M, usa apenas 1,5M de memória.
Responder3
Parece que você deseja atender algumas solicitações diretamente da memória - o que basicamente equivale a armazenar essas solicitações em cache. Em sua forma básica, você processará uma solicitação, armazenará uma cópia em seu cache baseado em memória e atenderá solicitações subsequentes para o mesmo recurso da memória (até invalidar/expirar a cópia em cache).
A implementação disso irá variar dependendo da natureza do seu site (ou seja, se você estiver servindo arquivos muito grandes, não será tão prático - se o seu conteúdo for altamente dinâmico, não oferecerá tantos benefícios, etc.) - mas para um site 'médio' - com a maior parte da E/S da página proveniente de recursos estáticos (especialmente imagens), isso reduzirá a E/S do disco (e também deverá acelerar as coisas).
Se você estiver fazendo proxy para um servidor back-end, poderá usar a diretiva proxy_cache do nginx para armazenar páginas em cache. No entanto, o local do cache geralmente está no disco (o que pode acelerar as coisas, mas pode não salvar na E/S do disco) - você pode contornar isso criando um tmpfs mapeado para a memória (ou seja, um disco RAM) no qual armazenar seu cache . Da mesma forma, se estiver usando FastCGI, você pode usar fastcgi_cache.
Outra opção semelhante (por exemplo, se você não estiver usando nginx como proxy e não estiver usando FastCGI) é armazenar páginas no MemCached. O Nginx vem com um módulo memcached, que permitirá configurar seu próprio mecanismo de cache.
Alternativamente, você pode simplesmente adicionar um proxy de cache na frente do Nginx (como Varnish) - que receberá solicitações e as servirá diretamente ou passará a solicitação para o Nginx. O Varnish pode ser configurado para armazenar seu cache na memória (ou em um arquivo - embora isso não ajude em sua E/S) e servirá acessos de cache com um mínimo de E/S de disco.
Responder4
worker_processes 32;
- você ainda está adivinhando por quê?
Eu tenho muita RAM livre, mas
Eu também gostaria de ouvir o raciocínio sobre ter sendfile off;
e usar directio
- sou o único (certamente não¹) que sabe que a directio (por definição) proíbe o cache FS?
__ ¹ — Martin F, pelo menos lembrando disso também:Reduzindo IO causado pelo nginx