Reduzindo IO causado pelo nginx

Reduzindo IO causado pelo nginx

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

informação relacionada