2017-06-02 1 views
1

Ich habe eine C++ - Anwendung, die eine große Anzahl von Threads erstellt. Mit ulimit -v unlimited stürzt die Anwendung nach dem Erstellen von 1080-Threads mit segfault ab. Absturz passiert, wenn ich versuche, auf Speicher zuzugreifen, der mit "neu" belegt ist. "neu" gibt einen Nicht-Null-Zeiger zurück, aber der Zugriff darauf löst segfault aus. Mit ulimit -v 500000 stürzt die Anwendung nicht ab, sondern begrenzt die maximale Anzahl der Threads (pthread_create schlägt fehl - viel besseres Verhalten). Nach oben stürzt die Anwendung ab (ulimit -v unlimited), wenn der Gesamtspeicher die Größe des physischen RAM erreicht. Ich brauche ~ 1500 Threads (ich kenne die Nachteile ...) Threads sind sehr klein, je nach Valgrind verwendet jeder Thread ~ 16kb des Stapels, so weiß ich nicht, warum so viel Speicher von Anwendung belegt ist. Was kann ich ändern/überprüfen, um den Thread pro Thread zu verringern? ulimit -s 1024 hilft nicht.Verringern pro Thread-Speicher in Linux

+0

Sie können 'valgrind' mit' massif'-Tool verwenden, um zu prüfen, welcher Speicher verwendet wird. Auch 1080 Threads zu haben, erscheint eher sinnlos. – VTT

+0

Ich habe Valgrind für eine Weile nicht verwendet, aber bedenken Sie, dass die von einem Stack verwendete Speichermenge nicht notwendigerweise dieselbe ist wie die Menge an Speicher, die für den Stack _reserved_ ist. –

Antwort

3

Das Problem mit new Rückgabe eines Nicht-Null-Pointer aber Absturz beim Zugriff auf diesen Speicher ist Linux-Speicher überkompensieren "Feature". man malloc:

Standardmäßig folgt Linux einer optimistischen Speicherzuweisungsstrategie. Das bedeutet, wenn malloc() nicht-NULL zurückgibt, gibt es keine Garantie, dass der Speicher wirklich verfügbar ist. Falls sich herausstellt, dass das System nicht genügend Arbeitsspeicher hat, werden ein oder mehrere Prozesse vom OOM-Killer beendet. Weitere Informationen finden Sie in der Beschreibung von /proc/sys/vm/overcommit_memory und /proc/sys/vm/oom_adj in proc(5) und der Linux-Kernel-Quelldatei Documentation/vm/overcommit-accounting.


man pthread_create:

Auf Linux/x86-32- ist die Standardstapelgröße für einen neuen Thread 2 Megabyte. Wenn unter der Implementierung des NPTL-Threads der Wert RLIMIT_STACK Soft-Ressourcenlimit zum Zeitpunkt des Programmstarts einen anderen Wert als "unlimited" hat, bestimmt er die Standardstapelgröße neuer Threads. Unter Verwendung von pthread_attr_setstacksize(3) kann das Attribut stack size im Argument attr, das zum Erstellen eines Threads verwendet wird, explizit festgelegt werden, um eine andere Stackgröße als die Standardgröße zu erhalten.

Verwandte Themen