Como evitar que um programa específico troque?

18

É possível impedir que um programa específico (ou seja, o rhythmbox e suas dependências) possa sempre trocar para o disco?

Estou perguntando porque tenho um problema quando um player de música solta sempre que o Chromium emite muita memória. Existe uma maneira de contornar isso? Isso não é mais um problema no Windows, então, presumivelmente, existe um jeito.

    
por Alexei Averchenko 09.02.2011 / 02:44

5 respostas

9

Eu acho que o problema do soluço não é necessariamente causado pela troca. Se um programa está jogando algo, o Linux deve perceber isso e não trocá-lo. Programas que não fazem muito são os primeiros que são trocados. Você pode verificar se o programa está realmente sendo trocado observando o campo RSS / RES de ps ou topo . RSS é o tamanho do conjunto residente, a memória física não trocada que uma tarefa está usando (em kiloBytes).

Eu acho que o seu problema é provavelmente causado por CPU incorreto e programação de E / S e um pouco de ineficiência do Rhythmbox, o que o torna sensível a altas cargas do sistema. A prioridade da CPU pode ser alterada com os comandos nice e renice . A prioridade de E / S pode ser alterada com o ionice comando. Somente o superusuário pode usar altas prioridades. Você também deve saber que os caras do kernel do Linux estão tentando melhorar a capacidade de resposta dos sistemas desktop com vários patches de baixa latência, então você pode considerar usá-los. Um deles é um patch ~ 200 linhas escrito por Mike Galbraith , que impressionou até Linus. A alternativa para este patch é truque de cgroups de Lennart Poettering que eu acho que será o padrão no Fedora 15.

De qualquer forma, sem esses patches, existem duas opções: iniciar o programa com prioridade alta ou alterá-lo depois. Para a primeira opção, você pode usar um script wrapper em torno do Rhythmbox:

#!/bin/sh
# Run Rhytmbox with high CPU and I/O priorities
nice -n -10 ionice -c 1 -n 1 su -l -c rhythmbox alexei

Você precisará executá-lo como root. Se você não quiser fazer login como root apenas para começar, use su ou sudo .

Quanto a mudar a prioridade depois, se você está com preguiça de fazer login como root para alterá-la, pode tentar usar um cron job que execute a cada 5 minutos e defina a prioridade do processo rhythmbox , mas não recomendo fazer isso:

#!/bin/sh
renice -n -10 -p 'pidof rhythmbox'
ionice -c 1 -n 1 -p 'pidof rhythmbox'
    
por 09.02.2011 / 14:57
4

Resposta curta: você não pode e não deve.

Há muito tempo, arquivos executáveis honravam o bit pegajoso +t , o que diria ao kernel para não trocar, mas hoje ele é ignorado.

Se o kernel decidir trocar, certamente tem um motivo válido. O Linux é muito agressivo no uso da memória, porque a RAM que está ociosa é um recurso desperdiçado.

Se você realmente não deseja trocar, obtenha mais RAM, ou apenas # swapoff -a (não recomendado, pode tornar seu sistema inutilizável se você já tiver problemas).

Shouldn't vai quando você está desenvolvendo algum aplicativo e não quer que ele troque de jeito nenhum. Dê uma olhada em este post no stackoverflow .

    
por 09.02.2011 / 03:17
2

Isso parece já ter sido respondido aqui:

link

Embora o consenso seja que você provavelmente não deveria: /

    
por 09.02.2011 / 03:13
2

Existem várias maneiras de fazer isso. Você pode tentar tentar "diz" ao Linux trabalhar menos com swap (geralmente):

echo 10 > /proc/sys/vm/swappiness

De: link

swappiness

This control is used to define how aggressive the kernel will swap memory pages. Higher values will increase agressiveness, lower values decrease the amount of swap.

The default value is 60.

Outra opção é usar o gerenciador de kernel cgroups, isso é específico do processo, mas você terá algum "trabalho" para fazer: Respondido aqui: link

    
por 15.04.2013 / 00:36
0

Você pode usar mlockall() syscall. mlockall () força o processo de memória a ser residente (= sem swap, sem overcommit, etc ...). AFAIK, não há comando shell para fazer isso, mas é fácil criar um. Seria parecido com:

if (mlockall(MCL_FUTURE | MCL_CURRENT))
     perror("mlockall");
execvp(argv[0], argv);

Note que você precisa ser root para chamar mlockall() .

No entanto, como dito em outra resposta, não acho que seja realmente o que você quer.

    
por 26.10.2017 / 18:16

Tags