2010-07-18 4 views
31

Meine Programme haben nicht genügend Arbeitsspeicher wie die Hälfte der Zeit, die ich sie ausführen. Unter Linux kann ich mit ulimit -v mem-in-kbytes eine feste Grenze für den verfügbaren Speicher setzen. Eigentlich benutze ich ulimit -S -v mem-in-kbytes, damit ich ein richtiges Speicherzuweisungsproblem im Programm bekomme und ich abbrechen kann.Wie kann der Speicher eines OS X-Programms begrenzt werden? ulimit -v weder -m funktionieren

Aber ... ulimit funktioniert nicht in OSX 10.6. Ich habe versucht mit -s und -m Optionen, und sie funktionieren nicht.

Im Jahr 2008 gab es eine Diskussion über das gleiche Problem in MacRumors, aber niemand schlug eine gute Alternative vor. Das sollte ein Weg sein, wie ein Programm lernen kann, dass es zu viel Speicher verbraucht oder ein Limit über das Betriebssystem setzt.

+2

Um das hinzuzufügen, scheint es nicht möglich zu sein, es mit 'setrlimit' entweder mit RLIMIT_RSS, RLIMIT_DATA, RLIMIT_AS oder (hier erreichen) RLIMIT_STACK zu arbeiten. –

+0

So wie es steht, wird das Kopfgeld unbeachtet bleiben. –

Antwort

2

setrlimit sollte die Aufgabe erledigen. Ich glaube, das ist der BSD-Äquivalent von ulimit ...

+0

Ich schaute auf die Manpage für 'setrlimit' und konnte nicht sehen, wie man eine Grenze für den virtuellen Speicher setzt, obwohl Sie eine Grenze für den physischen Speicher setzen können. – JWWalker

+0

Ugh, du hast Recht ... – Yuji

+0

Ich weiß Bash ulimit ist direkt Aufruf von Setrlimit implementiert. Auf der Linux man-Seite gibt es die Option RLIMIT_AS, die "die maximale Größe des virtuellen Speichers des Prozesses (Adressraum) in Bytes" begrenzt, was ich kontrollieren möchte. Die Grenze des physischen Gedächtnisses interessiert mich nicht wirklich. Ich möchte wissen, wann das ganze Programm über 2 GB ist. Nun, auf OS X-Manpage für Setrlimit gibt es RLIMIT_AS. Der nächste ist RLIMIT_RSS. In der Tat scheint IMHO OS X eine Menge virtuellen Arbeitsspeicher zuzuordnen, wenn man sieht, was ich im Aktivitätsmonitor sehe. – hectorpal

6

mit diesem selbst Nach dem Kampf (mit mäßigem Erfolg), ich habe bestimmt scheint es zwei Möglichkeiten, es zu tun ...

Sie können Setup einen launchd Artikel für die ausführbare Datei .. der wichtige Teil des plist ist ein Abschnitt, wie ..

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

Es gibt verschiedene Tasten zur Verfügung ..., die auf gefunden werden kann Apple's MAN page.

Ano Ich denke, Ich denke, ist, indem Sie einen Wert entweder /etc/launchd.conf (System) oder /etc/launchd-usr.conf (peruser). Zum Beispiel könnte Ihre launchd.conf enthalten ...

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 

Die Dokumentation für alle Funktionalität launchd der ist shotty, wenn Sie mich fragen .. Es ist, als ob Apple möglicherweise nicht egal/Menschen außerhalb ihrer Mauern tatsächlich wollen verstehe, wie alles funktioniert. There is so much power durch die Beherrschung von Launchd und seinen Feinheiten zu haben ... aber es gibt nur wenige konkrete/offizielle Ressourcen, um sie richtig zu implementieren.

+0

+1 Ich bin gegen launchd, und ich kann nicht loslassen. Wenn es nur konsequent funktioniert, würde ich es immer benutzen. – chiggsy

+0

Beide Verbindung unterbrochen. Ich fand http://launchd.info nützlich. – BB9z

Verwandte Themen