Unix-Sortierung nicht genügend Speicher

7

Ich sortiere eine 25-GB-Datei mit 200 Millionen Zeilen auf Fedora 18 mit:

sortiere -S 10G -T / bigdisk bigfile

und ich bekomme Prozess wegen fehlender Erinnerung getötet. Der Prozess maximiert meinen Arbeitsspeicher nicht vor dem Tod (12 GB frei) und der Speicherplatz ist in Ordnung.

Anregungen zur Ursache erwünscht. Ich bin sicher, dass sort dies aufgrund seiner Partitionierung und Zusammenführung verwalten kann.

Weitere Infos von dmesg

[87278.935572] Out of memory: Kill process 1971 (sort) score 258 or sacrifice child
[87278.935574] Killed process 1971 (sort) total-vm:4512168kB, anon-rss:4237040kB, file-rss:584kB 
Aiden Bell
quelle
Hat das System RAM-Beschränkungen pro Prozess oder pro Benutzer? (überprüfen Sie mit Limit oder ulimit)
Hennes
Nein, Firefox und Eclipse schaffen es, alles zu essen :)
Aiden Bell
Wird es wirklich getötet? Sie können sich kurz vor dem Absturz mit strace verbinden und einen Blick darauf werfen, was wirklich passiert.
Hauke ​​Laging
1
Sind alle Zeilen gleich lang? Dann würde ich eine Sortierung vorschlagen, dh die Datei mmap und schnell sortieren.
ott--
1
Ich hatte das gleiche Problem, als ich /run/shmmeine /bigdiskzum Speichern von temporären Dateien verwendete. Es scheint, dass der Kernel die RAM-Disk /run/shmals wichtiger erachtet. Als also sort darauf geschrieben wurde und der Speicher knapp wurde, hat der Kernel sort getötet. Die Verwendung einer trägen VM-Festplatte löste das Problem.
Drevicko

Antworten:

3

Nicht benutzen -S 10G, es ist viel zu viel (und wahrscheinlich nicht das tun, was du denkst). Das Starten von OOMkiller bedeutet, dass Ihr System den gesamten Speicher belegt.

Gemäß dem verwendeten Algorithmus durch sort, wird es Speicher nach verwenden , was verfügbar ist : die Hälfte der größten Zahl zwischen TotalMem / 8 und AvailableMem.

Wenn Sie beispielsweise über 4 GB verfügbaren Speicher (von 8 GB) verfügen, sortwerden 2 GB RAM verwendet. Es sollte auch viele 2-GB-Dateien in / bigdisk erstellen und schließlich zusammenführen und sortieren.

Totor
quelle
2
Um fair zu sein, wird die Sortierung beendet, wenn ich -S verwende oder nicht. Sowohl top als auch / proc / meminfo berichten, dass ich beim Tod freien Speicher habe. Die Maschine verfügt über 16 GB RAM und nur 3 werden tatsächlich verwendet, wenn der Sortiervorgang gestartet wird. Manuelles Verwenden von Split, Sortieren der Teile und Sortieren - m funktionierte ohne Speicherprobleme.
Aiden Bell
@AidenBell Ich habe gerade an etwas gedacht: Verwenden Sie eine 32-Bit-Version von sort? Überprüfen Sie mit file $(which sort).
Totor
Nee. 64-Bit. Ich fange an zu denken, dass es irgendwo ein wirklicher Keuchfehler sein könnte .
Aiden Bell
1

Eine Antwort aus meinem Kommentar machen:

Ich hatte das gleiche Problem , wenn ich verwende /run/shmals meine /bigdiskzum Speichern von sorttemporären Dateien. /run/shmist eine RAM-Festplatte. Wenn also eine Sortierung erforderlich ist, um Teilergebnisse auf der Festplatte zwischenzuspeichern (was der Fall ist, wenn der Speicher fast voll ist), ist der Speicher erschöpft. Der Kernel wurde getötet sort, da der Prozess den meisten Speicher beanspruchte.

Die Verwendung eines Speicherorts auf einer physischen Festplatte anstelle der RAM-Festplatte löste das Problem.

drevicko
quelle
-1

Versuchen Sie Folgendes einzustellen vm.overcommit_memory = 1: «…

Wenn dieses Flag 1 ist, gibt der Kernel vor, dass immer genügend Speicher vorhanden ist, bis er tatsächlich leer ist.

… »

Und tun Verwendung Swap.

poige
quelle
1
Der OOM-Killer wird nur ausgelöst, wenn "ihm tatsächlich der Speicher ausgeht". Diese Einstellungen lösen also nichts. Es könnte sein, dass die Out of Mem- Nachricht vom Kernel sortund nicht vom Kernel stammt.
Totor
RTFM: „… Der OOM-Killer kann mit dem folgenden Befehl vollständig deaktiviert werden. Dies wird für Produktionsumgebungen nicht empfohlen, da bei Auftreten eines Speichermangels je nach verfügbaren Systemressourcen und Konfiguration unerwartetes Verhalten auftreten kann. … Alles von einer Kernel-Panik bis zu einem Hang, abhängig von den Ressourcen, die dem Kernel zum Zeitpunkt der OOM-Bedingung zur Verfügung stehen. sysctl vm.overcommit_memory = 2 echo "vm.overcommit_memory = 2" >> /etc/sysctl.conf… "- oracle.com/technetwork/articles/servers-storage-dev/…
poige
Ich sehe die Relevanz Ihres Kommentars nicht. Das Deaktivieren von OOM-Killer löst das Problem nicht : sortVerwendet / benötigt zu viel Speicher. Mit overcommit_memory=2, sortwird es einfach nicht schaffen malloc()und wird dann höchstwahrscheinlich nicht sortieren.
Totor
Meine Antwort war nicht = 2. Es wurde zitiert, dass die Einstellungen dieser Option in direktem Zusammenhang mit dem OOM-Töten stehen. Wenn Sie das Thema besser kennenlernen möchten, ist das (hoffentlich) für Ihren Zweck geeignet
poige