Comment Limiter l'utilisation de la mémoire pour un seul Linux processus et ne pas tuer le processus
Comment Limiter l'utilisation de la mémoire pour un seul Linux processus et ne pas tuer le processus.
Je sais ulimit pouvez limiter l'utilisation de la mémoire, mais si dépassez la limite, va tuer le processus.
Est-il une autre commande ou de la coquille peut limiter l'utilisation de la mémoire et de ne pas tuer le processus?
> but if exceed the limit, will kill the process.
. Ce n'est pas correct. Dans ce cas, la fonction malloc() (en cas d'application C) renvoie NULL et votre processus n'est pas tué. C'est probablement tué à cause de attepts de faire quelque chose avec pointeur NULL. linux.die.net/man/3/malloc -- en cas d'erreur, ces fonctions renvoient la valeur NULL.
Vous devez vous connecter pour publier un commentaire.
Une autre façon d'ailleurs setrlimit, qui peut être défini à l'aide de l'espace utilitaire:
$ ulimit-Sv 500000 # Set ~500 mo
est d'utiliser Linux groupes de contrôle, car elle limite d'un processus (ou un groupe de processus) de l'allocation de la mémoire physique nettement de la mémoire virtuelle. Par exemple:
permettra de créer un groupe de contrôle nommé "myGroup", casquette de la série de processus de s'exécuter sous myGroup jusqu'à 500 MO de mémoire physique et jusqu'à 5000 MO de swap. Pour exécuter un processus sous le contrôle du groupe:
Remarque: Pour ce que je peux comprendre setrlimit limite la mémoire virtuelle, mais avec des cgroups, vous pouvez limiter la mémoire physique.
Je crois que vous avez tort de penser qu'une limite définie avec setrlimit(2) sera toujours tuer le processus.
En effet, si l'espace de pile est dépassée (
RLIMIT_STACK
), le processus serait tué (avecSIGSEGV
).Mais si c'est la mémoire du tas (
RLIMIT_DATA
ouRLIMIT_AS
), mmap(2) serait un échec. Si elle a été appelée à partir de malloc(3) ou des amis, quimalloc
serait un échec.Certains systèmes Linux sont configurés avec de surcharge de mémoire.
C'est un sysadmin question:
echo 0 > /proc/sys/vm/overcommit_memory
La morale de l'histoire est que vous devriez toujours résultats de contrôle de
malloc
, au moins commebien sûr, des applications sophistiquées pourraient poignée "de mémoire" conditions avec plus de sagesse, mais il est difficile d'obtenir le droit.
Certaines personnes à tort que les
malloc
de ne pas échouer (ce qui est faux). Mais c'est leur erreur. Puis ils déréférencer unNULL
pointeur, l'obtention d'unSIGSEGV
qu'ils méritent.Vous pourriez envisager d'attraper
SIGSEGV
avec certains spécifiques au processeur code, voir cette réponse. Sauf si vous êtes un gourou, ne le faites pas.malloc
retourneNULL
n'est guère différente à partir de la plante à partir d'un point de vue utilisateur. Et je crois que la plupart des programmes ne crash pas, juste sortir dès quemalloc
échouer.perror
et c'est une différence que l'utilisateur puisse comprendre. BTW, des applications sophistiquées peuvent traitermalloc
un échec de beaucoup plus sage façon....