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.3Mb
de la mémoire résidente du système (je n'ai pas de fichier d'échange), autour 1.8%
de la 1GB
mé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 -v
par 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 100MB
au maximum la mémoire système. J'ai lu la documentation de setrlimit
et 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_AS
paramètre définit la taille de la mémoire virtuelle. Quelle est la vérité?
Réponses:
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 essayerulimit -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.la source
setrlimit
page de manuelIEEE/The Open Group 2003 GETRLIMIT(3P)
Comment se faitps
-il que je puisse afficher le RSS, mais que le noyau ne peut pas imposer de limite?ulimit -d
alors. L'application est écrite par moi et je ne l'ai pas utiliséemmap()
.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.
la source