2010-09-05 10 views
9

Ich versuche eine bestimmte Bedingung zu testen, die nur auftritt, wenn perl eine malloc hat, die fehlschlägt, weil kein Speicher mehr vorhanden ist. Ich möchte perl so schnell wie möglich sterben. Ich dachte, die gefastet Weg, um einige große Arrays wieWas ist eine gute Möglichkeit, Perl 5 schnell genug Speicher unter OS X zu verlieren?

perl -le '$_->[100_000_000_000] = 1 for \(@a, @b, @c, @d); <>'

schaffen würde, aber ich hatte es zu töten, nachdem mein Swap-Hit 5 Gig ohne Anzeichen zu stoppen (ich bin auf OS X 10.6).

Getestet habe ich es nur auf Linux und es stirbt ziemlich schnell:

time perl -le '$_->[1_000_000_000] = 1 for \(@a, @b, @c, @d); <>' 
Out of memory! 

real 0m0.023s 
user 0m0.012s 
sys  0m0.008s 

So scheint das Problem OS X und seine dynamic_pager zu sein.

ich deaktivieren gerade versucht, die dynamic_pager mit

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist 

und das Neu starten, aber die Maschine hängt nur vollständig. Mein nächster Versuch wird sein, die com.apple.dynamic_pager.plist Konfigurationsdatei zu ändern, um die VM-Dateien auf eine sehr kleine Partition zu schreiben.

+1

Seltsam, dass Sie nicht "x" x 9e9 ". – tsee

+0

@tsee Es braucht Zeit, um die Zeichenfolge zu erstellen, aber 'perl -e '@a [9e8] = 1'' ist effektiv nur ein' malloc'. –

+0

"Ich musste es töten, nachdem mein Swap 5 Gig erreicht hatte, ohne Anzeichen dafür aufzuhören (ich bin auf OS X 10.6)." - Mac OS X zeigt diese Art von Verhalten oft, einschließlich der Fälle wie 'malloc (-1)'. Versuchen Sie es mit einem anderen Betriebssystem, bei dem Sie die Auslagerung explizit deaktivieren können. (Nie versucht, das auf meinem Mac - aber tun Sie das beiläufig auf dem Linux.) – Dummy00001

Antwort

5

In einer früheren Frage „How to simulate memory allocation errors“, Benutzer freespace vorgeschlagen ulimit mit einem Testbenutzerkonto mit der Menge an Speicher zu begrenzen, die verwendet werden könnten. Dies kann tun, was Sie wollen, ohne große Mengen an Speicher zu reservieren.

+0

Das scheint unter OS X nicht zu funktionieren. Ich habe 'ulimit -m 64; perl -e '$ s = "x" x (1024 * 1024 * 100); <> ''und prüfte die Speichernutzung und das Perl-Programm besaß zweihundert Megabyte. –

+1

IIRC sollte es "ulimit -d" sein, nicht "-m". – Dummy00001

Verwandte Themen