Primeiro, vamos ver o que você pode esperar do seu disco rígido. Seu disco rígido pode fazer 200 MB / s sequencialmente . Quando você considera 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
-
Pedir média de leitura: < 8.5 ms
-
Bytes por setor: 4.096
Se você nunca precisar procurar, e se a sua troca estiver perto da borda do disco, você pode esperar ver a taxa máxima = 210 MB / s
Mas se os seus dados de troca estiverem totalmente fragmentados, no pior cenário, você precisará procurar por todos os setores que você lê. Isso significa que você só consegue ler 4 KB a cada 8,5 ms ou 4 KB / 0,0085 = 470 KB / s
Então, logo de cara, não é inconcebível que você esteja na verdade correndo contra as velocidades do disco rígido.
Dito isso, parece tolo que swapoff
seja executado tão lentamente e tenha que ler páginas fora de ordem, especialmente se elas foram escritas rapidamente (o que implica em ordem). Mas isso pode ser apenas como o kernel funciona. O relatório de bugs do Ubuntu # 486666 discute o mesmo problema:
The swap is being removed at speed of 0.5 MB/s, while the
hard drive speed is 60 MB/s;
No other programs are using harddrive a lot, system is not under
high load etc.
Ubuntu 9.10 on quad core.
Swap partition is encrypted.
Top (atop) shows near 100% hard drive usage
DSK | sdc | busy 88% | read 56 | write 0 | avio 9 ms |
but the device transfer is low (kdesysguard)
0.4 MiB/s on /dev/sdc reads, and 0 on writes
Uma das respostas foi:
It takes a long time to sort out because it has to rearrange and flush the
memory, as well as go through multiple decrypt cycles, etc. This is quite
normal
O relatório de bug foi fechado sem solução.
O livro de Mel Gorman " Noções básicas sobre o gerenciador de memória virtual do Linux " está um pouco fora de data, mas concorda que esta é uma operação lenta:
The function responsible for deactivating an area is, predictably enough, called
sys_swapoff()
. This function is mainly concerned with updating theswap_info_struct
. The major task of paging in each paged-out page is the responsibility oftry_to_unuse()
which is extremely expensive.
Há um pouco mais de discussão a partir de 2007 na lista de discussão linux-kernel com o assunto " excesso de velocidade up swapoff "- embora as velocidades que eles estão discutindo sejam um pouco maiores do que você está vendo.
É uma questão interessante que provavelmente é geralmente ignorada, já que swapoff
raramente é usado. Acho que, se você realmente quisesse rastreá-lo, o primeiro passo seria tentar observar os padrões de uso de disco com mais cuidado (talvez com atop
, iostat
ou ferramentas ainda mais poderosas, como perf
ou systemtap
). Coisas para procurar podem ser busca excessiva, pequenas operações de E / S, reescrita constante e movimentação de dados, etc.