Come fermare un processo Linux per successive esecuzioni sostituendo la sua memoria


19

Voglio interrompere un processo di lunga durata in modo da non consumare alcuna CPU o risorse di memoria fisica, con l'intenzione di riprendere lo stesso processo in futuro.

So che la parte della CPU è realizzabile utilizzando SIGSTOPe SIGCONT segnali ma è possibile effettuare il page-out (swap-out nel caso di pagine sporche di processo) immediatamente la memoria RSS privata di un processo (arrestato)?


1
Qual è l'intenzione dietro questo? Vuoi assicurarti che il processo riprenda più rapidamente? O vuoi impedire che dati sensibili vengano scritti su disco? O qualcos'altro? Se conosciamo l'intenzione, potremmo essere in grado di dare risposte migliori.
Oliver,

13
Il sistema operativo lo farà automaticamente. Non c'è davvero alcun motivo per fare qualcosa di specifico.
David Schwartz,

@oliver Sto creando un programmatore batch ( github.com/brutusin/wava ). L'implementazione corrente offre una pianificazione non preventiva, ma voglio passare a una preventiva (essere in grado di interrompere l'esecuzione dei lavori) per evitare alcune situazioni di deadlock quando tutti i lavori in esecuzione dipendono dai lavori in coda. Ho bisogno esattamente del comportamento richiesto, continuando i processi arrestati (non crearne di nuovi da un checkpoint)
idelvall

1
@DavidSchwartz è un'affermazione rischiosa
idelvall

@idelvall Quindi sembra che tu non voglia fare nulla di speciale alla memoria.
David Schwartz,

Risposte:


11

Potresti esaminare una tecnica chiamata checkpoint / restore. Ciò ti consentirà di eseguire un processo in esecuzione e di salvarne lo stato in un set di file, quindi ripristinarlo in un secondo momento.
Per usarlo, inizia installando il programma criu [ git , wiki ] ( yum install criuo apt install criu).

Per controllare un processo in esecuzione, creare una directory vuota per contenere i suoi file e cd in quella directory.

mkdir /var/tmp/checkpoint
cd /var/tmp/checkpoint

Ora controlla il processo in corso. In questo caso sto usando il lavoro --shell poiché ho il mio processo in esecuzione in una shell con un tty associato.

criu dump -t 404 --shell-job

404 è il pid del processo che voglio controllare. Quando lo faccio, vedo che il mio processo in esecuzione viene ucciso e la mia directory / var / tmp / checkpoint viene popolata con un set di file necessari per ripristinarlo.

Per ripristinare il processo, mi assicuro di essere nella directory con i file del checkpoint e di eseguire un ripristino.

cd /var/tmp/checkpoint
criu restore --shell-job

Il processo riprenderà da dove era stato interrotto nel terminale in cui è stato eseguito. Se interrompo questo processo ed eseguo di criu restore --shell-jobnuovo, il processo tornerà al punto di controllo e si riavvierà.

Spero che sia di aiuto.


4
Ciò non fa ciò che l'OP afferma di voler fare. Provalo - non ci sarà alcuna riduzione nella memoria utilizzata. Passerà semplicemente dalla memoria privata del processo alla cache del disco (a causa della scrittura del set di file). Fa solo un ulteriore passaggio di salvataggio e un ulteriore passaggio di ripristino e la stessa memoria viene utilizzata (ed espulsa) allo stesso modo. In effetti, potrebbe peggiorare le cose poiché parte della memoria viene duplicata a causa della generazione di tutto ciò che è nuovo da scrivere.
David Schwartz,

eh, buon punto @ David, specialmente se /tmpè tmpfs (supportato da memoria / spazio di swap). Se vmtouch -eesegui il checkpoint a un normale filesystem con backup su disco, puoi quindi utilizzare per eliminare le pagine dalla pagecache, ma utilizza comunque temporaneamente RAM aggiuntiva. (A meno che non criuabbia un'opzione per eseguire l'I / O diretto (con O_DIRECT) ...)
Peter Cordes,

1
È difficile sapere se questo è ciò che l'OP vuole o meno perché l'OP richiede una soluzione specifica piuttosto che spiegare quale problema sta cercando di risolvere. Questa potrebbe essere la risposta perfetta o potrebbe essere inutile per lui, non possiamo dirlo.
David Schwartz,

Non l'ho ancora esaminato in dettaglio ma, sembra che il processo ripristinato sia un nuovo processo (diverso pId), e questo non è esattamente quello di cui ho bisogno ...
idelvall

1
@idelvall: è così che funziona la maggior parte dei punti di controllo / ripristino. Un caso di utilizzo importante è salvare i progressi in un calcolo tra i riavvii.
Peter Cordes,
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.