Por que o servidor escreve muito mais do que ler o disco

1

Estou rodando um aplicativo Ruby on Rails, eu uso Passenger Nginx, Ruby on Rails 3.2, gem de busca Sunspot (que usa o Solr como seu mecanismo de busca). Meu aplicativo funciona bem com cerca de 6K de usuários ativos, mas quando há um pico de tráfego como 15K de usuários ativos, seu inaceitável é lento. Eu verifiquei logs newrelic e ver as utilizações de E / S, mas eu não entendo.

Vocêpodeverque"escreve" é muito mais do que "lê". Eu não entendo isso porque a maioria dos usuários está usando solicitações GET relacionadas à ação de leitura, eu acho.

    
por vutran 21.01.2014 / 08:53

2 respostas

1

Se o seu problema é relacionado a gravação de log (como sugere David), isso pode ser facilmente resolvido em um nginx mais novo, permitindo o armazenamento em buffer de access_log escreve e usa compactação gzip on-the-fly (junto com buffering), ou, alternativamente, usando um sistema de arquivos como o zfs que pode fazer algumas dessas coisas automaticamente sem o seu envolvimento.

access_log /path/to/log.gz combined gzip flush=5m;

Como alternativa, seu problema pode estar relacionado à maneira como o cache do nginx funciona (especificamente, o padrão de proxy_buffering on; e tal).

O Nginx faz o cache através do sistema de arquivos, portanto, ele pode fazer várias gravações em disco (que podem ou não aparecer como leituras, já que as leituras que estão seguindo as gravações, dependendo da metodologia de seus experimentos, seriam muito prováveis ser servido na memória).

Dependendo de seus recursos, você pode considerar a configuração de um disco baseado em memória como o diretório para armazenar em buffer suas coisas. Senão, você também pode considerar configurar o verniz na frente do seu nginx - o verniz faz todo o cache através do subsistema de memória virtual.

    
por 21.01.2014 / 22:44
1

A maioria das solicitações GET são atendidas da memória. No entanto, a gravação em logs provavelmente resulta em E / S porque os logs geralmente são armazenados em buffer de linha e cada entrada de log geralmente é uma linha.

    
por 21.01.2014 / 09:00