Após 30 minutos de atividade usando o Ubuntu 14.04 com um SSD híbrido , vejo muitos processos bloqueando IO usando iotop
. Isso ocorre durante gravações em disco, por exemplo, se eu abrir e fechar um arquivo vazio no gedit, pode levar 2 segundos para fechar devido às configurações de gravação do dconf, isso afeta outros aplicativos de maneira semelhante; desacelerando todo o sistema severamente.
Usando strace consegui rastrear isso de volta para uma chamada fsync e a partir daí consegui reproduzi-lo usando o comando sync.
Então, para recapitular, simplesmente executar sync
do terminal repetidamente pode levar na ordem de 1 a 2 segundos, mas SOMENTE após 30 minutos de atividade.
Para provar isso, criei um script que gera tempo de atividade em segundos em relação ao tempo necessário para executar a sincronização, e o executa a cada segundo:
while true;
do
cat /proc/uptime | awk '{printf "%f ",$1}'; /usr/bin/time -f '%e' sync;
sleep 1;
done;
Corri o script acima, esperei cerca de uma hora (o sistema ficou inativo) e, em seguida, plotei os resultados no gnuplot (y = tempo em segundos para executar a sincronização, x = tempo de atividade em segundos):
Opontonotempoemqueográficoficaemtornode1780(1780/60=aproximadamente30minutos).
Nadadevesergravadonodisconestemomento,excetooscript,portanto,nãodevehaverquasenadanocachedapáginaapósaprimeirasincronização.Cadasincronizaçãosubseqüentegravaráexatamenteoqueestásendogravadonoscript,queseráaproximadamente100bytesoumais.
Esseproblemapersisteapósasreinicializações;porexemplo-seeuesperar30minutosparaadesaceleração,entãoreinicie,alentidãoaindaestarálá.Seeudesligar,reinicieoproblemaaté30minutosdepois.
Outracuriosidadeéquequandoexamineiográficoacimaeaumenteiozoomemumaáreaondealentidãoestáocorrendo,percebiisso:
Os picos e as quedas se repetem - isso ocorre quase exatamente a cada 10 segundos, do vale ao vale, e também ao pico quando ele desce.
Eu também testei o hdparm ( hdparm -t /dev/sda
e hdparm -T /dev/sda
) antes da lentidão:
/dev/sda:
Timing cached reads: 23778 MB in 2.00 seconds = 11900.64 MB/sec
/dev/sda:
Timing buffered disk reads: 318 MB in 3.01 seconds = 105.63 MB/sec
e durante a desaceleração:
/dev/sda:
Timing cached reads: 2 MB in 2.24 seconds = 915.50 kB/sec
/dev/sda:
Timing buffered disk reads: 300 MB in 3.01 seconds = 99.54 MB/sec
Mostrando que as leituras de disco reais não estão sendo afetadas, mas as leituras em cache são, isso poderia significar que isso tem a ver com o barramento do sistema e não com o HD, afinal?
Aqui estão as soluções que tentei:
-
Altere as configurações do spindown do HD, talvez o HD esteja entrando no modo de economia de energia:
hdparm /dev/sda -S252 #(set it to 5 hours before spindown)
-
Altere o tipo de journalling do sistema de arquivos para writeback em vez de ordenado para que possamos obter melhorias de desempenho - isso não resolve o problema, pois não explica o tempo de atividade livre de lentidão de 30 minutos.
-
CRON desativado, como parece ocorrer após 30 minutos.
-
O uso da CPU é bom e está completamente ocioso, portanto nenhum processo pode ser responsabilizado. No entanto, tentei desligar todos os serviços, incluindo o gerenciador de sessões (lightdm), isso não faz nada, pois acredito que o problema seja de nível inferior.
-
A análise de qualquer novo processo que chegue em 30 minutos indica que não houve alterações - eu diferenciei a saída do PS antes e depois e não há diferença.
Isso só começou cerca de duas semanas atrás, nada foi instalado e nenhuma atualização foi feita nesse período. Eu estou pensando que este problema é de nível muito mais baixo, então realmente apreciaria alguma ajuda aqui, já que eu estou sem noção, até mesmo me apontando na direção certa seria útil - por exemplo, existe uma maneira de examinar o que está sendo descartado do cache de páginas?
O cache de gravação está ativado no disco em questão. Também tentei desativar as barreiras de gravação. Dados SMART no HD indicam que não há problemas com o HD em si, mas tenho minhas suspeitas de que é o HD fazendo algo misterioso, pois ele persiste após as reinicializações.
EDITAR:
Eu fiz:
watch -n 1 cat /proc/meminfo
... para ver como a memória muda particularmente olhando para a linha suja e a linha de write-back, que acredito ser o buffer de disco do HD. Todos eles ficam em zero na maior parte, sendo provavelmente 300kb. A sincronização de chamada libera isso como esperado de volta para 0, mas durante a desaceleração, a chamada de sincronização quando há zero páginas sujas e zero kb no buffer de disco ainda bloqueia IO. O que mais poderia ser feito se não houvesse nada para limpar o cache de páginas e gravar o cache?