aumentar a capacidade de resposta da área de trabalho no linux ao trocar

15

Todas as distribuições GNU / Linux que testei até agora têm o problema de que, sempre que a memória RAM é preenchida e o sistema começa a ser trocado, toda a interface gráfica do usuário e da área de trabalho fica sem resposta, como um inferno, a tal ponto que às vezes eu tenho que esperar cerca de 5 a 10 segundos depois tendo movido o mouse físico até que o ponteiro do mouse esteja realmente se movendo.

Esse é um tipo de comportamento irritante, especialmente em sistemas com pouca memória RAM.

Existe alguma maneira de dar a alguns aplicativos / trabalhos, como o ambiente de desktop, etc., uma prioridade mais alta para permanecer no RAM do que outros aplicativos, para que o aplicativo que realmente monopoliza toda a memória seja trocado antes do ambiente de desktop etc.?

EDIT: Estou falando do caso em que toda a RAM é usada, portanto ela sempre começará a trocar se não estiver desativada (não quero que os processos sejam mortos aleatoriamente). Eu tive esse problema não apenas em ambientes com pouca RAM, mas também com 8GiB de RAM na minha máquina desktop, em parte devido a muitas VMs, em parte por causa de vazamento de memória. O ZRAM também não é uma solução, pois está apenas atrasando o problema. A única solução em que posso pensar para esse problema é algum utilitário de espaço do usuário ou API do kernel que permite impedir a troca de determinados trabalhos ou, pelo menos, torná-lo muito improvável. Alguém conhece outra solução ou sabe alguma coisa sobre essa ferramenta ou API existente ou sendo planejada?

2ª EDIT: ulatencyd parece não funcionar com versões mais recentes do systemd, de acordo com https://aur.archlinux.org/packages/ulatencyd-git/ e https://wiki.archlinux.org/index.php/Ulatencyd . Isso pode ocorrer porque o systemd assumiu o controle total dos cgroups da perspectiva do espaço do usuário, se eu entendi corretamente.

FSMaxB
fonte
3
cgroups, se você tiver o cgroup de memória ativado e a contabilidade de troca ativada ( cgroup_enable=memory swapaccount=1na linha de comando do kernel; observe que isso tem um custo menor de desempenho). Exemplo de implementação: ulatencyd .
derobert
@derobert Ótimo, isso parece que é exatamente o que eu estava procurando. Vou começar a experimentar isso assim que tiver tempo.
FSMaxB
Ótimo, o ulatencyd ainda tem um pacote AUR, acho que tenho sorte de ser usuário do Archlinux.
FSMaxB
Existe até um artigo wiki wiki.archlinux.org/index.php/Ulatencyd
FSMaxB
Se eu pudesse votar mais neste Q, eu votaria! Não existe realmente uma maneira direta de informar a GUI e alguns programas importantes para permanecer na RAM, para que ela permaneça responsiva? Quero dizer, qual é o pior cenário para oferecer aos usuários linux essa opção? O computador trava? Quem não fez isso antes? :) Quero dizer, às vezes, acidentalmente inicio muitas VMs porque não consegui adicionar (números de RAM) corretamente e, em seguida, é necessário SEMPRE recuperar as coisas sob controle. Dizer à GUI e talvez ao terminal para permanecer na RAM consertaria isso certo ?! Por favor, alguém responda isso!
Damon

Respostas:

1

Até onde eu sei, esse não é um problema específico do Linux, é o modo como o SWAP (ou memória virtual) funciona. Se o sistema operacional precisar procurar dados no disco rígido, em oposição à RAM, ele diminuirá a velocidade. Nada que você possa fazer sobre isso, acessar o disco é muito mais lento que acessar a RAM.

Você não poderá definir a prioridade com a qual os processos são trocados, isso é determinado pelo kernel que tentará maximizar a eficiência; você não poderá fazê-lo melhor. O que você pode fazer é definir a prioridade da CPU de um processo e isso pode ajudar. Seu sistema está sendo desativado devido ao tempo necessário para ler de / para SWAP, isso significa que a CPU terá que aguardar a recuperação dos dados relevantes pelo processo solicitando-os antes que possa continuar. Se você definir seu DE para ter uma prioridade mais alta para acesso à CPU, isso deve levar suas operações ao topo e acelerar um pouco as coisas.

Portanto, a prioridade da CPU é definida com os comandos nicee renice:

 Renice alters the scheduling priority of one or more running processes.
 The following who parameters are interpreted as process ID's, process
 group ID's, or user names.  Renice'ing a process group causes all pro‐
 cesses in the process group to have their scheduling priority altered.
 Renice'ing a user causes all processes owned by the user to have their
 scheduling priority altered.  By default, the processes to be affected
 are specified by their process ID's.

As prioridades vão de -20 (prioridade mais alta) a 20 (prioridade mais baixa). Para alterar a prioridade de um processo em execução, você pode:

renice -15 $PID

onde $PIDestá o PID do processo cuja prioridade você deseja aumentar. Você pode usar pgreppara descobrir qual é. Por exemplo:

renice -15 $(pgrep gnome-session)

A outra opção seria definir a ' troca ' do sistema, que determina quando iniciará a troca. Um valor de troca de 1 significa que ele será trocado apenas para evitar erros de falta de memória. Valores mais altos significam que ele começará a trocar mesmo quando ainda houver memória física disponível. Você pode definir isso como um valor relativamente baixo para fazer o sistema trocar o mínimo possível. Adicione esta linha a /etc/sysctl.conf:

vm.swappiness=1

CUIDADO: Isso não é uma boa ideia, se você não tem muita RAM, o swap é uma coisa boa em geral, você precisará brincar um pouco com os valores para encontrar o equilíbrio certo para o seu sistema.

Terdon
fonte
Como você afirma, isso pode ser resolvido no espaço do kernel, o que significa que seria muito bem específico do Linux. Alterar a swappiness não muda nada, porque quando toda a RAM é usada, o sistema está trocando de qualquer maneira. E a prioridade de um processo não muda nada no gerenciamento de memória, mas apenas o comportamento do agendador da CPU e do tempo da CPU não é realmente útil para acelerar o acesso ao disco.
FSMaxB
A prioridade da CPU do @FSMaxB pode ajudar, pois priorizará o DE, não ajudará se o DE estiver trocando, mas sim se houver outra coisa que está mantendo a CPU e, portanto, diminuindo a velocidade da máquina.
terdon
Quando o DE está ocioso por algum tempo, na minha experiência, o DE sempre é trocado quando a memória acaba.
FSMaxB
@FSMaxB sim, isso faz sentido, já que os DEs são porcos da memória. Ainda assim, aumentar sua prioridade pode ajudar, pelo menos o planejador não o reterá.
terdon