Montag, Juni 1, 2020

Entfernen zombie-Prozesse mit parallel-Paket

Nachdem ich gespielt habe, um für einige Zeit mit R Paket parallel auf meinem Debian-basierte Maschine, die ich noch nicht finden können, ein Weg, um entfernen Sie alle zombie child-Prozesse nach einer Berechnung.

Ich bin auf der Suche für eine Allgemeine und OS-unabhängige Lösung.

Unten ein einfaches Skript illustriert das problem für 2 Kerne:

library(parallel)
testfun <- function(){TRUE}

cltype <- ifelse(.Platform$OS.type != "windows", "FORK", "PSOCK")
cl <- makeCluster(2, type = cltype)
p <- clusterCall(cl, testfun)
stopCluster(cl)

Leider dieses Skripts lässt zwei zombie-Prozesse in der Prozesstabelle, die nur getötet werden, wenn R ist heruntergefahren.

  • Sie sind keine zombies, Sie sind nur Arbeitslose Kinder
InformationsquelleAutor user625626 | 2012-02-28

2 Kommentare

  1. 7

    Dies scheint nur ein Problem mit „GABEL“ – Cluster. Wenn Sie eine „PSOCK“ cluster statt, das Verfahren wird sterben, wenn Sie anrufen stopCluster(cl).

    Ist es etwas, das Sie daran hindern, eine „PSOCK“ cluster auf Ihrem Debian-basierten Rechner?

    • Hi Josh,Sorry für meine späte Antwort – du hast Recht, das scheint ein problem zu sein für Gabel-Cluster. PSOCK-Cluster arbeiten auch auf meiner Debian-Maschine – dachte nur-Verzweigung wäre schneller. Vielen Dank!
    • Dies scheint eine dumme Aufsicht und mit der GABEL Clustern. Ich habe einen bug-report, unter bugs.r-project.org/bugzilla3/show_bug.cgi?id=15471 . Zombie-Prozesse sind meist harmlos, denn Sie verbrauchen keine Ressourcen. Sie sind einfach in der Prozess-Tabelle, so dass der übergeordnete Prozess zu untersuchen, Ihre exit-status. Die Prüfung Ihrer exit-status mit library(fork) wait() reinigen Sie die zombies ein zu einer Zeit (und drucken der exit-status von jedem).
    • Die Gabel Paket ist nicht mehr verfügbar.
  2. 4

    Wohl die Antwort auf Ihr problem ist in der Hilfe-Datei von makeCluster() Befehl.

    Unten in der Datei, es steht geschrieben : Es ist gute Praxis, um ein Herunterfahren der Arbeitnehmer durch den Aufruf stopCluster: aber der Arbeiter wird beendet sich selbst, sobald der sockel, auf dem Sie sind empfangsbereit für Befehle nicht mehr verfügbar ist, die es sollte, wenn der master R-Sitzung abgeschlossen ist (oder seinen Prozess stirbt).

    Die Lösung ist (es ist für mich arbeiten) definieren Sie einen port für Ihren cluster während Sie Sie erstellen.

    cl <- makeCluster(2, type = cltype,port=yourPortNumber)

    einem anderen (möglicherweise nicht nützlich) – Lösung ist eine timeout-Einstellung für Ihre Steckdosen. timeout-variable wird in Sekunden angegeben.

    cl <- makeCluster(2, type = cltype,port=yourPortNumber,timeout=50)

    In jedem Fall sollte es das Ziel sein, um die socket-Verbindung nicht verfügbar.entweder schließen der ports oder Schließung der wichtigsten R-Prozess würde dies zu tun.

    Edit: Was ich meinte, war zum schließen der ports, die der Prozess empfangsbereit ist. Es sollte OS unabhängig. Sie können versuchen, zu verwenden -> showConnections(all = TRUE); . Diese geben allen verbindungen. Dann können Sie versuchen closeAllConnections();

    Sorry, wenn das nicht funktioniert, auch.

    • Die Angabe der port-Nummer funktioniert nicht für mich auf Ubuntu. Welche version von Debian verwendest du?
    • Bezüglich deines edit: stopCluster(cl) schon schließt die ports. Das ist, was bewirkt, dass die Prozesse zu zombie-Prozesse.
    • closeAllConnections() Funktioniert unter Windows mit PSOCK threads

Kostenlose Online-Tests