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
Antwort
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
inproc(5)
und der Linux-Kernel-QuelldateiDocumentation/vm/overcommit-accounting
.
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 vonpthread_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.
- 1. pro-Task-Datenstruktur in Linux-Kernel-Modul
- 2. Wie implementiert ein C++ - Compiler lokalen Threadspeicher in C++ 0x?
- 3. Warnung: 2 verringern/verringern Konflikte [-Wconflicts-rr] in yacc Grammatik
- 4. Versionsnummer verringern
- 5. Wie verringern Python3.5.1 zu Python3.4?
- 6. Warum würde shl_load() für Bibliotheken mit lokalem Threadspeicher fehlschlagen?
- 7. Artikelmenge verringern in MySQL Warenkorb
- 8. Anfrage Anzahl pro Sekunde in einem Linux-Port
- 9. Verringern der Gesamtberechnungszeit
- 10. Verringern CSS-Klassen Websites?
- 11. SeekBar langsam erhöhen/verringern
- 12. MySQL verringern manchmal Feldwert
- 13. Zeitquantum pro Prozess pro Thread
- 14. Verringern Qt GUI-Anwendungsgröße
- 15. Auto Layout Leistung verringern
- 16. PHP Anzahl verringern zwischen Daten
- 17. IDE für Pro * C/C++ Entwicklung und Debugging unter Linux
- 18. PHP CPU-Auslastung pro Kern auf einem Linux-Server erhalten
- 19. Wie der pro-Chip-Standardwert von einem Linux-Modul wissen
- 20. Monat um eins in der Laufzeit verringern?
- 21. Ob Plist-Datei Leistung in iPhone verringern?
- 22. Wie Zähler in For-Schleife verringern?
- 23. verringern Zeichenfolge in Python funktioniert nicht
- 24. Maximale Stackgröße zur Laufzeit in Java verringern
- 25. Audiolautstärkeregler (erhöhen oder verringern) in Java
- 26. erhöhen oder verringern binding value in xaml
- 27. Wie installiert man Source Code Pro Font auf Arch Linux
- 28. Wie viele Dateien pro Verzeichnis gibt es maximal? (Linux)
- 29. WooCommerce Eingabefeld - Erhöhen/Verringern Feldschaltfläche
- 30. Die verringern Funktion verursacht Fehler
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
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. –