Suspendre / reprendre un processus unique vers / depuis le disque

22

À l'occasion, nous souhaitons suspendre les processus gourmands en mémoire sur nos serveurs Ubuntu et OS X pour libérer temporairement de la RAM pour d'autres tâches. Si tout ce qui nous inquiétait était l'utilisation du processeur, un simple Ctrl-Zfonctionnerait. Cependant, nous devons être en mesure de libérer de la RAM (en l'écrivant sur le disque) puis de redémarrer le processus (disque -> RAM) ou en d'autres termes "mettre en veille prolongée" un seul processus. Des indices sur la façon de procéder? (De préférence de CLI.) Merci.

Mike Covington
la source
7
Je suppose que lorsqu'un processus est dans un état suspendu, sa mémoire utilisée peut être échangée sur le disque, si nécessaire, et cela devrait être fait automatiquement à partir du noyau.
enzotib
1
@enzotib - Je ne sais pas si cela se produit et, en théorie, cela sonne bien. Cependant, je viens de faire un test approximatif et dans la pratique, cela ne fonctionne pas. Tout nouveau processus engendré alors que les «mangeurs de RAM» sont suspendus est extrêmement lent et je ne détecte aucune activité de disque qui serait attendue si la RAM était échangée sur le disque.
Mike Covington
1
@frozenwithjoy Je peux confirmer que cela se produit. Les seules raisons pour lesquelles je peux penser qu'un processus suspendu ne serait pas progressivement échangé sont si une mémoire non échangeable est demandée (assez rare et (principalement) réservée à la racine), ou si la mémoire qu'il mappe est partagée avec un autre processus actif .
Gilles 'SO- arrête d'être méchant'
1
Un terme qui pourrait être utile ici est "checkpointing" (oui, une forme verbale laide). Il s'agit généralement d'un problème difficile car le programme peut utiliser certaines ressources qui pourraient changer d'état pendant qu'il est en veille. La gestion de ce problème faisait autrefois la différence entre Big Iron et les petits ordinateurs délicats.
dmckee

Réponses:

8

Il n'y a pas de facilité générale d'hibernation d'un seul processus, uniquement l'ensemble du système.

Cependant, si vous ne vous souciez pas que l'image de processus ne survivra pas à un redémarrage, il existe une fonction intégrée pour enregistrer l'image de processus sur le disque: l'échange. Assurez-vous que vous avez suffisamment d'espace de swap, et s'il y a une pression mémoire et que le processus n'est pas actif (par exemple parce qu'il est suspendu), sa mémoire sera permutée.

Si vous savez que le processus est susceptible d'être inactif pendant longtemps et que vous allez avoir besoin d'un temps de réponse rapide à un moment donné, vous pouvez forcer la libération de beaucoup de RAM maintenant en allouant beaucoup de RAM dans un processus de courte durée, par exemple

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

Vous n'avez aucun contrôle sur ce qui est échangé, d'autres processus peuvent donc être échangé. Sous Linux, vous pouvez échanger un processus en accédant de force aux pages qu'il mappe. Le script de cette réponse fera cela: charger en mémoire toutes les pages mappées par un processus (notez que cela inclut les fichiers ouverts; vous pouvez parcourir les régions de manière sélective en fonction des informations de la carte pour éviter d'échanger des données dont vous savez que vous n'aurez pas besoin , voir cette réponse pour plus d'informations).

Gilles 'SO- arrête d'être méchant'
la source
13

Le terme que vous recherchez est " Application checkpointing ".

Les outils que je connais qui peuvent le faire sont CryoPID et CryoPID2 .

Les deux outils sont uniquement pour Linux.

Je ne connais pas d'outil similaire pour BSD ou OS X.

Ikem
la source
2
Une autre application à utiliser est DMTCP: dmtcp.sourceforge.net
Deer Hunter
5

Assurez-vous d'avoir suffisamment d'espace de swap. Assurez-vous que votre système est configuré pour préférer permuter les pages inactives ( vm.swappiness = 100 ). Il devrait alors suffire de suspendre le processus. Le noyau préférera échanger les pages inactives.

David Schwartz
la source
-1

Sur Mac OS X, vous pouvez essayer d'utiliser la purgecommande (fournie avec Xcode) pour libérer de la RAM (inactive).

vm_stat
purge
vm_stat
jefz
la source
2
purgen'aiderait pas ici. Il supprime le cache disque, mais cela n'entraînera pas l'échange de la mémoire d'un processus, et il ne sera pas plus rapide pour un autre processus d'obtenir de la RAM.
Gilles 'SO- arrête d'être méchant'