Come impedire lo scambio di un programma specifico?


23

È possibile impedire a un programma specifico (ovvero rhythmbox e le sue dipendenze) di scambiarsi mai su disco?

Lo sto chiedendo perché ho un problema quando un lettore musicale singhiozza ogni volta che Chromium ha troppa memoria. C'è un modo per aggirare questo? Questo non è più un problema in Windows, quindi presumibilmente c'è un modo.


Tomboy ha lo stesso problema. È uno dei motivi per cui alcune persone sono passate a GNote .
Cristian Ciupitu,

1
Penso che il problema del singhiozzo non sia necessariamente causato dallo scambio. Se il programma sta giocando qualcosa, Linux dovrebbe notare questo e non scambiarlo. I programmi che non fanno molto sono i primi che vengono scambiati. Hai eseguito pso topper vedere se rhytmbox è realmente scambiato controllando il campo RSS/ RES? Penso che il tuo problema sia principalmente causato da una pianificazione impropria. Dovresti provare a reniceeseguire il processo rhytmbox o modificare alcune delle sue impostazioni, ad esempio la dimensione del buffer audio.
Cristian Ciupitu,

1
Grazie! C'è un modo per impostare il valore iniziale di un programma? / etc / nicetab o qualcosa del genere? :)
Alexei Averchenko,

Risposte:


10

Penso che il problema del singhiozzo non sia necessariamente causato dallo scambio. Se un programma sta giocando qualcosa, Linux dovrebbe notare questo e non scambiarlo. I programmi che non fanno molto sono i primi che vengono scambiati. Puoi verificare se il programma viene realmente scambiato guardando il campo RSS/ RESda ps o dall'alto . RSSè la dimensione del set di residenti, la memoria fisica non scambiata utilizzata da un'attività (in kiloByte).

Penso che il tuo problema sia probabilmente causato da una programmazione impropria di CPU e I / O e da un po 'di inefficienza di Rhythmbox che lo rende sensibile agli elevati carichi di sistema. La priorità della CPU può essere modificata con i comandi nice e renice . La priorità I / O può essere modificata con il comando ionice . Solo il superutente può utilizzare le priorità elevate. Dovresti anche sapere che i ragazzi del kernel Linux stanno cercando di migliorare la reattività dei sistemi desktop con varie patch a bassa latenza, quindi potresti prendere in considerazione di usarli. Uno di questi è una patch di circa 200 righe scritta da Mike Galbraith che ha impressionato anche Linus. L'alternativa a questa patch è il trucco dei cgroups di Lennart Poettering che penso sarà il default in Fedora 15.

Comunque, senza quelle patch ci sono due opzioni: avviare il programma con una priorità alta o cambiarlo in seguito. Per la prima opzione potresti usare uno script wrapper attorno a 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

Dovrai eseguirlo come root. Se non vuoi accedere come root solo per iniziare, puoi usare suo sudo.

Per quanto riguarda la modifica della priorità in seguito, se sei troppo pigro per accedere come root per cambiarla, potresti provare a utilizzare un processo cron che viene eseguito ogni 5 minuti e imposta la priorità del rhythmboxprocesso, ma non consiglierei di farlo:

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

5

Risposta breve: non puoi e non dovresti.

Molto tempo fa i file eseguibili onoravano il bit appiccicoso +tche avrebbe detto al kernel di non scambiarsi, ma oggi viene ignorato.

Se il kernel decide che deve scambiarsi, ha sicuramente un motivo valido. Linux è molto aggressivo sull'uso della memoria, poiché la RAM inattiva è una risorsa sprecata.

Se davvero non vuoi scambiare, ottenere più RAM o semplicemente # swapoff -a(non consigliato, puoi rendere il tuo sistema inutilizzabile se hai già problemi).

Shouldn'tva quando stai sviluppando qualche app e non vuoi che cambi. Dai un'occhiata a questo post su StackOverflow .


2
Non credo che riservare circa 100 MiB ucciderà il mio sistema. Forse c'è un altro modo per risolvere il mio problema particolare (vedi domanda modificata)?
Alexei Averchenko,

1
Se hai intenzione di mantenere un processo ad un alto livello di reattività rispetto ad altri processi, la risposta è buona (devi essere root per farlo). Non è facile scherzare con il paging della memoria se non si desidera sporcarsi le mani (toccare il codice, ricompilare o persino LD_PRELOADing una libreria personalizzata per ingannare il processo e modificare la funzione utilizzata per allocare la memoria - di nuovo, non raccomandato) . Consigli ? rinominare il processo, ottenere più RAM o interrompere l'apertura delle schede;)
Torian

5
"Se il kernel decide che deve scambiare, ha sicuramente un motivo valido" non è vero. Oggi avevo una memoria libera di 1,3G. Il kernel Linux ha inserito i miei processi httpd nello scambio (370M).
bluszcz,

@bluszcz (beh, altri leggendo questo dato quanti anni ha quel commento): Questo potrebbe essere perché ha deciso che la cache del disco per i file serviti dal tuo httpd è più importante delle parti usate raramente del tuo stesso httpd - vedi le altre risposte menzionando "swappiness".
Jan Schejbal,

@JanSchejbal è perché Linux, almeno senza che qualcuno lo dica, non sa quali processi siano importanti o meno. In un ambiente server, dovresti essere in grado di dire al sistema quali processi sono importanti e quali no. "Non mi interessa altro, ma questi processi sono i più importanti per il funzionamento di questo server"
Rahly,


3

Esistono diversi modi per farlo. Puoi provare a provare "dice" che Linux lavora meno con lo scambio (in genere):

echo 10 > /proc/sys/vm/swappiness

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

swappiness

Questo controllo è usato per definire quanto aggressivo il kernel cambierà le pagine di memoria. Valori più alti aumentano la aggressività, valori più bassi diminuiscono la quantità di swap.

Il valore predefinito è 60.

Un'altra opzione è utilizzare il gestore del kernel cgroups, questo è specifico per processo ma avrai un po 'di "lavoro" da fare: risposta qui: /unix/10214/per-process-swapiness-for -linux # 10227


1
ciò influenza la swappiness a livello globale, non specifica del processo.
Lorenzo Von Matterhorn,

1
sì, puoi notare che su "(generalmente)" ho scritto. L'opzione da eseguire per processo è il collegamento ad altre risposte, usando i cgroups.
Ceinmart,

Quindi non è d'aiuto, vero?
Ken Sharp,

Ken Sharp: Questa risposta è l'unica che collega direttamente a ciò che sembra (almeno a prima vista) come la migliore soluzione al problema. Quindi ... praticamente l'opposto di quello che hai detto.
phils,

@phils Non capisci come funziona.
Ken Sharp

0

Puoi usare mlockall()syscall. mlockall () forza il processo di memoria ad essere residente (= no swap, no overcommit, ecc ...). AFAIK, non esiste un comando shell per farlo, ma è facile crearne uno. Sembrerebbe che:

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

Nota, devi essere root per chiamare mlockall().

Tuttavia, come detto in altre risposte, non penso che sia davvero quello che vuoi.


1
Il codice non funzionerà affatto poiché execvp è un frontend da eseguire che annulla mlockall. Vedi la sezione Note sulla pagina man di mlock.
Johannes Matokic,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.