37 votes

Comment limiter la mémoire d'un programme OS X ? ulimit -v et -m ne fonctionnent pas.

Mes programmes manquent de mémoire la moitié du temps où je les exécute. Sous Linux, je peux fixer une limite stricte à la mémoire disponible en utilisant ulimit -v mem-in-kbytes. En fait, j'utilise ulimit -S -v mem-in-kbytes, de sorte que j'obtienne un problème d'allocation de mémoire dans le programme et que je puisse abandonner.

Mais... ulimit ne fonctionne pas sous OSX 10.6. J'ai essayé avec les options -s et -m, et elles ne fonctionnent pas.

En 2008, la même question a fait l'objet d'une discussion au sein de la Commission européenne. MacRumors mais personne n'a proposé de bonne alternative. Il devrait y avoir un moyen pour un programme d'apprendre qu'il dépense trop de mémoire, ou de fixer une limite par le biais du système d'exploitation.

2 votes

De plus, je n'arrive pas à le faire fonctionner avec setrlimit soit, avec l'un de RLIMIT_RSS, RLIMIT_DATA, RLIMIT_AS ou (atteignant ici) RLIMIT_STACK.

0 votes

En l'état, la prime ne sera pas attribuée.

7voto

alastair Points 3040

Vous ne pouvez pas. Apple le peut (en utilisant le ledger() appel système, qui est privé), mais vous ne pouvez pas. Je ne suis pas tout à fait sûr que les options de launchd fonctionnent ou non - certainement s'il utilisait encore le code visible dans la dernière version open source (à partir de 10.9.5), il ne le ferait pas, car il appelle setrlimit() mais il a été substantiellement réécrit depuis, même si je ne vois pas qu'il s'agit d'un appel. ledger() ce à quoi je m'attendais si c'était censé fonctionner.

Pourquoi ? Parce que le RLIMIT_DATA y RLIMIT_AS options pour setrlimit() n'ont pas vraiment faire rien dans les versions actuelles de XNU (le noyau de macOS).

6voto

alex gray Points 5089

Après avoir lutté moi-même avec ce problème (avec un succès limité), j'ai déterminé qu'il semble y avoir deux façons de procéder...

Vous pouvez configurer un élément launchd pour votre exécutable La partie importante de la plist est une section, comme

<key>SoftResourceLimits</key>
<dict>
    <key>Stack</key>
    <integer>10000000000</integer>
</dict>

Il y a plusieurs clés disponibles... qui peuvent être trouvées sur Page MAN d'Apple .

Une autre façon de le faire, Je pense c'est en définissant une valeur dans l'un ou l'autre des éléments suivants /etc/launchd.conf (système) ou /etc/launchd-usr.conf (peruser). Par exemple, votre launchd.conf pourrait contenir...

umask 002
limit stack 67104768 67104768
limit maxproc 3400 4500
limit maxfiles 256 unlimited
setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

La documentation pour toutes les fonctionnalités de launchd est minable, si vous voulez mon avis C'est comme si Apple ne se souciait pas / ne voulait pas que les gens en dehors de leurs murs comprennent réellement comment tout cela fonctionne. Il y a tellement de pouvoir Il y a beaucoup d'avantages à maîtriser launchd et ses subtilités... mais il y a peu de ressources concrètes/officielles disponibles sur la façon de les mettre en œuvre correctement.

0 votes

+1 Je suis face à launchd, et je ne peux pas le lâcher. S'il fonctionnait de manière cohérente, je l'utiliserais tout le temps.

1voto

Yuji Points 26887

setrlimit devrait faire l'affaire. Je crois que c'est l'équivalent BSD de ulimit ...

0 votes

J'ai regardé la page de manuel de setrlimit Je n'ai pas vu comment fixer une limite à la mémoire virtuelle, alors qu'il est possible de fixer une limite à la mémoire physique.

0 votes

Je sais que bash ulimit est implémenté directement en appelant setrlimit. Dans la page de manuel de Linux, il y a l'option RLIMIT_AS, qui limite "la taille maximale de la mémoire virtuelle du processus (espace d'adressage) en octets", c'est ce que je veux contrôler. Je ne me soucie pas vraiment de la limite de la mémoire physique. Je veux savoir quand l'ensemble du programme dépasse 2 Go. Eh bien, sur la page de manuel OS X pour setrlimit, il y a RLIMIT_AS. Le plus proche est RLIMIT_RSS. En effet, IMHO OS X semble allouer beaucoup de mémoire virtuelle, compte tenu de ce que je vois dans le moniteur d'activité.

0 votes

Mmm... Demandes de SUSv3 RLIMIT_AS (voir opengroup.org/onlinepubs/009695399/functions/getrlimit.html ) et OS X se vend comme un UNIX SUSv3, donc il devrait supporter RLIMIT_AS . En effet, <sys/resource.h> définit RLIMIT_AS bien qu'il ne soit pas mentionné dans la page de manuel. Pourriez-vous essayer RLIMIT_AS pour voir si elle est vraiment mise en œuvre ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X