Unsichtbare Threads unter 2.6er Kerneln

  • Hallo!

    Ich hab ein Problem mit Threads unter dem 2.6er Kernel (SuSE 9.2, 9.3). Mit Google findet man zwar Infos von der LKML die besagen daß das Problem schon andere auch hatten, aber keine Lösungen; unter 2.4 hat es das Problem nicht gegeben.

    Konkret geht es darum daß mit pthread calls abgespaltene Prozesse für top(1) und ps(1) unsichtbar sind, obwohl sie sehr wohl laufen und die Systemlast auch richtig angezeigt wird. Unter

    http://kerneltrap.org/node/3930

    wird das Ganze genauer beschrieben; weiß jemand von euch mehr darüber bzw. wie man trotzdem an Infos über diese Prozesse kommt? Mir wäre schon geholfen wenn ich die PID dieser Threads herausbekäme.

    LG

    A.W.

  • Zitat von Wilkie

    wird das Ganze genauer beschrieben; weiß jemand von euch mehr darüber bzw. wie man trotzdem an Infos über diese Prozesse kommt? Mir wäre schon geholfen wenn ich die PID dieser Threads herausbekäme.

    kann dir leider auch keine lösungen anbieten. aber rein interessehalber: geht es um ein eigenes programm oder eines, das sich "nicht benimmt"?

    und du meinst die LWPID statt PID, oder?
    pid ist ja die gleiche wie die des ersten threads.

    lg michi

  • Das Programm um das es geht ist unsere am Insti selbstgeschriebene photorealistische Rendering-Software ART. Da man beim Bilder rechnen nie genug CPU-Leistung haben kann und wir ein paar Dual- und eine Quad-Maschine am Insti haben laufen die eigentlichen Bildberechnungen (raytracer, path tracer, photon tracer) mittlerweile soweit möglich alle multithreaded.

    Nachdem ART in Objective-C geschrieben ist spalten wir die Threads unter Linux mit Aufrufen von objc_thread_detach() (das soweit ich weiß intern pthreads verwendet) ab, und unter den 2.4er Kerneln haben die Threads bei dieser Methode alle eigene PIDs bekommen - was mich auch schon gewundert hat, aber nachdem es keine Auswirkungen auf die Funktionstüchtigkeit hatte hab ich mich nicht weiter darum gekümmert.

    Es funktioniert ja auch unter 2.6 alles so wie es soll, nur daß halt die Threads nicht mehr sichtbar sind. Was dann störend wird wenn man z.B. länger laufende Prozesse mit renice herunterstufen will um den Betrieb auf einer gemeinsam genutzen Maschine nicht zu behindern. Man kann das Problem umgehen indem man z.B. die lange dauernde Berechnung von Referenzbildern schon von vornherein mit niedrigem "nice" startet, aber auf Dauer ist das auch nix.

    Und nachdem das Erzeugen von unsichtbaren Threads generell ein eher sonderbares Verhalten ist daß sicher schon wem anderen auch aufgefallen ist hab ich mir gedacht daß ich mal hier nachfrage... :)

    LG

    Alexander

  • Zitat von Wilkie

    Es funktioniert ja auch unter 2.6 alles so wie es soll, nur daß halt die Threads nicht mehr sichtbar sind. Was dann störend wird wenn man z.B. länger laufende Prozesse mit renice herunterstufen will um den Betrieb auf einer gemeinsam genutzen Maschine nicht zu behindern. Man kann das Problem umgehen indem man z.B. die lange dauernde Berechnung von Referenzbildern schon von vornherein mit niedrigem "nice" startet, aber auf Dauer ist das auch nix.

    gleich vorweg: ich habe kaum praktische erfahrung mit threads und hoffe ich schreibe keinen blödsinn :)

    ich denke aber, dass posix-threads normalerweise die gleiche PID haben sollten wie der prozess, in dessen kontext sie gestartet werden, dafür unterschiedliche TIDs oder LWPIDs. ich habe gelesen, dass linux selbst schon ab version 1.x kernel-level-threads hatte, dh möglicherweise ist dein problem entweder das in der LKML angesprochene, oder du verwendest jetzt eine andere version der objective-c-bibliotheken, die die threads anders abbildet.

    tools wie renice arbeiten aber so viel ich weiß nur auf prozessebene, dh auch wenn man die einzelnen threads sieht, wird man IMO nichts ändern können.

    aber könnte nicht die aufrufende applikation nach dem objc_thread_detach() die identifier irgendwie speichern oder ausgeben? bzw. ein interface anbieten, über das man dann die eigenschaften der threads ändern kann?

    lg michi

  • Zitat von michi204


    tools wie renice arbeiten aber so viel ich weiß nur auf prozessebene, dh auch wenn man die einzelnen threads sieht, wird man IMO nichts ändern können.

    Unter 2.4 konnte man offenbar, aber wahrscheinlich war das nur ein Zufall. Die Threads gar nicht mehr sehen zu können ist allerdings auch ein Defekt auf Systemebene.

    Zitat von michi204


    aber könnte nicht die aufrufende applikation nach dem objc_thread_detach() die identifier irgendwie speichern oder ausgeben? bzw. ein interface anbieten, über das man dann die eigenschaften der threads ändern kann?

    Das ginge an sich schon, wäre aber mit einem nicht ganz harmlosen Aufwand verbunden weil ART auf eine cross platform Verwendbarkeit ausgelegt ist und daher das hier einzubauende thread management interface z.B. auch auf OS X funktionieren müßte. Und dort verwenden wir NSThreads, die wieder ganz anders angesprochen werden, d.h. es wäre noch eine Abstraktionsschicht nötig.

    Und angesichts dessen daß es ein ziemlicher Aufwand wäre es von ART aus "ordentlich" zu machen und wir mit dem Projekt derzeit noch wirklich andere Sorgen haben als so ein Detail glaub ich daß wir vorläufig einfach dabei bleiben daß man das nicht renicen kann... ;)

    Jedenfalls vielen Dank für Deine Antworten!

    LG

    Alexander ;)

  • Zitat von Wilkie

    Unter 2.4 konnte man offenbar, aber wahrscheinlich war das nur ein Zufall.

    das ging, weil die threads ja dort scheinbar als einzelne prozesse implementiert waren, warum auch immer..

    Zitat

    Das ginge an sich schon, wäre aber mit einem nicht ganz harmlosen Aufwand verbunden weil ART auf eine cross platform Verwendbarkeit ausgelegt ist und daher das hier einzubauende thread management interface z.B. auch auf OS X funktionieren müßte. Und dort verwenden wir NSThreads, die wieder ganz anders angesprochen werden, d.h. es wäre noch eine Abstraktionsschicht nötig.

    Und angesichts dessen daß es ein ziemlicher Aufwand wäre es von ART aus "ordentlich" zu machen und wir mit dem Projekt derzeit noch wirklich andere Sorgen haben als so ein Detail glaub ich daß wir vorläufig einfach dabei bleiben daß man das nicht renicen kann... ;)

    da hast du recht :p

    lg michi

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!