pthread_create Out of Memory
-
Hallo,
mein Programm macht recht viele Threads auf mit
pthread_create und ich bekomme ab dem 1020 Thread
den return-value 12, was laut Datei errno-base.h
ENOMEM "OUT OF MEMORY" bedeutet.
"top" zeigt beim Programmlauf mit 1019 Threads
in der Spalte VIRT 2043m an,
also scheint bei 2048m Schluss zu sein, da noch
ein Thread nicht mehr gestartet werden kann.Da aber noch jede Menge swap-Speicher frei ist,
muss das Speicherlimit doch irgendwo definiert
und änderbar sein.Wo ist das definiert ? (Suse 10.0)
Grüsse
Mox
-
musst du mal sysconf mit _SC_THREAD_THREADS_MAX checken.
-
Wenn du nicht gerade 1000 Prozessoren in deiner Maschine hast, sind 1000 gleichzeitig laufende Threads ein sehr gutes Indiz für einen Designfehler. Kannst du mal schreiben, warum du so viele Threads benötigst?
-
@Ponto
zB weil er einen Thread pro Verbindung aufmacht. Ist ja nicht sehr unüblich und auch kein Design-Fehler
-
also ich würde gern möglichst viele Verzeichnisse bzw. Dateien auf Änderungen überwachen und habe dieses so ersteinmal mit inotify und threads getestet und
bin da so an die Grenzen gestossen.Ich habe dabei pro überwachten Verzeichnis einen Thread aufgemacht, in dem inotify_init() und inotify_add_watch() ausgeführt werden.
Das überwachen von recht vielen Verezichnissen (>1000 oder > 10000)
müsste laut "man 2 epoll" auch mit epoll gehen:epoll is a variant of poll(2) that can be used either as Edge or Level Triggered interface and scales well to large numbers of watched fds.
leider sind bisher aber meine Programmierversuche mit epoll weitgehend
erfolglos und ich finde auch kein Beispiel, wo so etwas demonstiert wird.Kennt jemand ein Programm, wo epoll für sowas verwendet wird,
daß man sich den Code anschauen kann ?Gruss an alle
Mox
-
Ich denke Du hast (e)poll etwas falsch verstanden: Damit kannst Du Filedescriptoren überwachen, also schauen ob bei einer geöffneten Datei (Socket/Pipe/...) Daten zu lesen sind oder geschrieben werden dürfen. Damit kannst Du keine inodes überwachen, ob sie sich ändern. Bei einer regulären Datei wird (e)poll Dir so lange "lesbar" zurückliefern bis Du die Datei bis zum Ende gelesen hast.
EDIT:
Aber sollte man nicht mit inotify auch mehrere Inodes überwachen können? (irgendwie suggeriert mir das die Tatsache, dass die Funktion add_watch und nicht set_watch heisst)
-
inotify gibt dir einen Dateidescriptor zurück, den du mit epoll überwachen kannst. Ach und man kann mit add_watch zu einem Deskriptor mehrere Dateien zur Überwachung übergeben
http://www.linuxjournal.com/article/8478
@Ponto
okay, du hattest recht
-
kingruedi schrieb:
@Ponto
zB weil er einen Thread pro Verbindung aufmacht. Ist ja nicht sehr unüblich und auch kein Design-FehlerEs ist zwar üblich pro Verbindung einen Thread zu starten, aber es wird trotzdem von den Multithreading Gurus als Designfehler angesehen. Zum Beispiel hier:
Such einfach bei Google Groups nach: one thread per connection design
-
ich glaub, ich bin eher der Designfehler.
Es geht nämlich recht einfach mit inotify_add_watch()
mehrere Verzeichnisse zu überwachen.Es gibt dann ein Limit von 8192 Verzeichnissen,
definiert durch "inotify_max_user_watches = 8192"
in fs/inotify.c der Kernelsourcen.Nach Hochsetzen des Wertes und Neukompilierung des Kernels
habe ich eben einen Test mit 15000 Verzeichnissen gemacht
und bisher hat alles funktioniert.Dank und Gruss
Mox