Wie kann ich diagnostizieren, dass mein Python-Programm aufgrund eines Speichermangels abgebrochen wird?

Ich habe ein neuronales Netzwerk aufgebaut, das große Datenmengen (40 G) analysiert, und mein iMac beendet den Prozess, nachdem er etwa einen Tag lang ausgeführt wurde.

In der Vergangenheit habe ich unter Linux eine große Auslagerungsdatei erstellt, um Speicherbeschränkungen zu umgehen.

Ich verstehe:

$ python processor.py
[...maybe some std out messages, specific to what I'm doing...]
Killed.

Ich kenne dies als die Nachricht "Sie haben zu viel Speicher aufgebraucht, auf Wiedersehen". Auch hier konnte ich es mit einer großen Auslagerungsdatei unter Linux lösen. Wie kann ich das Swap-Limit auf meinem Mac erhöhen, damit meine Prozesse, die viel Speicher verbrauchen, nicht beendet werden?

Ich bin mir nicht sicher, wie ich mehr Informationen darüber bekommen könnte, warum es getötet wurde.

Könnten Sie genau die Systemmeldungen bearbeiten, die protokolliert werden, wenn der Prozess beendet wird? Wie ist der Speicherstatus zu diesem Zeitpunkt (vielleicht 5 Minuten vor und 5 Minuten nach der Beendigung?) Ich vermute, Sie haben ein anderes Problem, da Swap den gesamten Speicherplatz auf dem Boot-Volume einnehmen kann und wird, aber normalerweise ist es das Programm Fehler, dass so viel RAM ausgelagert und nie wieder eingebaut wurde.
Oben einige Änderungen hinzugefügt.
Schöne Bearbeitungen. Da Sie es von einer Shell aus ausführen, ziehen Sie auch einen Blick auf ulimit -aIch habe keinen Testfall, in dem ich das System auf 10.10.x zum Ersticken bringen kann. Beobachten Sie auch den Speicherdruck

Antworten (2)

Hier sind einige Möglichkeiten, um nach Problemen zu suchen, aber ich fürchte, sie sind möglicherweise keine vollständige oder sogar die richtige Lösung, ohne mehr zu spähen oder zu stochern:

In einer anderen Shell, nachdem Sie Ihren Python-Prozess gestartet haben (oder wenn Sie screen/ tmuxes):

  1. df /
  2. top -l 1 -S | head -12
  3. vm_statUndvm_stat 600
  4. sudo du -sm /var/vm/*

Sobald Sie eine gute Basislinie haben, können Sie die Dinge im Laufe der Zeit beobachten, um zu sehen, wie sich das neuronale Netz stündlich für eine Weile verhält. Wenn Sie der Meinung sind, dass es ums Stoppen geht, können Sie ausführen sysdiagnose python(oder die Prozessnummer verwenden, wenn mehr als ein Python-Prozess ausgeführt wird). Wenn Sie nicht den Tag warten möchten, bis sich die Dinge ansammeln, können Sie memory_pressuredem System vor oder nach dem Start des neuronalen Netzes in Python zufügen. In dieser Antwort erfahren Sie, wie Sie den Aktivitätsmonitor überwachen, wenn Sie diesen Prozess ausführen:

Super, danke dafür. Ich werde damit herumspielen und sehen, was ich finde.
Ich bin mir ziemlich sicher, dass du meinst, df /wo du geschrieben hastdf \
@PascalCuoq Du hast Recht. Fühlen Sie sich frei, in Zukunft Beiträge zu bearbeiten, in denen dies der Fall ist :-) Manchmal ist das System jedoch bei kleinen Änderungen launisch.
@bmike Ja, auf SE-Sites, auf denen man erst mit 100 Reputation beginnt, muss man mindestens 6 Zeichen finden, die geändert werden müssen, damit die Änderung als signifikant angesehen und zur Überprüfung freigegeben wird. Ich habe es getan, aber es kann haarsträubend sein: crypto.stackexchange.com/posts/18651/revisions

Es ist SIGKILLEd. Es ist schwer zu sagen, seit wann Sie OOM auf macOS habentail -f /var/log/system.log

 Jan 14 10:46:39 ... com.apple.xpc.launchd[1] (com.apple.mdworker.shared.10000000-0000-0000-0000-000000000000[41845]):           Service exited due to SIGKILL | sent by mds[72]

Die Fehlermeldung hilft nicht.

Dann habe ich versucht, Instrumentmit macOS ausgeliefert,

Geben Sie hier die Bildbeschreibung ein

Und fügen Sie Instrument zu Ihrem Python-Prozess hinzu. Sie können sehen, dass die Erinnerung unbegrenzt ist, bis sie getötet wird.

Geben Sie hier die Bildbeschreibung ein