Comment limiter l'utilisation de la mémoire des applications?

10

J'ai passé 2 heures à lire des questions à ce sujet, et il y a toujours un malentendu.

J'ai ce processus:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND    
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server

Cela montre qu'il utilise 19.3Mbde la mémoire résidente du système (je n'ai pas de fichier d'échange), autour 1.8%de la 1GBmémoire système entière . La taille virtuelle est 1.39GB?!?. J'ai lu que ulimit -mça ne marche pas. Les gens utilisent ulimit -vpar exemple la configuration de la mémoire virtuelle pour le processus. Cette mémoire virtuelle est-elle celle avec laquelle VSZ est répertorié ps? Quelle valeur dois-je définir si je souhaite restreindre ce processus pour utiliser 100MBau maximum la mémoire système. J'ai lu la documentation de setrlimitet cela semble légitime:

RLIMIT_AS
        This  is  the maximum size of a process' total available memory, 
        in bytes. If this limit is exceeded, the malloc() and mmap() 
        functions shall fail with errno set to [ENOMEM]. In addition, 
        the automatic stack growth fails with the effects outlined above.

Mais sur d'autres versions de la documentation, ce RLIMIT_ASparamètre définit la taille de la mémoire virtuelle. Quelle est la vérité?

Dragomir Ivanov
la source
S'il vous plaît, faites attention au formatage des messages.
rozcietrzewiacz

Réponses:

6

Oui, VSZ est une mémoire virtuelle. Quant à RLIMIT_AS, où avez-vous trouvé le paragraphe cité ci-dessus? Étant donné que setrlimit (2) est un appel système Linux, je ne vois pas comment il pourrait éventuellement surveiller malloc (3), une fonction de bibliothèque. Au lieu de cela, il ne peut fonctionner qu'avec brk (2), sbrk (2) et mmap (2) - c'est aussi ce que suggère sa page de manuel (vérifiée sur Scientific Linux). Cependant, la quantité totale de mémoire demandée via ces fonctions est de la mémoire virtuelle, donc RLIMIT_AS limite en effet la mémoire virtuelle. (Ceci est, encore une fois, conforme à la page de manuel setrlimit (2).)

Malheureusement, vous ne pouvez pas limiter RSS sous Linux (ce serait le cas ulimit -m). Vous pouvez essayer ulimit -d(RLIMIT_DATA), mais cela ignorera mmap (2), généralement utilisé pour les allocations importantes. Une autre possibilité serait de limiter la mémoire virtuelle, mais avec une si grande différence entre RSS et VSZ, cela pourrait être difficile.

Ansgar Esztermann
la source
Merci pour votre réponse. Le paragraphe est tiré de la setrlimitpage de manuel IEEE/The Open Group 2003 GETRLIMIT(3P)Comment se fait ps-il que je puisse afficher le RSS, mais que le noyau ne peut pas imposer de limite?
Dragomir Ivanov
6
Selon Alan Cox, cela a des raisons historiques: le calcul du RSS était autrefois coûteux, donc l'application de la limite imposerait une charge importante au noyau; source: linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html . Voir aussi stackoverflow.com/questions/3043709/…
Ansgar Esztermann
Je vois. Je suppose que j'irais avec ulimit -dalors. L'application est écrite par moi et je ne l'ai pas utilisée mmap().
Dragomir Ivanov
2
Non, ce n'est généralement pas le cas (ni sbrk ()), mais malloc () le pourrait.
Ansgar Esztermann
Je vois. C'est très malheureux. La solution à cette question est donc soit des groupes de contrôle, soit un sondage sur l'utilisation de la mémoire avec un langage de script.
Dragomir Ivanov
3

De nombreux processus partagent une partie de sa mémoire avec d'autres processus, par exemple la libc est utilisée par presque tous les processus mais n'est mappée en mémoire qu'une seule fois, mais elle compte pour l'utilisation de la mémoire virtuelle de chaque processus. La limitation de l'utilisation de la mémoire qui n'est utilisée que par un certain processus (principalement RSS) peut être effectuée à l'aide de cgroups. Voir les réponses à Comment limiter les ressources totales (mémoire) d'un processus et ses enfants pour savoir comment le faire. Cela limitera la mémoire totale d'un processus et de ses enfants.

JanKanis
la source