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-Fehler 🙄

    Es ist zwar üblich pro Verbindung einen Thread zu starten, aber es wird trotzdem von den Multithreading Gurus als Designfehler angesehen. Zum Beispiel hier:

    http://groups.google.com/group/comp.programming.threads/browse_frm/thread/4363af31d48ed647/13ac59f92c77ed2b

    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


Anmelden zum Antworten