Comment empêcher un programme spécifique de permuter?

23

Est-il possible d'empêcher un programme spécifique (ie rhythmbox et ses dépendances) de basculer sur le disque?

Je demande parce que j'ai un problème quand un lecteur de musique hoquet quand Chromium monopolise trop de mémoire. Existe-t-il un moyen de contourner cela? Ce n'est plus un problème dans Windows, donc il y a probablement un moyen.

Alexei Averchenko
la source
Tomboy a le même problème. C'est l'une des raisons pour lesquelles certaines personnes sont passées à GNote .
Cristian Ciupitu
1
Je pense que le problème du hoquet n'est pas nécessairement causé par l'échange. Si le programme joue quelque chose, Linux devrait le remarquer et ne pas l'échanger. Les programmes qui ne font pas grand-chose sont les premiers à être échangés. Avez-vous exécuté psou toppour voir si la rhytmbox est vraiment permutée en vérifiant le champ RSS/ RES? Je pense que votre problème est principalement causé par une mauvaise planification. Vous devriez essayer renicele processus de rhytmbox ou changer certains de ses paramètres, par exemple la taille du tampon audio.
Cristian Ciupitu
1
Merci! Existe-t-il un moyen de définir la valeur initiale agréable d'un programme? / etc / nicetab ou quelque chose? :)
Alexei Averchenko
en relation: stackoverflow.com/questions/2360116/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Réponses:

10

Je pense que le problème du hoquet n'est pas nécessairement causé par l'échange. Si un programme joue quelque chose, Linux devrait le remarquer et ne pas l'échanger. Les programmes qui ne font pas grand-chose sont les premiers à être échangés. Vous pouvez vérifier si le programme est vraiment échangé en regardant le champ RSS/ RESdepuis ps ou top . RSSest la taille de l'ensemble résident, la mémoire physique non permutée utilisée par une tâche (en kilo-octets).

Je pense que votre problème est probablement dû à une mauvaise planification du processeur et des E / S et à un peu d'inefficacité de Rhythmbox qui le rend sensible aux charges système élevées. La priorité du processeur peut être modifiée avec les commandes nice et renice . La priorité d'E / S peut être modifiée avec la commande ionice . Seul le super utilisateur peut utiliser des priorités élevées. Vous devez également savoir que les gars du noyau Linux tentent d'améliorer la réactivité des systèmes de bureau avec divers correctifs à faible latence, vous pouvez donc envisager de les utiliser. L'un d'eux est un patch de ~ 200 lignes écrit par Mike Galbraith qui a impressionné même Linus. L'alternative à ce patch est l'astuce des cgroups de Lennart Poettering qui je pense sera la valeur par défaut dans Fedora 15.

Quoi qu'il en soit, sans ces correctifs, il y a deux options: démarrer le programme avec une priorité élevée ou le modifier par la suite. Pour la première option, vous pouvez utiliser un script wrapper autour de 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

Vous devrez l'exécuter en tant que root. Si vous ne voulez pas vous connecter en tant que root juste pour commencer, vous pouvez utiliser soit suou sudo.

En ce qui concerne la modification de la priorité par la suite, si vous êtes trop paresseux pour vous connecter en tant que root pour le changer, vous pouvez essayer d'utiliser un travail cron qui s'exécute toutes les 5 minutes et définit la priorité du rhythmboxprocessus, mais je ne recommanderais pas de le faire:

#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`
Cristian Ciupitu
la source
5

Réponse courte: vous ne pouvez pas et ne devriez pas.

Il y a longtemps, les fichiers exécutables respectaient le bit collant +tqui indiquerait au noyau de ne pas permuter, mais aujourd'hui, il est ignoré.

Si le noyau décide qu'il doit échanger, il a certainement une raison valable. Linux est très agressif sur l'utilisation de la mémoire, car la RAM inactive est une ressource gaspillée.

Si vous ne voulez vraiment pas échanger, obtenez plus de RAM, ou tout simplement # swapoff -a(non recommandé, vous pouvez rendre votre système inutilisable si vous avez déjà des problèmes).

Shouldn'tse passe lorsque vous développez une application et que vous ne voulez pas du tout la changer. Jetez un oeil à ce post sur stackoverflow .

Torian
la source
2
Je ne pense pas que réserver environ 100 Mio va tuer mon système. Peut-être qu'il existe une autre façon de résoudre mon problème particulier (voir la question modifiée)?
Alexei Averchenko
1
Si vous avez l'intention de maintenir un processus à un niveau élevé de réactivité par rapport à d'autres processus, la réponse est agréable (vous devez être root pour ce faire). Il n'est pas facile de jouer avec la pagination de la mémoire si vous ne voulez pas vous salir les mains (touchez le code, recompilez ou même LD_PRELOADing une bibliothèque personnalisée pour tromper le processus et peaufiner la fonction utilisée pour allouer de la mémoire - encore une fois, non recommandé) . Conseil ? reniez le processus, obtenez plus de RAM ou arrêtez d'ouvrir les onglets;)
Torian
5
"Si le noyau décide qu'il doit échanger, il a certainement une raison valable" ce n'est pas vrai. Aujourd'hui, j'avais 1,3 Go de mémoire libre. Le noyau Linux a mis mes processus httpd dans l'échange (370M).
bluszcz
@bluszcz (enfin, d'autres lisent ceci étant donné l'âge de ce commentaire): Cela pourrait être parce qu'il a décidé que le cache disque des fichiers servis par votre httpd est plus important que les parties rarement utilisées de votre httpd lui-même - voir les autres réponses mentionnant "swappiness".
Jan Schejbal du
@JanSchejbal c'est parce que Linux, au moins sans que quelqu'un ne le dise, ne sait pas quels processus sont importants ou non. Dans un environnement de serveur, vous devez pouvoir indiquer au système quels processus sont importants et lesquels ne le sont pas. "Je ne me soucie pas d'autres choses, mais ces processus sont les plus importants pour le fonctionnement de ce serveur"
Rahly
3

Il existe plusieurs façons de procéder. Vous pouvez essayer d'essayer "dit" que Linux fonctionne moins avec swap (en général):

echo 10 > /proc/sys/vm/swappiness

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

swappiness

Ce contrôle est utilisé pour définir l'agressivité du noyau pour échanger les pages mémoire. Des valeurs plus élevées augmenteront l'agressivité, des valeurs plus faibles diminueront la quantité de swap.

La valeur par défaut est 60.

Une autre option est d'utiliser le gestionnaire de noyau cgroups, c'est spécifique à chaque processus mais vous aurez du "travail" à faire: Répondu ici: /unix/10214/per-process-swapiness-for -linux # 10227

ceinmart
la source
1
cela affecte la permutabilité à l'échelle mondiale, pas spécifique au processus.
Lorenzo Von Matterhorn
1
oui, vous pouvez remarquer que sur "(généralement)" j'ai écrit. L'option d'être par processus est le lien vers une autre réponse, en utilisant des groupes de contrôle.
ceinmart
Alors ce n'est pas utile, n'est-ce pas?
Ken Sharp
Ken Sharp: Cette réponse est la seule reliant directement à ce qui semble (au moins à première vue) comme la meilleure solution au problème. Donc ... à peu près le contraire de ce que vous avez dit.
phils
@phils Vous ne comprenez pas comment cela fonctionne.
Ken Sharp
0

Vous pouvez utiliser mlockall()syscall. mlockall () force le processus mémoire à résider (= pas de swap, pas de surcharge, etc ...). AFAIK, il n'y a pas de commande shell pour le faire, mais il est facile d'en créer une. Cela ressemblerait à:

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

Remarque, vous devez être root pour appeler mlockall().

Cependant, comme je l'ai dit dans une autre réponse, je ne pense pas que ce soit vraiment ce que vous voulez.

Jérôme Pouiller
la source
1
Le code ne fonctionnera pas du tout car execvp est une interface pour exécuter qui annule mlockall. Voir la section Notes sur la page de manuel mlock.
Johannes Matokic