2012-06-19 2 views
8

Dies ist unter Linux OS. App ist in C++ mit ACE-Bibliothek geschrieben.Wie erkennt man, ob ein Thread oder Prozess wegen OS-Planung ausgehungert wird

Ich vermute, dass einer der Thread im Prozess manchmal für ungewöhnlich lange Zeit (5 bis 40 Sekunden) blockiert wird. Die App läuft in den meisten Fällen gut, bis auf ein paar Mal am Tag, an dem dieses Problem auftritt. Es gibt andere ähnliche 5 Apps, die auf der Box laufen, die aufgrund der eingehenden Daten des Sockets ebenfalls I/O-gebunden sind.

Ich würde gerne wissen, ob es etwas gibt, was ich programmatisch tun kann, um zu sehen, ob der Thread/Prozess ihre Zeitscheibe bekommt.

Antwort

3

Wenn ein Prozess ausgehungert wird, wäre die Selbstüberwachung für diesen Prozess nicht so produktiv. Wenn Sie jedoch nur bemerken möchten, dass dieser Prozess seit einiger Zeit nicht mehr ausgeführt wird, kann er periodisch times aufrufen und die relative Differenz in der verstrichenen Zeit mit der relativen Differenz in der geplanten Benutzerzeit vergleichen (Sie würden die Felder tms_utime und tms_cutime summieren) Wenn Sie das Warten auf Kinder als produktive Zeit zählen möchten, würden Sie in den Feldern tms_stime und tms_cstime zählen, wenn Sie die in Ihrem Auftrag verbrachte Kernelzeit zählen, um produktiv zu sein. Für Thread-Zeiten ist die einzige Möglichkeit, die ich kenne, das /proc Dateisystem zu konsultieren.

Ein externer Prozess mit hoher Priorität oder Thread mit hoher Priorität könnte Prozesse (und Threads) von Interesse extern überwachen, indem er die entsprechenden /proc/<pid>/stat Einträge für den Prozess liest (und /proc/<pid>/task/<tid>/stat für die Threads). Die Benutzerzeiten befinden sich in den Feldern 14 und 16 der Datei stat. Die Systemzeiten befinden sich in den Feldern 15 und 17. (Die Feldpositionen sind genau für meinen Linux 2.6 Kernel.)

Zwischen zwei Zeitpunkten bestimmen Sie die verstrichene Zeit, die verstrichen ist (ein Überwachungsprozess oder ein Thread würde normalerweise in regelmäßigen Abständen aufwachen). Dann stellt der Unterschied zwischen den kumulativen Verarbeitungszeiten an jedem dieser Zeitpunkte dar, wie viel Zeit der Thread von Interesse während dieser Zeit laufen hat. Das Verhältnis von Verarbeitungszeit zu verstrichener Zeit würde die Zeitscheibe darstellen.

Ein letztes Stück Info: Unter Linux verwende ich folgendes für die Prüfung der richtigen task im /proc/<pid>/task/ Verzeichnis der tid des aktuellen Threads zu erhalten:

tid = syscall(__NR_gettid); 

Ich tue dies, weil ich kann nicht finden Sie den Systemaufruf gettid tatsächlich von einer beliebigen Bibliothek auf meinem System exportiert, obwohl es dokumentiert wurde. Aber vielleicht ist es bei Ihnen erhältlich.

Verwandte Themen