Sospendi / riprendi singolo processo su / da disco


22

A volte, vorremmo sospendere i processi ad alta intensità di memoria sui nostri server Ubuntu e OS X per liberare temporaneamente un po 'di RAM per altri lavori. Se tutto ciò di cui eravamo preoccupati fosse l'utilizzo della CPU, un semplice Ctrl-Zavrebbe funzionato. Tuttavia, dobbiamo essere in grado di liberare la RAM (scrivendola sul disco) e quindi riavviare il processo (disco -> RAM) o in altre parole "ibernare" un singolo processo. Qualche indizio su come farlo? (Preferibilmente dalla CLI.) Grazie.


7
Suppongo che quando un processo è in uno stato sospeso, la sua memoria utilizzata è un candidato per essere scambiato su disco, se necessario, e questo dovrebbe essere fatto automaticamente dal kernel.
enzotib,

1
@enzotib - Non ho idea se questo accada e, in teoria, suona bene. Tuttavia, ho appena fatto un test approssimativo e in pratica non funziona. Tutti i nuovi processi generati mentre i "mangiatori di RAM" sono sospesi sono estremamente lenti e non rilevo alcuna attività del disco che ci si aspetterebbe se la RAM fosse scambiata su disco.
Mike Covington,

1
@frozenwithjoy Posso confermare che ciò accade. Le uniche ragioni per cui riesco a pensare che un processo sospeso non venga gradualmente sostituito sono se è richiesta memoria non sostituibile (piuttosto rara e (principalmente) riservata per il root) o se la memoria che sta mappando è condivisa con un altro processo attivo .
Gilles 'SO- smetti di essere malvagio' il

1
Un termine che potrebbe essere d'aiuto qui è "checkpoint" (sì, una brutta forma verbale). Questo è generalmente un problema difficile perché il programma potrebbe utilizzare alcune risorse che potrebbero cambiare stato mentre il programma è inattivo. La gestione di quel problema era una delle distinzioni tra Big Iron e i piccoli computer con problemi.
dmckee,

Risposte:


8

Non esiste una struttura generale per il letargo di un singolo processo, solo l'intero sistema.

Tuttavia, se non ti interessa che l'immagine di processo non sopravviva a un riavvio, esiste una funzione integrata per salvare l'immagine di processo su disco: lo scambio. Assicurati di avere abbastanza spazio di scambio e se c'è una pressione della memoria e il processo non è attivo (ad esempio perché è sospeso), la sua memoria verrà sostituita.

Se sai che è probabile che il processo rimanga inattivo per lungo tempo e che a un certo punto avrai bisogno di un tempo di risposta rapido, puoi forzare la liberazione di molta RAM ora allocando molta RAM in un processo di breve durata, ad es

perl -e '$tmp = "a" x 999999999' # allocate about 1GB

Non hai alcun controllo su ciò che viene scambiato, quindi altri processi possono essere scambiati. Su Linux, è possibile scambiare nuovamente un processo accedendo forzatamente alle pagine mappate. Lo script in questa risposta lo farà: carica in memoria tutte le pagine mappate da un processo (nota che questo include file aperti; puoi attraversare regioni selettivamente in base alle informazioni della mappa per evitare lo scambio di dati che sai che non ti serviranno , vedi questa risposta per maggiori informazioni).



5

Assicurati di avere un sacco di spazio di scambio. Assicurati che il tuo sistema sia impostato per preferire lo scambio di pagine inattive ( vm.swappiness = 100 ). Quindi dovrebbe essere sufficiente sospendere il processo. Il kernel preferirà scambiare le pagine inattive.


-1

Su Mac OS X puoi provare a usare il purgecomando (fornito con Xcode) per liberare un po 'di RAM (inattiva).

vm_stat
purge
vm_stat

2
purgenon aiuterebbe qui. Rimuove la cache del disco, ma ciò non causerà lo scambio della memoria di un processo e non renderà più veloce l'ottenimento di RAM da parte di un altro processo.
Gilles 'SO- smetti di essere malvagio'
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.