Existe-t-il un moyen de prioriser les process ou de faire en sorte que Linux respecte leurs priorités?

Je sais qu'il y a des priorités de process comme dans d'autres systèmes d'exploitation, allant de -20 (le plus prio) à 19 (less prio) mais Linux semble les ignorer.

En ce moment, je construisais le kernel en arrière-plan (bien make process de make aient la priorité 0) et comme cela a pris un certain time, j'ai décidé de regarder quelque chose. J'ai donc ouvert une video H264 assez exigeante (~ 30% du time CPU d'un Core2 2.6GHz) dans VLC pour découvrir qu'il y avait des déchirures, des frameworks perdus, des artefacts visuels (résultant de la précédente), bien que l'audio semblait être bien.

J'ai donc décidé de changer la priorité de VLC en utilisant renice , en voyant concrètement que PulseAudio avait -11 j'ai décidé de le mettre au pair donc j'ai fait sudo renice -11 -p VLC_PROC_# .

La même chose a continué à se produire, alors j'ai continué et je l'ai mis à -20 mais j'ai continué à voir des artefacts visuels.

Donc, je me request pourquoi Linux n'a pas priorisé un process -20 sur certains process 0 et lui donner tout ce dont il a besoin? Yat-il un moyen de vraiment prioriser les process sous Linux?

Au cas où cela count, je suis en train d'exécuter un Arch 64 bits ici, XFCE comme environnement de bureau.

EDIT: La compilation du kernel a été effectuée dans /tmp que j'ai comme tmpfs afin que ses sources et toutes étaient déjà dans la RAM. L'utilisation de RAM n'a même pas atteint 60% et il n'y avait pas d'opérations de pagination en place.

Le scénario détaillé ci-dessus est juste un cas de test , je suis plus intéressé par les raisons pour lesquelles Linux a fait ce qu'il a fait et s'il y a moyen d'get de vraies priorités.

renice affecte la priorité d'un process. Mais comme vous l'avez expérimenté, le fait qu'un process ait une priorité plus élevée n'implique pas qu'il aura toutes les ressources dont il a besoin. Une priorité plus élevée donne simplement au process une plus grande chance de saisir les ressources.

renice n'affecte que le time CPU. Donc, cela n'a d'effet que si deux process ou plus sont en compétition pour le time CPU. Si le facteur limitant n'est pas le time CPU mais la bande passante E / S, la valeur intéressante n'a pas d'impact. Peut-être que dans votre cas, la compilation utilise beaucoup de bande passante disque et vlc n'est pas capable de lire datatables assez rapidement à partir du disque. Essayez ionice place ou en plus de nice .

Si vous le faites souvent, vous obtiendrez de meilleurs résultats si la video et la compilation sont sur des disques distincts. En outre, vous pouvez get de meilleurs résultats si vous précharger la video dans le cache disque ( cat /path/to/video.file >/dev/null , ou tail -c +456m | head -c 123m /path/to/video.file >/dev/null pour lire 123MB à partir du décalage 456MB) – mais à less d'avoir beaucoup de RAM, la compilation est susceptible de réclamer l'espace cache. Si vous voulez être sûr d'avoir la video en memory, créez un disque virtuel et copyz-y la video.

Priorité de process n'est pas la seule chose qui entre en jeu lorsque vous essayez de modifier l'expérience user . La compilation du kernel est plutôt lourde – beaucoup de lecture / écriture de / vers de petits files, ce qui peut étirer le système de files (il y a une raison pour laquelle il est parfois utilisé comme un repère à part entière ) , en particulier sur une machine multiprocesseur. Si vous avez assez de RAM, je vous suggère d'essayer de comstackr le kernel dans tmpfs – au less en partie: soit mettre l'tree source là-bas (qui agira effectivement comme prélecture dans le cache) soit envoyer la sortie en utilisant

 make O=/dev/shm ... 

ou où vous décidez de monter votre instance de tmpfs assez grande pour contenir les files d'object du kernel – qui peuvent facilement être dans la gamme de gigaoctets).

En dehors de cela, vous pouvez également vérifier si VLC dispose d'une fonctionnalité de caching (je suppose qu'il l'a, par exemple pour MPlayer a l'option -cache ) avec laquelle vous pouvez requestr la caching des données en interne. Ensuite, il n'est pas nécessaire d'get datatables comme elles en ont besoin, mais lorsqu'elles deviennent disponibles.

Une autre chose est que l'affichage se fait via le server X – sa priorité devrait également être renforcée (voir le commentaire de Wumpus Q. Wumbley sous la question).

Deux autres options utilisent des cgroups et / ou un ordonnanceur RT (pour la première voir, par exemple, contrôler la priorité des applications en utilisant des cgroups , pour ce dernier voir par exemple les instructions de Gentoo ).

La dernière chose est, que vous pourriez vouloir optimiser votre système un peu, en tournant des services inutiles. Personnellement, je considérerais PulseAudio comme étant le premier à commencer.

Cependant, ce que vous décrivez ressemble plus à un E / S à priorité élevée – je suppose que vous avez subi un échange important – êtes-vous sûr que votre tmpfs n'a pas été forcé à être échangé? Dans ce cas, je crains qu'au less iorenice ne soit pas d'une grande aide.

Comme d'autres l'ont dit, de nombreuses parties d'un système peuvent être affectées, y compris la bande passante de la memory, et ces autres parties du système auront également leur propre programmation et leurs priorités.

Vous pouvez toujours utiliser chrt -i 0 pour donner la priorité au ralenti de la compilation. http://linux.die.net/man/1/chrt

Ou étrangler la compilation en utilisant cgroups. http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups.html

Ou jetez tout à elle:

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

Note: nice -n19 ne devrait pas faire de différence si chrt -i 0 est utilisé, mais cela ne fera pas de mal non plus.

Mon ancien P4 peut faire la même chose sans que VLC se fâche.