Existe uma maneira de realmente priorizar processos ou fazer o Linux respeitar suas prioridades?

5

Eu sei que existem prioridades de processo como em outros sistemas operacionais, indo de -20 (a maioria dos prio) a 19 (menos de prio), mas o Linux parece ignorá-los.

Neste momento, eu estava construindo o kernel em segundo plano (embora make processe a prioridade 0) e, como demorou algum tempo, decidi assistir a algo. Então eu abri um vídeo H264 bastante exigente (~ 30% do tempo de CPU de um Core2 2.6GHz) em VLC apenas para descobrir que havia rasgos, quadros perdidos, artefatos visuais (resultantes do anterior eu presumo), embora o áudio parecesse estar bem.

Então, decidi alterar a prioridade do VLC usando renice , e vi que o PulseAudio tinha -11 . Eu decidi colocá-lo no par, então fiz sudo renice -11 -p VLC_PROC_# .

A mesma coisa continuou acontecendo, então eu continuei e defini-lo para -20, mas eu ainda continuava vendo artefatos visuais.

Então, eu me pergunto, por que o Linux não priorizou realmente um processo -20 sobre alguns processos e deu a ele o que precisava? Existe alguma maneira de realmente priorizar processos no Linux?

Caso seja importante, estou executando um Arch de 64 bits aqui, o XFCE como ambiente de área de trabalho.

EDIT: A compilação do kernel foi realizada em /tmp , que eu tenho como tmpfs , então suas fontes e todas já estavam na RAM. O uso da RAM nem chegou a 60% e não havia operações de paginação.

O cenário detalhado acima é apenas um caso de teste , estou mais interessado em saber por que o Linux executou como ele funcionou e se há alguma maneira de obter prioridades reais.

    
por Kao Dome 13.10.2013 / 21:48

3 respostas

6

renice afeta a prioridade de um processo. Mas, como você já experimentou, só porque um processo tem maior prioridade não significa que ele terá todos os recursos necessários. Uma prioridade mais alta apenas dá ao processo uma chance maior de obter recursos.

renice afeta apenas o tempo da CPU. Portanto, isso só tem efeito se dois ou mais processos estiverem competindo pelo tempo de CPU. Se o fator limitante não for o tempo da CPU, mas a largura de banda de E / S, o bom valor não terá impacto. Talvez no seu caso a compilação esteja usando muita largura de banda de disco e a vlc não consiga ler os dados com rapidez suficiente a partir do disco. Tente ionice em vez disso ou além de nice .

Se você fizer isso com frequência, obterá melhores resultados se o vídeo e a compilação estiverem em discos separados. Além disso, você pode obter melhores resultados se pré-carregar o vídeo no cache de disco ( cat /path/to/video.file >/dev/null ou tail -c +456m | head -c 123m /path/to/video.file >/dev/null para ler 123MB a partir do deslocamento de 456MB) - mas, a menos que você tenha muita RAM, a compilação provavelmente reivindicará o cache espaço de volta. Se você quiser ter certeza de ter o vídeo na memória, faça um disco virtual e copie o vídeo para ele.

    
por 14.10.2013 / 00:01
1

A prioridade do processo não é a única coisa que acontece quando você está tentando ajustar a experiência do usuário . Compilar o kernel é uma coisa bastante pesada com I / O - muita leitura / escrita de / para arquivos pequenos que podem esticar bastante o sistema de arquivos (há uma razão pela qual às vezes é usado como um benchmark por si só , especialmente em uma máquina multiprocessada. Se você tem RAM suficiente, eu sugiro que você tente compilar o kernel em tmpfs - pelo menos parcialmente: coloque a árvore fonte lá (que efetivamente funcionará como pré-busca no cache) ou envie a saída lá usando

make O=/dev/shm ...

ou onde quer que você decida montar sua instância de tmpfs grande o suficiente para conter os arquivos de objetos do kernel - que podem facilmente estar no intervalo de gigabytes).

Além disso, você também pode verificar se o VLC tem um recurso de cache (acho que ele tem, por exemplo, o MPlayer tem a opção -cache ) com o qual você pode solicitar o armazenamento em cache dos dados internamente. Então, não é necessário obter os dados conforme necessário, mas quando eles se tornam disponíveis.

Outra coisa é que a exibição é feita através do servidor X - sua prioridade também teria que ser aumentada (veja o comentário da Wumpus Q. Wumbley sob a pergunta).

Mais duas opções estão usando cgroups e / ou RT scheduler (para o primeiro ver por exemplo, controlando a prioridade dos aplicativos usando cgroups , para o último veja, por exemplo, o Instruções do Gentoo ).

A última coisa é que você pode querer otimizar seu sistema um pouco, transformando serviços desnecessários. Pessoalmente, eu consideraria o PulseAudio sendo o primeiro a começar.

No entanto, o que você descreve parece mais com alguma alta prioridade de E / S acontecendo - meu palpite é que você experimentou algumas trocas pesadas - você tem certeza que seu tmpfs não foi forçado a ser trocado? Nesse caso, receio que pelo menos iorenice não seja de muita ajuda.

    
por 13.10.2013 / 22:38
0

Como outros já disseram, há muitas partes de um sistema que podem ser afetadas, incluindo a largura de banda da memória, e essas outras partes do sistema também terão seus próprios agendamentos e prioridades.

Você sempre pode usar chrt -i 0 para dar prioridade verdadeira à compilação. link

Ou acelere a compilação usando cgroups. link

Ou jogue tudo nisso:

eatmydata cgexec -g cpu:throttled chrt -i 0 ionice -c3 nice -n19 /path/to/compile-script >/dev/null

Nota: nice -n19 não deve fazer nenhuma diferença se chrt -i 0 for usado, mas também não afetará nada.

Meu antigo P4 pode fazer a mesma coisa sem ficar chateado com o VLC.

    
por 10.04.2015 / 07:38