O que o comando sync faz?


15

Sei o que faz ... Acho que estou curioso para saber por que está corrigindo um problema em um aplicativo que herdei. Eu assumi um aplicativo tomcat bastante grande, que atua como servidor Red5 para vários clientes flex, e lida com muitos dados de interação em tempo real, que acabam sendo liberados para uma API Rails. O problema estava sob muita carga ao longo do tempo, e as transferências para esses clientes aumentaram para 3-400 ms, onde normalmente é <100 ms. O cliente suspeitou que fosse um problema de memória que realmente nunca pudemos confirmar. Um dia, em um servidor intermediário, eu estava executando um teste de carga em que basicamente parou de receber solicitações ou era extremamente lento. Por capricho eu enviei

sync && echo 3 > /proc/sys/vm/drop_caches

e magicamente o servidor voltou à vida e começou a funcionar a toda velocidade, atendendo a essas conexões. Isso foi uma coincidência ou esse comportamento faz sentido e por quê?


4
Esses são dois comandos. Qual teve o efeito que você notou?
Michael Hampton


isso foi refatorado ainda mais aqui: commandlinefu.com/commands/view/1026/…
j_mcnally

4
É difícil dizer. Você não esperaria que esses comandos fizessem algo benéfico em um servidor, a menos que tivesse sido terrivelmente confuso. Mas certamente não pode ser descartada sem um estudo mais cuidadoso. Se isso acontecer novamente, tente apenas o syncou apenas o echo. Em seguida, tentar descobrir por que o servidor é lento nos casos corrige este (? É maxed A CPU é IO maxed É a paginação do sistema?)
David Schwartz

Respostas:


20

Qualquer disco rígido tem uma ordem de magnitude mais lenta que a sua RAM, portanto, o linux usa qualquer RAM sobressalente que você possa ter flutuando para armazenar em cache os dados do sistema de arquivos. No entanto, isso realmente nunca deve causar problemas de desempenho, a menos que haja algo errado com seu disco rígido ou os serviços no servidor estejam tentando gravar dados a uma taxa tão alta por tanto tempo que o servidor não possa armazenar em cache ou recuperar os dados. Também pode ser um sinal de que seu disco rígido está chegando ao fim de sua vida útil.

De qualquer forma:

  • a execução man syncinformará o que a sincronização faz [libera os buffers FS]
  • pesquisando 'linux drop_caches' no Google, você verá que o eco do número 3 libera todas as páginas de memória desnecessárias do cache [isso não deve ser necessário em um sistema saudável]
  • command1 && command2 decompõe-se em 'se command1 terminar com êxito e execute command2'
    • o parceiro para isso é command1 || command2conhecido como 'se command1 falhar, execute command2'

O comando que você recebeu é uma correção temporária, na melhor das hipóteses, e é sintomático de algo mais errado com seu sistema. Seus discos estão no fim da vida útil ou o sistema está com pouca potência para o que você está fazendo com ele, ou ambos .


obrigado, não tenho certeza, achei que era uma solução de muito curto prazo. Eu acho que eu queria algumas dicas sobre por que isso pode estar funcionando. O servidor está no EC2, portanto, não tenha certeza da idéia do HD EOL.
precisa saber é o seguinte

@j_mcnally EC2? Bem, então, só posso adivinhar como é a sua instância em particular, mas provavelmente é uma combinação de fatores como o EBS sendo super escamoso o tempo todo, pequenas alocações de RAM e a ausência de uma partição de troca.
precisa saber é o seguinte

Então você está dizendo que a solução pode ser realmente válida?
precisa saber é o seguinte

@j_mcnally, infelizmente, se você não estiver em uma das instâncias otimizadas de zilhão de dólares por mês, potencialmente sim.
precisa saber é o seguinte

5

A AWS não é para os fracos de coração, e você acabou de encontrar um dos motivos. A má situação de E / S de disco na AWS é bem conhecida e um dos principais fatores a serem considerados para quem cria um aplicativo sobre ele. Existem instâncias otimizadas para disco e alguns outros truques (como criar um RAID 0 a partir de volumes EBS) que você pode tentar melhorar. Certifique-se de usar instâncias maiores (pelo menos m1.large) para garantir que o kernel possa armazenar em buffer a E / S do disco.


sim usando m1.large. Esses servidores são ativados para o aplicativo e, em seguida, desativados horas depois ... para não ter certeza de um investimento de tempo, etc., para o disco io. eu aprecio todos os comentários e sugestões parecem que a correção pode ser válida mesmo que não seja preferível. obrigado novamente.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.