Como impedir que um programa específico seja trocado?


23

É possível impedir que um programa específico (por exemplo, rhythmbox e suas dependências) seja trocado para o disco?

Estou perguntando, porque tenho um problema quando um reprodutor de música soluça sempre que o Chromium consome muita memória. Existe uma maneira de contornar isso? Isso não é mais um problema no Windows, então presumivelmente existe um caminho.


Tomboy tem o mesmo problema. É uma das razões pelas quais algumas pessoas mudaram para o GNote .
Cristian Ciupitu

11
Eu acho que o problema do soluço não é necessariamente causado pela troca. Se o programa estiver reproduzindo 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ê já correu psou toppara ver se o rhytmbox é realmente trocado verificando o campo RSS/ RES? Acho que seu problema é causado principalmente por agendamento inadequado. Você deve tentar reniceo processo rhytmbox ou alterar algumas de suas configurações, por exemplo, o tamanho do buffer de áudio.
Cristian Ciupitu

11
Obrigado! Existe uma maneira de configurar o bom valor inicial de um programa? / etc / nicetab ou algo assim? :)
Alexei Averchenko,

Respostas:


10

Eu acho que o problema do soluço não é necessariamente causado pela troca. Se um programa estiver reproduzindo 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 olhando para o campo RSS/ RESdo ps ou top . RSSé o tamanho do conjunto residente, a memória física não trocada que uma tarefa está usando (em kiloBytes).

Acho que o seu problema provavelmente é causado por agendamento inadequado de CPU e 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 comando ionice . Somente o super usuá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 de desktop com vários patches de baixa latência, portanto, considere usá-los. Um deles é um patch de ~ 200 linhas escrito por Mike Galbraith que impressionou até Linus. A alternativa para esse patch é o truque dos 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 alta prioridade ou alterá-lo posteriormente. Para a primeira opção, você pode usar um script de wrapper no 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 iniciar isso, use suou sudo.

Quanto à alteração da prioridade posteriormente, se você estiver com preguiça de fazer login como root para alterá-la, tente usar um trabalho cron que seja executado a cada 5 minutos e defina a prioridade do rhythmboxprocesso, mas eu não recomendaria isso:

#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`

5

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

Há muito tempo, os arquivos executáveis ​​respeitavam a parte complicada +tque dizia ao kernel para não trocar, mas hoje é ignorado.

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

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

Shouldn'tocorre quando você está desenvolvendo algum aplicativo e não deseja que ele seja trocado. Dê uma olhada nesta postagem no stackoverflow .


2
Eu não acho que reservar cerca de 100 MiB matará meu sistema. Talvez haja outra maneira de resolver meu problema específico (consulte a pergunta editada)?
Alexei Averchenko

11
Se você pretende manter um processo em um alto nível de capacidade de resposta em relação a outros processos, a resposta é boa (você deve estar na raiz para fazer isso). Não é fácil mexer na paginação da memória se você não quiser sujar as mãos (toque no código, recompile ou até mesmo LD_PRELOADing uma biblioteca personalizada para enganar o processo e ajustar a função usada para alocar memória - novamente, não recomendado) . Adendo ? renice o processo, obter mais RAM, ou abas de abertura de paragem;)
Torian

5
"Se o kernel decide que precisa trocar, com certeza tem um motivo válido" que não é verdade. Hoje eu tinha 1,3G de memória livre. O kernel do Linux colocou meus processos httpd na troca (370M).
Blueszcz 6/08

@bluszcz (bem, outros lendo isso, dada a idade desse comentário): Isso pode ser porque decidiu que o cache do disco para os arquivos servidos pelo seu httpd é mais importante do que partes raramente usadas do seu httpd - veja as outras respostas mencionando "swappiness".
Jan Schejbal

@JanSchejbal é porque o linux, pelo menos sem que alguém diga, não sabe quais processos são importantes ou não. Em um ambiente de servidor, você deve poder informar ao sistema quais processos são importantes e quais não são. "Eu não me importo com outras coisas, mas esses processos são os mais importantes para a operação deste servidor"
Rahly 29/07/16


3

Existem várias maneiras de fazer isso. Você pode tentar "se" diz que o Linux trabalha menos com swap (geralmente):

echo 10 > /proc/sys/vm/swappiness

De: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

swappiness

Este controle é usado para definir o quão agressivo o kernel trocará as páginas de memória. Valores mais altos aumentam a agressividade, valores mais baixos diminuem a quantidade de swap.

O valor padrão é 60.

Outra opção é usar o gerenciador de kernel do cgroups, isso é específico por processo, mas você terá algum "trabalho" a fazer: Respondido aqui: /unix/10214/per-process-swapiness-for -linux # 10227


11
isso afeta a troca globalmente, não é específico do processo.
Lorenzo Von Matterhorn

11
sim, você pode notar que em "(geralmente)" escrevi. A opção de ser por processo é o link para outra resposta, usando cgroups.
ceinmart

Então isso não ajuda, é?
Ken Sharp

Ken Sharp: Essa resposta é a única que se vincula diretamente ao que parece (pelo menos à primeira vista) a melhor solução para o problema. Então ... praticamente o oposto do que você disse.
phils

@phils Você não entende como isso funciona.
Ken afiada

0

Você pode usar o mlockall()syscall. mlockall () força o processo de memória a ser residente (= sem troca, sem supercomprometimento, etc ...). AFAIK, não há nenhum comando shell para fazê-lo, mas é fácil criar um. Seria como:

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

Observe que você precisa ser root para ligar mlockall().

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


11
O código não funcionará, pois o execvp é um frontend para o execve que desfaz o mlockall. Consulte a seção Notas na página de manual do mlock.
Johannes Matokic 27/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.