Suspendre / reprendre un process unique vers / depuis le disque

À l'occasion, nous souhaitons suspendre les process gourmands en memory sur nos servers Ubuntu et OS X pour libérer temporairement de la RAM pour d'autres tâches. Si tout ce qui nous préoccupait était l'utilisation du processeur, un simple Ctrl-Z fonctionnerait. Cependant, nous devons pouvoir libérer la RAM (en l'écrivant sur le disque), puis redémarrer le process (disque -> RAM) ou en d'autres termes "hibernate" un seul process. Des indices sur la façon de le faire? (De preference à partir de CLI.) Merci.

Il n'y a pas d'installation générale pour hibernate un seul process, seul le système entier.

Cependant, si vous ne vous souciez pas que l'image du process ne survivra pas à un redémarrage, il est possible d'save l'image du process sur le disque: échange. Assurez-vous d'avoir suffisamment d'espace de swap, et s'il y a une pression de memory et que le process n'est pas actif (par exemple parce qu'il est suspendu), sa memory sera permutée.

Si vous savez que le process est susceptible d'être inactif pendant longtime et que vous aurez besoin d'un time de réponse rapide à un certain moment, vous pouvez forcer beaucoup de RAM à être libéré maintenant en allouant beaucoup de RAM dans un process de courte durée, par exemple

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

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

Le terme que vous searchz est " Application checkpointing ".

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

Les deux outils sont pour Linux uniquement.

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

Assurez-vous que vous avez beaucoup d'espace de swap. Assurez-vous que votre système est configuré pour préférer échanger des pages inactives ( vm.swappiness = 100 ). Ensuite, il devrait suffire de suspendre le process. Le kernel préfèrera échanger les pages inactives.

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

 vm_stat purge vm_stat