De alguma forma, aconteceu de trocar 14 GB de memória. Depois de matar o culpado, tenho toneladas de memória livre novamente, então pensei em trazer os dados importantes novamente. Portanto, com 5 GB dos 32 GB usados e 14 GB de espaço de troca usado, executei swapoff -a
.... e 4 horas depois, cerca de metade do trabalho foi concluído.
Isso significa menos que 1 MB / s, enquanto eu posso copiar facilmente 200 MB / s. Minha troca é criptografada, mas todas as partições normais também são e, com o aes-ni , não há carga perceptível na CPU (e o preenchimento do espaço de troca levou apenas alguns minutos). Vejo que não há nenhuma razão especial para otimizar swapoff
, no entanto, me pergunto como isso poderia ficar tão lento?
Apenas adicionando mais alguns dados: Minha memória principal é de 32 GB e tenho espaço de troca de 32 GB em cada um dos 4 discos rígidos (certamente um exagero, mas quem se importa?). Todo o espaço de troca pode ser (descriptografado e) lido em menos de 5 minutos:
time -p sudo sh -c 'for i in /dev/mapper/cryptswap?; do md5sum $i & done; wait'
014a2b7ef300e11094134785e1d882af /dev/mapper/cryptswap1
a6d8ef09203c1d8d459109ff93b6627c /dev/mapper/cryptswap4
05aff81f8d276ddf07cf26619726a405 /dev/mapper/cryptswap3
e7f606449327b9a016e88d46049c0c9a /dev/mapper/cryptswap2
real 264.27
Ler uma parte de uma partição não pode ser mais lento do que ler tudo. No entanto, ler cerca de 1/10 disso leva cerca de 100 vezes mais.
Observei que, durante as swapoff
duas CPUs, a maioria estava ociosa (talvez 10% de um núcleo) e os discos ("medidos" pelos LEDs). Também vi que os espaços de troca foram desativados um após o outro.
iostat -d 5
apresentam baixa IO nos discos duranteswapoff
, também?Respostas:
Primeiro, vamos ver o que você pode esperar do seu disco rígido. Seu disco rígido pode executar 200 MB / s sequencialmente . Quando você considera os tempos de busca, pode ser muito mais lento. Para escolher um exemplo arbitrário, dê uma olhada nas especificações de um dos modernos discos de 3 TB da Seagate, o ST3000DM001 :
Taxa máxima de dados sustentados: 210 MB / s
Buscar leitura média: <8,5 ms
Bytes por setor: 4.096
Se você nunca precisar procurar e se a sua troca estiver próxima à borda do disco, poderá esperar até a taxa máxima = 210 MB / s
Mas se seus dados de troca estiverem totalmente fragmentados, na pior das hipóteses, você precisará procurar todos os setores que lê. Isso significa que você só consegue ler 4 KB a cada 8,5 ms ou 4 KB / 0,0085 = 470 KB / s
Portanto, logo de cara, não é inconcebível que você esteja de fato correndo contra as velocidades do disco rígido.
Dito isto, parece bobagem que
swapoff
seria tão lenta e teria que ler páginas fora de ordem, especialmente se elas fossem escritas rapidamente (o que implica em ordem). Mas pode ser assim que o kernel funciona. O relatório de bug do Ubuntu # 486666 discute o mesmo problema:Uma das respostas foi:
O relatório de erro foi fechado sem solução.
O livro de Mel Gorman " Entendendo o Linux Virtual Memory Manager " está um pouco desatualizado, mas concorda que esta é uma operação lenta:
Há um pouco mais de discussão a partir de 2007 na lista de discussão do Linux-kernel com o assunto " acelerando a troca " - embora as velocidades que eles estão discutindo sejam um pouco mais altas do que você está vendo.
É uma pergunta interessante que provavelmente é geralmente ignorada, uma vez que
swapoff
raramente é usada. Eu acho que se você realmente queria segui-lo para baixo, o primeiro passo seria tentar assistir seus padrões de uso de disco com mais cuidado (talvez comatop
,iostat
ou até mesmo mais poderosas ferramentas comoperf
ousystemtap
). As coisas a procurar podem ser procura excessiva, pequenas operações de E / S, reescrita e movimentação constantes de dados, etc.fonte
Estou enfrentando o mesmo problema com o meu laptop, que tem um SSD, portanto, os horários de busca não devem ser um problema.
Eu encontrei uma explicação alternativa . Aqui está um trecho
Portanto, é um problema do kernel e não qualquer outra coisa.
fonte
swapoff
é implementado. Quando o processo é trocado, não demora muito.strace swapoff
praticamente tudo o que faz é chamar aswapoff
chamada de sistema.Sim, o
swapoff
mecanismo é terrivelmente ineficiente. A solução alternativa é fácil: itere nos processos, em vez das páginas trocadas. Use este script python (eu não sou afiliado):Observe que o modo de operação daemon é apenas para desktops / laptops que geralmente são hibernados. Eu não o executaria como um daemon em um sistema de servidor - apenas execute-o em primeiro plano, aguarde até que ele relate que ele cuidou de alguns processos, então pare e tente:
Como a maioria das páginas agora está presente tanto na troca quanto na memória, ela
swapoff
tem muito pouco a fazer e deve ser agora incrivelmente rápida (vi centenas de MB / s).Seção Histórico adiante
O script python mencionado acima é baseado no restante desta resposta, que por sua vez foi o aprimoramento dessa resposta mais antiga da autoria de jlong . Como o script é muito mais seguro, recomendo apenas tentar o resto da minha resposta como a última linha de defesa :
Este é executado talvez 2 segundos e não fazem nada, apenas lista os 10 principais segmentos de memória (na verdade, ele imprime mais one-liners; sim, eu não amo one-liners, basta examinar os comandos, aceitar o risco, copiar e colar em seu shell; eles realmente lerão do swap).
O one-liner principal é seguro (para mim), exceto que lê muito / proc.
Os subcomandos preparados para seu exame manual não são seguros . Cada comando trava um processo durante a leitura de um segmento de memória do swap. Portanto, é inseguro com processos que não toleram nenhuma pausa. As velocidades de transferência que eu vi eram da ordem de 1 gigabyte por minuto. (O script python mencionado acima removeu essa deficiência).
Outro perigo é colocar muita pressão de memória no sistema; portanto, verifique com as
free -m
O que isso faz?
A saída desse script perl é uma série de
gdb
comandosdump memory (range)
que lembram páginas trocadas na memória.A saída começa com o tamanho, por isso é fácil passá-lo
| sort -Vr | head
para obter os 10 maiores segmentos por tamanho (SSIZE). Os-V
estandes para classificar-version-número adequado, mas funciona para o meu propósito. Eu não conseguia descobrir como fazer a classificação numérica funcionar.fonte
sort -t = -k 2n
/proc/$pid/mem
, procurar e ler diretamente. Aqui está o PoC baseado em grande parte no seu snippet: gist.github.com/WGH-/91260f6d65db88be2c847053c49be5ae Desta forma, o processo não é interrompido, pois o AFAIK não deve causar nenhum perigo.Durante a troca, se um slot de troca em uso for detectado, o kernel primeiro troca na página. A função unuse_process () tenta localizar todas as entradas da tabela de páginas que correspondem à página recém-trocada e faz a atualização necessária nas tabelas de páginas. A pesquisa é exaustiva e consome muito tempo: ela visita todos os descritores de memória (de todo o sistema) e examina suas entradas da tabela de páginas uma a uma.
Por favor, consulte a página 724 de "Entendendo a 3a versão do Kernel Linux".
fonte