Wir haben einen Prozess, der für die Abfrage der Hardware in zeitabhängigen Intervallen zuständig ist. Wir möchten diesem Prozess einen CPU-Kern zuweisen. Beispielsweise möchten wir, dass dieser Prozess jederzeit lauffähig bleibt.
Unser erster Versuch, dieses Problem zu lösen, war der folgende:
# Set process to highest priority
nice -n -20 cmd
# Set thread affinity in C for our hardware sampling thread
pthread_setaffinity_np(...)
Beide oben genannten Schritte funktionieren wie erwartet. Unser Thread bleibt dort, core3
wo wir ihn festgelegt haben, und nice
ist -20
oben.
Bei erneuter Ausführung ftrace
alsgemäß dieser DiskussionUnddieses Problemsehen wir häufig Folgendes:
> cat trace | grep " 3)" | grep " => "
3) rhd_loc-2735 => <idle>-0
3) <idle>-0 => rhd_loc-2735
3) rhd_loc-2735 => <idle>-0
3) <idle>-0 => rhd_loc-2735
3) rhd_loc-2735 => <idle>-0
3) <idle>-0 => rhd_loc-2735
rhd_loc-2735
ist unser Prozess.
Zusätzlich zu dem, was oben gezeigt ist, sehen wir viele Fälle, in denen kworker-2703
Switches und manchmal andere Prozesse mit niedrigerer Priorität in den Kern eingebunden werden.
Wir glauben, dass der Grund für die Kontextwechsel darin liegt, dass unser Prozess mit SPI
(Serial Peripheral Interface) kommuniziert, das darauf wartet IRQs
, und außerdem SPI
mit einer um ein Vielfaches langsameren Taktrate als der CPU-Kern läuft. Daher verbringt unser Prozess einen Großteil seiner Zeit damit, auf SPI/IRQs zu warten, d. h. er befindet sich nicht in einem Runnable
Zustand. Unabhängig von der Priorität oder Affinität kann der Kernel dem Kern andere Prozesse zuweisen.
Dies führt dazu, dass unsere Hardware-Abtastrate variabler und niedriger ist als sie sein könnte, da unser CPU-Kern nicht immer sofort bereit ist, den nächsten Wert zu verarbeiten SPI
und dann eine neue Abtastanforderung zu senden.
Frage:
Können wir entweder 1) alle anderen Prozesse zwingen, sich außerhalb des Kerns zu befinden, damit unser Prozess sofort auf Unterbrechungsanforderungen reagieren kann, oder 2) unseren Hauptthread ausführbar halten, damit er immer für die Verarbeitung der nächsten Anforderung verfügbar ist?