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.
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:
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.
Tags und Links c++ linux job-scheduling operating-system ace