Eu tenho um laptop Debian (Buster) com 8 GB de RAM e 16 GB de swap. Estou executando uma tarefa muito longa. Isso significa que meu laptop foi deixado ligado nos últimos seis dias enquanto ele roda.
Ao fazer isso, periodicamente preciso usar meu laptop como laptop. Isso não deve ser um problema; a tarefa de longa execução é limitada por E/S, trabalhando em um disco rígido USB e não consome muita RAM (<200 MB) ou CPU (<4%).
O problema é que quando eu voltar ao meu laptop depois de algumas horas, ele ficará muito lento e pode levar 30 minutos para voltar ao normal. Isso é tão ruim que os monitores de falhas sinalizam seus respectivos aplicativos como congelados (especialmente as janelas do navegador) e as coisas começam a falhar incorretamente.
Olhando no monitor do sistema, dos 2,5 GB usados, cerca de metade é trocado. Confirmei que esse é o problema removendo o espaço de troca ( swapoff /dev/sda8
). Se eu deixá-lo sem espaço de troca, ele volta à vida quase instantaneamente, mesmo após 24 horas. Com a troca, é praticamente um tijolo nos primeiros cinco minutos, restando apenas seis horas. Confirmei que o uso de memória nunca excede 3 GB , mesmo quando estou ausente.
Eu tentei reduzir o swappiness ( veja também: Wikipedia ) para valores de 10
e 0
, mas o problema ainda persiste. Parece que após um dia de inatividade, o kernel acredita que toda a GUI não é mais necessária e a limpa da RAM (troca-a para o disco). A tarefa de longa duração é ler através de uma vasta árvore de arquivos e ler todos os arquivos. Portanto, pode ser que o kernel esteja confuso ao pensar que o cache ajudaria. Mas em uma única varredura de um HD USB de 2 TB com ~ 1 bilhão de nomes de arquivos, uma RAM extra de GB não ajudará muito o desempenho. Este é um laptop barato com um disco rígido lento. Ele simplesmente não pode carregar dados de volta na RAM com rapidez suficiente.
Como posso dizer ao Linux para usar apenas o espaço de troca em uma emergência? Eu não quero correr sem swap. Se algo inesperado acontecer, e o sistema operacional de repente precisar de alguns GBs extras, não quero que as tarefas sejam eliminadas e prefiro começar a usar o swap. Mas no momento, se eu deixar a troca habilitada, meu laptop simplesmente não pode ser usado quando eu precisar.
A definição precisa de uma "emergência" pode ser motivo de debate. Mas para esclarecer o que quero dizer: uma emergência seria onde o sistema fica sem outra opção além de trocar ou matar processos.
O que é uma emergência? - Você realmente tem que perguntar?... Espero que você nunca se encontre em um prédio em chamas!
Não me é possível definir tudo o que possa constituir uma emergência nesta questão. Mas, por exemplo, uma emergência pode ser quando o kernel é tão pressionado pela memória que começa a matar processos com o OOM Killer . Uma emergência NÃO é quando o kernel pensa que pode melhorar o desempenho usando swap.
Edição final: aceitei uma resposta que faz exatamente o que pedi no nível do sistema operacional. Os futuros leitores também devem tomar nota das respostas que oferecem soluções em nível de aplicativo.
Uma correção é certificar-se de que o controlador de memória cgroup está habilitado (acho que é por padrão em kernels meio recentes, caso contrário, você precisará adicionar
cgroup_enable=memory
à linha de comando do kernel). Então você pode executar sua tarefa intensiva de E/S em um cgroup com um limite de memória, o que também limita a quantidade de cache que pode consumir.Se você estiver usando o systemd, você pode definir
+MemoryAccounting=yes
eMemoryHigh
/MemoryMax
ouMemoryLimit
(depende se você estiver usando cgroup v1 ou v2) na unidade ou em uma fatia que o contenha. Se for uma fatia, você pode usarsystemd-run
para executar o programa na fatia.Exemplo completo de um dos meus sistemas para rodar o Firefox com limite de memória. Observe que isso usa cgroups v2 e é configurado como meu usuário, não como root (uma das vantagens de v2 sobre v1 é que delegar isso para não-root é seguro, então o systemd faz isso).
Descobri que para fazer o usuário funcionar, tive que usar uma fatia. O sistema um funciona apenas colocando as opções no arquivo de serviço (ou usando
systemctl set-property
no serviço).Aqui está um exemplo de serviço (usando cgroup v1), observe as duas últimas linhas. Isso faz parte da instância do sistema (pid=1).
A documentação está em
systemd.resource-control(5)
.Ter uma troca tão grande hoje em dia é muitas vezes uma má ideia. No momento em que o sistema operacional trocou apenas alguns GB de memória para trocar, seu sistema já havia rastreado até a morte (como o que você viu)
É melhor usar
zram
com uma pequena partição de troca de backup . Muitos sistemas operacionais como ChromeOS , Android e várias distribuições Linux ( Lubuntu , Fedora ) habilitam o zram por padrão há anos, especialmente para sistemas com menos RAM. É muito mais rápido do que trocar no HDD e você pode sentir claramente a capacidade de resposta do sistema neste caso. Menos em um SSD, mas de acordo com os resultados de benchmark aqui ainda parece mais rápido, mesmo com o algoritmo lzo padrão. Você pode mudar para lz4 para um desempenho ainda melhor com uma taxa de compactação um pouco menor. Sua velocidade de decodificação é quase 5 vezes mais rápida que o lzo com base no benchmark oficialNa verdade , o Windows 10 e o macOS também usam técnicas de compactação de arquivo de paginação semelhantes por padrão
Há também
zswap
embora eu nunca tenha usado. Provavelmente vale a pena tentar e comparar qual é melhor para seus casos de usoDepois disso, outra sugestão é reduzir a prioridade desses processos vinculados a IO e possivelmente deixar um terminal executando com prioridade mais alta para que você possa executar comandos nele imediatamente, mesmo quando o sistema estiver com carga alta
Leitura adicional
O kernel está fazendo a coisa certa™ acreditando nisso. Por que manteria 1 memória não utilizada na RAM e, essencialmente, a desperdiçaria em vez de usá-la como cache ou algo assim?
Eu não acho que o kernel Linux esteja trocando páginas de forma gratuita ou antecipada, então se ele fizer isso deve ser para armazenar algo mais na RAM, melhorando assim o desempenho de sua tarefa de longa duração, ou pelo menos com esse objetivo.
Se você souber com antecedência quando precisará reutilizar seu laptop, poderá usar o
at
comando (oucrontab
) para agendar uma limpeza de troca (swapoff -a;swapon -a
).Como limpar a troca pode ser um exagero e até acionar o assassino OOM se, por algum motivo, nem tudo couber na RAM, você pode apenas "desfazer a troca" 2 tudo relacionado aos aplicativos em execução que deseja reviver.
Uma maneira de fazer isso seria anexar um depurador como
gdb
a cada um dos processos afetados e acionar uma geração de dump principal:Como você escreveu, seu aplicativo de longa execução não está reutilizando os dados que lê após a passagem inicial, portanto, você está em um caso específico em que o cache de longo prazo não é útil. Em seguida, ignorar o cache usando E/S direta, como sugerido por Will Crawford, deve ser uma boa solução alternativa.
Como alternativa, você pode liberar regularmente o cache do arquivo ecoando
1
ou3
para o/proc/sys/vm/drop_caches
pseudo-arquivo antes que o sistema operacional ache que é uma boa ideia trocar seus aplicativos e ambiente da GUI.Consulte Como você esvazia os buffers e o cache em um sistema Linux? para detalhes.
1 Sem uso no sentido de: não mais usado ativamente por um período significativo de tempo, a memória ainda sendo relevante para seus proprietários.
2 Coloque de volta na RAM as páginas armazenadas na área de troca.
O processo que você está executando é algo que você mesmo criou?
Nesse caso, pode valer a pena ajustar seu código para abrir os arquivos usando o
O_DIRECT
sinalizador, que para citar a página de manual -Aqui está uma ideia, que eu mesmo não experimentei (e lamento não ter tempo agora para experimentar isso).
Suponha que você crie uma pequena VM com apenas 512 MB de memória para seu processo em segundo plano. Não tenho certeza se você deseja que isso tenha alguma troca, sua chamada e desative a troca em seu sistema host.
Remova o swap ou diminua-o em cerca de 20% ( pode variar de acordo com os sistemas ), pois recentemente os sistemas operacionais não estão mais usando o swap da mesma maneira que nos últimos anos. Provavelmente responderá sua pergunta:
--> oficial redhat.com
algumas das informações da Red Hat abaixo,
e
https://wiki.debian.org/Swap
uma parte do link Debian acima,
Você pode tentar:
"Melhor maneira de desabilitar a troca no Linux"
***Nota pessoal:***
Desde que eu tenho 6 GB de RAM e em todos os meus sistemas operacionais Linux recentemente. Nunca vi nenhuma indicação do uso do Swap. Eu determinei que deveria desligá-lo por espaço (alguns gigabytes a mais) ou porque às vezes deixou meu sistema lento.