UPD memory placement aware NUMA scheduler

This commit is contained in:
2023-12-01 14:06:49 +01:00
parent 88c9edfa5f
commit a7e9e5fa5f
2 changed files with 103 additions and 0 deletions

View File

@@ -745,5 +745,108 @@ eBPF-Tracing-Programme oder ähnliche Programme zu erstellen. Wenn Sie die Heade
als Modul erstellen, wird ein Modul namens kheaders.ko erstellt, das bei Bedarf
geladen werden kann, um Zugriff auf die Header zu erhalten.
\subsection{Kernel log buffer size (16 $\Rightarrow$ 64KB, 17 $\Rightarrow$ 128KB)}
CONFIG\_LOG\_BUF\_SHIFT [=17] \textbf{[17]}\\
Wählen Sie die minimale Größe des Kernel-Protokollpuffers als eine Potenz von 2 aus.
Die endgültige Größe wird durch den Konfigurationsparameter LOG\_CPU\_MAX\_BUF\_SHIFT
beeinflusst, siehe unten. Eine höhere Größe kann auch durch den Boot-Parameter
\glqq log\_buf\_len\grqq{} erzwungen werden.\\
Beispiele:\\
\indent 17 $\Rightarrow$ 128 KB\\
\indent 16 $\Rightarrow$ 64 KB\\
\indent 15 $\Rightarrow$ 32 KB\\
\indent 14 $\Rightarrow$ 16 KB\\
\indent 13 $\Rightarrow$ 8 KB\\
\indent 12 $\Rightarrow$ 4 KB\\
Symbol: LOG\_BUF\_SHIFT\\
Type: Integer (Ganzzahl)\\
Range: [12 25]
\subsection{CPU kernel log buffer size contribution (13 $\Rightarrow$ 8 KB, 17 $\Rightarrow$ 128KB)}
CONFIG\_LOG\_BUF\_SHIFT [=12] \textbf{[12]}\\
Diese Option ermöglicht es, die Standardgröße des Ringpuffers entsprechend der Anzahl
der CPUs zu erhöhen. Der Wert definiert den Beitrag jeder CPU als eine Potenz von 2.
Der beanspruchte Speicherplatz beträgt in der Regel nur wenige Zeilen, kann aber viel
mehr sein, wenn Probleme gemeldet werden, z. B. bei Rückverfolgungen.
Die erhöhte Größe bedeutet, dass ein neuer Puffer zugewiesen werden muss und der
ursprüngliche statische Puffer ungenutzt ist. Dies ist nur auf Systemen mit mehr CPUs
sinnvoll. Daher wird dieser Wert nur verwendet, wenn die Summe der Beiträge größer ist
als die Hälfte des Standard-Kernel-Ringpuffers, wie durch LOG\_BUF\_SHIFT definiert.
Die Standardwerte sind so eingestellt, dass mehr als 16 CPUs erforderlich sind, um die
Zuweisung auszulösen. Diese Option wird auch ignoriert, wenn der Kernelparameter
\glqq log\_buf\_len\grqq{} verwendet wird, da er eine exakte (Zweierpotenz) Größe des
Ringpuffers erzwingt. Die Anzahl der möglichen CPUs wird für diese Berechnung verwendet,
wobei Hotplugging ignoriert wird, so dass die Berechnung für das Worst-Case-Szenario
optimal ist und gleichzeitig ein einfacher Algorithmus ab dem Hochfahren verwendet
werden kann. Beispiele für Verschiebungswerte und ihre Bedeutung:
\indent 17 $\Rightarrow$ 128 KB für jede CPU\\
\indent 16 $\Rightarrow$ 64 KB für jede CPU\\
\indent 15 $\Rightarrow$ 32 KB für jede CPU\\
\indent 14 $\Rightarrow$ 16 KB für jede CPU\\
\indent 13 $\Rightarrow$ 8 KB für jede CPU\\
\indent 12 $\Rightarrow$ 4 KB für jede CPU\\
Symbol: LOG\_CPU\_MAX\_BUF\_SHIFT\\
Type: Integer (Ganzzahl)\\
Range: [0 21]
\subsection{Printk indexing debugfs interface)}
CONFIG\_PRINTK\_INDEX [=y] \textbf{[Y]}\\
Unterstützung für die Indizierung aller zur Kompilierzeit bekannten
printk-Formate unter\\
$<$debugfs$>$/printk/index/$<$module$>$ hinzufügen.
Dies kann als Teil der Wartung von Daemonen, die /dev/kmsg überwachen,
verwendet werden, da es die Überprüfung der in einem Kernel vorhandenen
printk-Formate erlaubt, was die Erkennung von Fällen ermöglicht,
in denen überwachte printks geändert oder nicht mehr vorhanden sind.\\
Es gibt keine zusätzlichen Laufzeitkosten für printk, wenn dies aktiviert ist.
\subsection{Scheduler features \texorpdfstring{$\rightarrow$}{->}}
Scheduler-Funktionen
\subsubsection{Enable utilization clamping for RT/FAIR tasks}
CONFIG\_UCLAMP\_TASK [=y] \textbf{[Y]}\\
Diese Funktion ermöglicht es dem Scheduler, die geklemmte Auslastung jeder CPU
auf der Grundlage der auf dieser CPU geplanten RUNNABLE-Tasks zu verfolgen.
Mit dieser Option kann der Benutzer die minimale und maximale CPU-Auslastung
angeben, die für RUNNABLE-Aufgaben zulässig ist. Die maximale Auslastung
definiert die maximale Häufigkeit, mit der ein Task laufen soll, während die
minimale Auslastung die minimale Häufigkeit definiert, mit der er laufen soll.\\
Sowohl die Minimal- als auch die Maximalwerte für die Auslastung sind Hinweise
für den Scheduler, um seine Frequenzauswahl zu verbessern, aber sie erzwingen
oder gewähren keine bestimmte Bandbreite für Tasks.\\
Im Zweifelsfall sagen Sie N für Nein.
\paragraph{Number of supported utilization clamp buckets}$~$\\
CONFIG\_UCLAMP\_BUCKETS\_COUNT [=5] \textbf{[5]}\\
Legt die Anzahl der zu verwendenden Klammerbereiche fest. Der Bereich der
einzelnen Buckets ist SCHED\_CAPACITY\_SCALE/UCLAMP\_BUCKETS\_COUNT.
Je höher die Anzahl der Clamp-Buckets, desto feiner die Granularität und
desto höher die Präzision der Clamp-Aggregation und -Verfolgung während der
Laufzeit.
Mit dem minimalen Konfigurationswert haben wir beispielsweise 5 Clamp-Buckets,
die jeweils 20 \% Auslastung verfolgen. Eine um 25 \% gesteigerte Aufgabe
wird im Bucket [20..39]\% gezählt und setzt den effektiven Wert der
Bucketklemme auf 25 \%.
Wenn eine zweite, um 30 \% erhöhte Aufgabe auf derselben CPU eingeplant wird,
wird diese Aufgabe im selben Bucket wie die erste Aufgabe gezählt und erhöht
den effektiven Bucket-Clamp-Wert auf 30 \%.
Der effektive Klemmwert eines Bereichs wird auf seinen Nennwert (20 \% im
obigen Beispiel) zurückgesetzt, wenn keine weiteren Aufgaben mehr in diesem
Bereich gezählt werden. Bei einigen Aufgaben kann eine zusätzliche
Verstärkungs-/Kappungsmarge hinzugefügt werden. Im obigen Beispiel wird
die 25 \%-Aufgabe auf 30 \% angehoben, bis sie die CPU verlässt.
Sollte dies auf bestimmten Systemen nicht akzeptabel sein, ist es immer
möglich, den Spielraum zu verringern, indem die Anzahl der Clamp-Buckets
erhöht wird, um den verbrauchten Speicher gegen die Genauigkeit der
Laufzeitverfolgung einzutauschen.\\
Im Zweifelsfall sollten Sie den Standardwert verwenden.
\subsection{Memory placement aware NUMA scheduler}
CONFIG\_NUMA\_BALANCING [=y] \textbf{[Y]}\\
Diese Option fügt Unterstützung für automatische NUMA-bewusste
Speicher-/Task-Platzierung hinzu.
Der Mechanismus ist recht primitiv und basiert darauf, dass Speicher
migriert wird, wenn er Referenzen auf den Knoten hat, auf dem die Aufgabe läuft.\\
Dieses System ist auf UMA-Systemen inaktiv.
\end{document}