Prozess- / Thread-Erstellungs- und -vernichtungsverlauf oder -ledger unter Mac OS X

962
raulk

Ich sehe ein seltsames Threading-Verhalten in meinem Mac (Yosemite 10.10.4). Die Anzahl der Threads steigt an und geht dann wieder zurück. Manchmal bleibt es extrem hoch und übertrifft maxprocund führt zu fork: Resource temporarily unavailableNachrichten, selbst nachdem es auf 2048 erhöht wurde.

In Anbetracht der Tatsache, dass die Threads in Betracht kommen maxproc, würde ich gerne überwachen, wo dieser Thrash tobt kommt.

top, htopUnd glancesbietet nur Schnappschüsse, aber ich brauche ein timestamped Protokoll der Thread - Erzeugung und Zerstörung, einschließlich Besitz und Elternschaft, um genau das Problem zu identifizieren.

Irgendwelche Ideen?

BEARBEITEN 1: Mein Verweis auf Google Chrome als möglicher Verdächtiger wurde entfernt, um die Frage auf den Threadverlauf oder das Ledger zu konzentrieren.

0
Nun, erstens gibt es wirklich kein Threadleck. Threads sind keine begrenzte Ressource. Zweitens generiert jede Anforderung, ein Skript zu laden oder ein Bild oder ein Stylesheet zu laden oder dem Spionager mitzuteilen, dass Sie etwas besucht haben, oder Aktualisierungen der clientseitigen Analyse usw. einen Thread. Es ist ungewöhnlich, dass die meisten Browser weniger als 10 Threads verwenden, um eine moderne Seite zu laden. Die Erstellung und Zerstörung von Threads ist halb kostspielig, weshalb asynchrone Apps Threads zusammenfassen und für spätere Verwendung aufbewahren. Was ist dein aktuelles Problem? Threads werden nicht "verbraucht". Es gibt unendlich viele Fäden. Frank Thomas vor 8 Jahren 1
CONT. Ein Thread stellt einen Stream von Anweisungen dar und ist somit die kleinste und atomarste Verarbeitungseinheit, die eine App verwenden kann. Das heißt, jeder Prozess wird als mindestens ein Thread ausgeführt. In diesem Fall sind Ihre Threads alle inaktiv, sie führen nichts aus, wie die geringe oder nicht vorhandene CPU-Auslastung für diese Prozesse belegt. Wenn ein Thread keine CPU verbraucht, kann er genauso gut nicht existieren. Abgesehen von der geringen Arbeit, die er später wiederverwenden kann, werden Sie nicht gespart. Deswegen gibt es weder einen Grund, ihn wegzuwerfen, noch einen Grund zur Besorgnis über den Prozess mindestens 63 Fäden hervorgebracht. Frank Thomas vor 8 Jahren 1
Ja, ich weiß, was für ein Thread es ist, aber unter dem Strich zählt, dass sie in Mac OS X und * Nix-Kerneln auf die Grenzen von ulimit und sysctl hinzählen. Hier stößt mein System möglicherweise an eine Grenze, möglicherweise aufgrund einer falschen Anwendung. Deshalb möchte ich überwachen, woher diese Aktivität kommt, um das Problem zu lokalisieren. http://blog.ghostinthemachines.com/2010/01/19/mac-os-x-fork-resource-temporaneous-unavailable/ https://stackoverflow.com/questions/13009632/getting-strange-behavior-from- terminal-and-iterm-bash-fork-resource-temporar raulk vor 8 Jahren 0
Es gibt keine einfache / einfache Methode, aber dtrace sollte die von Ihnen gewünschten Informationen preisgeben, aber es ist ein sehr vielseitiges Werkzeug, das eine gewisse Lernkurve bietet und einige Nachforschungen erfordert. Hier kann ein guter Anfang sein: https://docs.oracle.com/cd/E18752_01/html/819-5488/gcggv.html Alternativ können Sie mit der Antwort von Roland Smith hier zumindest feststellen, welche PIDs / PPIDs werden erstellt, sobald sie angezeigt werden: http://stackoverflow.com/questions/14269891/monitor-process-creation-in-freebsd. Viel Glück. Frank Thomas vor 8 Jahren 0
Danke für den Zeiger. Ich denke, Sie sollten Ihre Kommentare oben korrigieren, @FrankThomas. (1) Threads sind keine begrenzte Ressource => sie können sein, wenn sie vom Betriebssystem begrenzt werden. In Unix-Systemen kann man "maxproc" auf "unlimited" setzen, aber in Mac OS X ist dies nicht möglich und auf 2048 begrenzt. Daher ist die Anzahl der Threads von Natur aus begrenzt **, wodurch sie zu einer begrenzten Ressource werden. *. (2) HTTP-Anforderungen zum Abrufen von Bildern, CSS usw. vom Browser ** erzeugen nicht jeweils einen neuen Thread **! Threads werden über Threadpools wiederverwendet, worauf Sie später hinweisen. Vielleicht möchten Sie das auch korrigieren. Und vielleicht ein Downvote entfernen;) raulk vor 8 Jahren 0
Es stellt sich heraus, dass es ** eine einfache Möglichkeit gibt, die Erstellung von Prozessen / Threads unter Mac OS X in Echtzeit zu überwachen: das Tool `` execsnoop` ​​**. Ich habe es als Antwort unten hinzugefügt. raulk vor 8 Jahren 0

2 Antworten auf die Frage

1
raulk

Dank des execsnoopTools konnte ich einige Einblicke gewinnen . Beschreibung von der Manpage:

execsnoop druckt Details zu neuen Prozessen, während sie ausgeführt werden. Details wie UID, PID und Argumentliste werden ausgedruckt.

Beispielausgabe:

[raul@~/bitbar$] sudo execsnoop -v STRTIME UID PID PPID ARGS 2016 Jan 14 17:56:09 0 1 0 launchd 2016 Jan 14 17:56:09 501 90311 1 influxd 2016 Jan 14 17:56:16 501 90312 321 kcc 2016 Jan 14 17:56:16 0 1 0 launchd 2016 Jan 14 17:56:16 0 90313 1 kcm 2016 Jan 14 17:56:19 0 1 0 launchd 2016 Jan 14 17:56:19 501 90314 1 influxd 

execsnoopverwendet DTrace, und ich habe diesen tollen Beitrag mit einigen anderen Skripten / Tools gefunden: http://dtrace.org/blogs/brendan/2011/10/10/top-10-dtrace-scripts-for-mac-os-x/ .

In Mac OS X (Darwin) - und * Nix-Kerneln werden Threads als Prozesse dargestellt, weshalb die Zählung in Richtung ulimitund sysctlbegrenzt wird.

-2
Eric Malouff

from mac: fork: Ressource vorübergehend nicht verfügbar

lösen Sie durch Verweisen auf den Ordner, in dem sich das Skript oder das Dienstprogramm befindet

Zum Beispiel: aus dem Ordner müssen Sie das Skript oder das Dienstprogramm ausführen:

/ usr / local / opt / dart / libexec / bin / pub global aktivieren stagehand