Negative von laufenden Prozessen mit Echtzeitpriorität?

9

Gibt es Nachteile beim Ausführen von Prozessen mit Echtzeitpriorität ( chrt -f 99)?

Meine Hypothese ist, dass dies in Kombination mit einer Affinität sicherstellt, dass jede Prävention meines Prozesses minimal ist und daher jeglicher Jitter (insbesondere Netzwerklatenz) minimiert wird - dies hilft nicht bei der Gesamtlatenz, aber in diesem Moment bin ich mehr befasst sich mit Jitter.

(Kernel: 2.6.16 / 3.0)

Nim
quelle
2
Dies sieht für Sie hilfreich aus: Wie kann Jitter für Java reduziert werden?
ire_and_curses
@ire_and_curses, derzeit wird der Prozess auf einem eigenen isolierten Kern (zumindest dem Hauptverarbeitungsthread) ausgeführt. Die Interrupts sind jedoch nicht auf demselben Kern geplant (dies ist nicht möglich, da mehrere ähnliche Prozesse auf derselben Netzwerkschnittstelle basieren ), dies ist eher eine letzte Anstrengung. Die APIC-Frequenz ist interessant, ich habe dies noch nie zuvor erlebt.
Nim

Antworten:

4

Der unmittelbarste Nachteil beim Ausführen eines Echtzeitprozesses besteht darin, dass der Prozess jeden anderen Prozess auf dem System leicht aushungern kann. Aus Ihrer Sicht ist das Ergebnis, dass der Computer nicht auf Tastatur, Maus und wahrscheinlich auf das Netzwerk reagiert, solange der Echtzeitprozess die CPU verwendet. Dies kann passieren, wenn etwas schief geht und der Prozess in eine Endlosschleife gerät, oder sogar vorübergehend, wenn der Prozess eine Langzeitberechnung startet, ohne regelmäßig auf Eingaben zu warten. (Führen Sie beispielsweise SETI @ home nicht mit Echtzeitpriorität aus.)

Ein einzelner Single-Thread-Prozess auf einer Multi-Core-CPU verursacht dieses Problem mit geringerer Wahrscheinlichkeit, da andere Kerne für den Prozess mit niedrigerer Priorität verwendet werden können. Wenn dieser Prozess jedoch untergeordnete Prozesse erstellt, erben diese dieselbe Echtzeitpriorität, sodass die Dinge außer Kontrolle geraten können, wenn Sie nicht vorsichtig sind.

Die sched_setscheduler(2)Manpage hat gute Ratschläge:

Da eine nicht blockierende Endlosschleife in einem unter SCHED_FIFO oder SCHED_RR geplanten Prozess alle Prozesse mit niedrigerer Priorität für immer blockiert, sollte ein Softwareentwickler immer eine Shell auf der Konsole verfügbar halten, die unter einer höheren statischen Priorität als die getestete Anwendung geplant ist. Auf diese Weise können getestete Echtzeitanwendungen, die nicht wie erwartet blockiert oder beendet werden, im Notfall beendet werden. Siehe auch die Beschreibung des RLIMIT_RTTIME-Ressourcenlimits in getrlimit (2).

Das sollte eine Shell auf der Konsole sein - nicht unter einem Xterm, es sei denn, Sie möchten auch X-Echtzeitpriorität zuweisen.

Jander
quelle
Ja - dies ist das Hauptproblem, auf das ich zu stoßen scheine. Ohne den Kernel-Code durchzulesen, um alle Prozesse zu bestimmen, die eine höhere Priorität haben müssen, besteht die einzige Möglichkeit darin, alle anderen außer meinem Prozess zu verhungern und dann alles, was irgendeine Form von Io erfordert, auf andere Kerne zu verschieben ... hmmm. ..
Nim