Emitir
Instalei recentemente o Ubuntu 16.04 LTS (kernel 4.8.0-52) em um Lenovo T460p com um i7-6820HQ, 32 GB de RAM e um SSD Micron 1100 de 512 GB. Marquei a caixa de criptografia completa do disco durante a instalação e usei o layout de particionamento padrão. Em geral, o desempenho é ótimo.
No entanto, com o tempo, minhas compilações começaram a demorar cerca de duas vezes mais. Além disso, durante partes da compilação que gravam arquivos grandes, qualquer tarefa (não relacionada à compilação) que exija E/S de disco acaba esperando muito. Isso inclui lançar novos programas, carregar páginas no Firefox, etc. No Firefox, por exemplo, posso navegar na interface do usuário, alternar guias e está tudo bem. Mas se eu seguir um link, toda a IU será bloqueada até que as coisas se acalmem.
Então, em resumo, depois de algum tempo, as compilações de repente demoram mais e em certos pontos durante a construção o computador fica basicamente inutilizável.
O que posso fazer para tentar diagnosticar ou resolver esse problema?
Informações sobre solução de problemas
Não reinicie com frequência, para que o sistema fique ativo por vários dias antes de eu me deparar com esse problema. Assim que acertei, me agito um pouco tentando descobrir o problema e, em seguida, reinicio para poder continuar trabalhando.
A única coisa que resolve o problema é reiniciar a máquina. Eu tentei sair de todos os aplicativos, fazer logout e login novamente e descartar o cache do buffer (teoria do fracasso de que, como ele usava o espaço de memória, as sincronizações do disco estavam acontecendo com mais frequência), mas apenas a reinicialização funciona.
Como um tiro no escuro, tentei a solução paraesta respostamas não houve mudança de comportamento.
A execução
iotop
mostra odmcrypt_write
thread usando 99% de E/S sempre que estou enfrentando problemas. Quando estounãoenfrentando o problema, também vejodmcrypt_write
pop no topo com um IO% relativamente alto, mas não permanece lá por muito tempo.Se eu executar
dd if=/dev/urandom of=$HOME/bigfile bs=10k count=200k; sync
quando as coisas estiverem funcionando normalmente,dmcrypt_write
saltarei para o topo por um ou dois segundos, mas não terá a mesma duração de uma de minhas compilações.Uma compilação completa gera cerca de 1,4 GB de dados. É um projeto Java com vários módulos. Assim, muitos pequenos arquivos são criados, além de alguns arquivos JAR maiores que agregam todos esses pequenos arquivos.
Sempre há bastante memória disponível e a partição swap não está sendo usada.
Tenho colegas de trabalho com computadores semelhantes (T460p) que também executam o Ubuntu e que não estão enfrentando esse problema. Todos eles parecem terdiferenteMarca/modelos de SSD, no entanto.
Atualizar
O problema surgiu novamente, então fiz mais alguns testes com base na resposta a esta pergunta.
- O sistema de arquivos ainda não está montado com a
discard
opção, então corrifstrim
assumindo que seria algo semelhante a ter adiscard
opção habilitada - Não fiz o tempo suficiente quando o problema aconteceu pela primeira vez, mas depois de executar
fstrim
, as velocidades de construção pareciam ter voltado ao normal...masapós a conclusão da compilação, odmcrypt_write
thread entra em ação e torna o sistema inutilizável por um período de tempo. Todo e qualquer tempo total para construir e para o sistema se tornar utilizável parece ser praticamente o mesmo de antes. - Mudei
/proc/sys/vm/dirty_ratio
para 2 e/proc/sys/vm/dirty_background_ratio
1 e executei algumas compilações. As compilações demoraram mais do que o normal – quase o mesmo que da última vez que encontrei esse problema, mas o sistema não pareceu travar tanto. Alterá-lo de volta para 20 e 10 reverteu o comportamento mencionado acima. - Em uma inicialização limpa, tentei definir
/proc/sys/vm/dirty_ratio
para 2 e/proc/sys/vm/dirty_background_ratio
1 e o tempo foi comparável a 20 e 10.
Responder1
Eu tive um problema semelhante no Debian 10+11 onde, se eu fizesse grandes operações de gravação no disco LUKS, todo o meu sistema congelaria por algum tempo, depois responderia novamente e depois congelaria novamente...
Porém, não precisei reiniciar - apenas espere até que a operação de gravação fosse concluída.
Como ScumCoder escreveu, há uma correção disponível. A partir do kernel 5.9 a correção está integrada ao kernel.
O seguinte comando corrigiu isso para mim:
cryptsetup --allow-discards --perf-no_read_workqueue --perf-no_write_workqueue --persistent refresh nvme0n1p3_crypt
Extraí meu nome de disco "nvme0n1p3_crypt" usando o comandodmsetup table
Eu me inspirei emhttps://wiki.archlinux.org/title/Dm-crypt/Specialties#Disable_workqueue_for_increased_solid_state_drive_(SSD)_performance
Após a correção, minhas operações de escrita são muito mais rápidas.
Responder2
Tenho exatamente o mesmo problema que você, e uma pesquisa rápida mostrou este post:
https://blog.cloudflare.com/speeding-up-linux-disk-encryption
O funcionário da CloudFlare pesquisou bastante o código-fonte do Linux e concluiu que o culpado é a dmcrypt
implementação atual. Ele resolveu o problema basicamente reescrevendo a parte correspondente do kernel.
Portanto, no AFAIK, as únicas duas maneiras de se livrar da lentidão são (1) compilar sua versão do kernel ou (2) reiniciar de vez em quando (como você disse). Eu escolhi o último.
Responder3
Não sei especificamente sobre o LUKS, mas para problemas gerais de IO em um SSD, certifique-se de que o descarte esteja ativado para sua montagem fs, ou seja, grep descarta /proc/mounts também pode tentar (como root) "echo 1 >> /proc/sys/ vm/dirty_background_ratio; echo 2 >> /proc/sys/vm/dirty_ratio", isso fará com que o sistema inicie o IO mais cedo, quando houver menos registros atrasados de dados para gravar.