Comment arrêter un processus Linux pour une exécution ultérieure en remplaçant sa mémoire


19

Je veux arrêter un long processus afin qu'il ne consomme pas de ressources CPU ou de mémoire physique, avec l'intention de reprendre le même processus à l'avenir.

Je sais que la partie CPU est réalisable en utilisant SIGSTOPet des SIGCONT signaux, mais est-il possible de paginer (échanger dans le cas de pages sales de processus) immédiatement la mémoire RSS privée d'un processus (arrêté)?


1
Quelle est l'intention derrière cela? Voulez-vous vous assurer que le processus reprend plus rapidement? Ou souhaitez-vous empêcher l'écriture de données sensibles sur le disque? Ou autre chose? Si nous connaissons l'intention, nous pourrions être en mesure de donner de meilleures réponses.
oliver

13
Le système d'exploitation le fera automatiquement. Il n'y a vraiment aucune raison de faire quoi que ce soit de spécifique.
David Schwartz

@oliver Je crée un planificateur de lots ( github.com/brutusin/wava ). L'implémentation actuelle offre une planification non préemptive mais je veux passer à une préemptive (être capable d'arrêter l'exécution des travaux) pour éviter gracieusement certaines situations de blocage lorsque tous les travaux en cours d'exécution dépendent des travaux en file d'attente. J'ai besoin exactement du comportement demandé, en continuant les processus arrêtés (sans en créer de nouveaux à partir d'un point de contrôle)
idelvall

1
@DavidSchwartz qui est une affirmation risquée
idelvall

@idelvall Ensuite, il semble que vous ne voulez rien faire de spécial pour la mémoire.
David Schwartz

Réponses:


11

Vous pourriez étudier une technique appelée checkpoint / restore. Cela vous permettra de prendre un processus en cours et d'enregistrer son état dans un ensemble de fichiers, puis de le restaurer ultérieurement.
Pour l'utiliser, commencez par installer le programme criu [ git , wiki ] ( yum install criuou apt install criu).

Pour vérifier un processus en cours, créez un répertoire vide pour contenir ses fichiers et cd dans ce répertoire.

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

Maintenant, vérifiez le processus en cours. Dans ce cas, j'utilise le --shell-job car mon processus s'exécute dans un shell avec un tty associé.

criu dump -t 404 --shell-job

404 est le pid du processus que je veux vérifier. Lorsque je fais cela, je vois que mon processus en cours d'exécution est tué et mon répertoire / var / tmp / checkpoint est rempli avec un ensemble de fichiers nécessaires pour le restaurer.

Pour restaurer le processus, je m'assure que je suis dans le répertoire avec les fichiers de point de contrôle et fais une restauration.

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

Le processus reprendra là où il s'était arrêté dans le terminal où il a été exécuté. Si je tue ce processus en cours et criu restore --shell-jobrecommence, le processus reviendra au point de contrôle et redémarrera.

J'espère que cela t'aides.


4
Cela ne fait pas ce que le PO prétend vouloir faire. Essayez-le - il n'y aura aucune réduction de la mémoire utilisée. Il passera simplement de la mémoire privée du processus au cache disque (en raison de l'écriture de l'ensemble de fichiers). Cela fait juste une étape de sauvegarde supplémentaire et une étape de restauration supplémentaire, et la même mémoire est utilisée (et éjectable) de la même manière. En fait, cela peut aggraver les choses car une partie de la mémoire est dupliquée en raison de la génération de tout ce qui est nouveau à écrire.
David Schwartz

heh, bon point @David, surtout si /tmpc'est tmpfs (soutenu par de l'espace mémoire / swap). Si vous contrôlez un système de fichiers normal sur disque, vous pouvez alors utiliser vmtouch -epour expulser les pages du cache de page, mais il utilise toujours de la RAM supplémentaire temporairement. (À moins d' criuavoir une option pour faire des E / S directes (avec O_DIRECT) ...)
Peter Cordes

1
Il est difficile de savoir si c'est ce que le PO souhaite ou non parce que le PO demande une solution spécifique plutôt que d'expliquer le problème qu'il essaie de résoudre. Cela pourrait être la réponse parfaite ou cela pourrait être inutile pour lui, nous ne pouvons pas le dire.
David Schwartz

Je ne l'ai pas encore examiné en détail mais, il semble que le processus restauré soit un nouveau processus (différent pId), et ce n'est pas exactement ce dont j'ai besoin ...
idelvall

1
@idelvall: C'est ainsi que la plupart des saveurs de checkpoint / restauration fonctionnent. Un cas d'utilisation majeur consiste à enregistrer la progression d'un calcul lors des redémarrages.
Peter Cordes
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.