Wie erkennt man, ob ein Thread oder Prozess aufgrund von OS-Einplanungen ausgehungert wird?

8

Dies ist unter Linux OS. App ist in C ++ mit ACE-Bibliothek geschrieben.

Ich vermute, dass einer der Threads im Prozess manchmal für ungewöhnlich lange Zeit blockiert wird (5 bis 40 Sekunden). 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 irgendetwas gibt, was ich programmatisch tun kann, um zu sehen, ob der Thread / Prozess seine Zeitscheibe bekommt.

    
Medicine 19.06.2012, 21:21
quelle

1 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 times in regelmäßigen Abständen aufrufen und die relative Differenz in der verstrichenen Zeit mit der relativen Differenz in der geplanten Benutzerzeit vergleichen (Sie würden die% co_de summieren) % und tms_utime Felder, wenn Sie das Warten auf Kinder als produktive Zeit zählen möchten, und Sie würden in den Feldern tms_cutime und tms_stime summieren, wenn Sie die in Ihrem Auftrag aufgewendete Kernelzeit als produktive Zeit zählen. Für Thread-Zeiten kann ich nur das tms_cstime Dateisystem einsehen.

Ein externer Prozess mit hoher Priorität oder ein Thread mit hoher Priorität könnte Prozesse (und Threads) von Interesse extern überwachen, indem er die entsprechenden /proc -Einträge für den Prozess liest (und /proc/<pid>/stat für die Threads). Die Benutzerzeiten befinden sich in den Feldern 14 und 16 der Datei /proc/<pid>/task/<tid>/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 bisschen Info: Unter Linux verwende ich Folgendes, um die stat des aktuellen Threads zum Untersuchen der richtigen tid im Verzeichnis task zu erhalten:

%Vor%

Ich tue dies, weil ich den /proc/<pid>/task/ Systemaufruf, der von irgendeiner Bibliothek auf meinem System tatsächlich exportiert wurde, nicht finden konnte, obwohl er dokumentiert war. Aber, könnte es bei Ihnen sein.

    
jxh 19.06.2012, 21:45
quelle