Schon mal vom Begriff Prozessoraffinität gehört? Es ist eine Funktion, mit der Sie Prozesse an eine bestimmte zentrale Verarbeitungseinheit oder eine Reihe von CPUs binden oder entbinden können. Ja, Sie können dem System mitteilen, welche CPU-Kerne verwendet werden sollen, um einen bestimmten Prozess auszuführen. Theoretische Details darüber, warum Prozessoraffinität existiert, finden Sie hier.
Hier, in diesem Tutorial, werden wir ein Dienstprogramm besprechen - genannt taskset - damit können Sie Prozessoraffinität erreichen. Aber bevor wir das tun, ist es erwähnenswert, dass alle Beispiele in diesem Tutorial auf einem Ubuntu 20.04 LTS-Rechner und auf Debian 10 getestet wurden.
Linux-Taskset-Befehl
Mit dem Befehl „taskset“ können Sie die CPU-Affinität eines Prozesses festlegen oder abrufen. Es folgt die Syntax:
taskset [options] mask command [argument...]
taskset [options] -p [mask] pid
So erklärt es die Manpage des Tools:
taskset is used to set or retrieve the CPU affinity of a running
process given its pid, or to launch a new command with a given CPU
affinity. CPU affinity is a scheduler property that "bonds" a process
to a given set of CPUs on the system. The Linux scheduler will honor
the given CPU affinity and the process will not run on any other CPUs.
Note that the Linux scheduler also supports natural CPU affinity: the
scheduler attempts to keep processes on the same CPU as long as practi?
cal for performance reasons. Therefore, forcing a specific CPU affin?
ity is useful only in certain applications.
The CPU affinity is represented as a bitmask, with the lowest order bit
corresponding to the first logical CPU and the highest order bit corre?
sponding to the last logical CPU. Not all CPUs may exist on a given
system but a mask may specify more CPUs than are present. A retrieved
mask will reflect only the bits that correspond to CPUs physically on
the system. If an invalid mask is given (i.e., one that corresponds to
no valid CPUs on the current system) an error is returned. The masks
may be specified in hexadecimal (with or without a leading "0x"), or as
a CPU list with the --cpu-list option. For example,
0x00000001 is processor #0,
0x00000003 is processors #0 and #1,
0xFFFFFFFF is processors #0 through #31,
32 is processors #1, #4, and #5,
--cpu-list 0-2,6
is processors #0, #1, #2, and #6.
When taskset returns, it is guaranteed that the given program has been
scheduled to a legal CPU.
Im Folgenden finden Sie einige Beispiele im Q&A-Stil, die Ihnen eine bessere Vorstellung davon vermitteln sollen, wie der Taskset-Befehl funktioniert.
Q1. Wie verwendet man Taskset, um die CPU-Affinität eines Prozesses abzurufen?
Wenn Sie möchten, dass Taskset die CPU-Affinität eines bereits laufenden Prozesses anzeigt, verwenden Sie den Befehl wie folgt:
taskset -p [PID]
Ersetzen Sie einfach PID durch die ID des Prozesses, dessen CPU-Affinität Sie abrufen möchten. Zum Beispiel:
taskset -p 9726
Der obige Befehl hat die folgende Ausgabe zurückgegeben:
pid 9726's current affinity mask: f
Der hexadezimale Wert „f“ bedeutet hier also, dass der Prozess auf jedem der 4 Prozessorkerne ausgeführt werden kann:0,1,2,3.
Wenn Sie möchten, dass die Ausgabe in Bezug auf den CPU-Bereich erfolgt, können Sie die Befehlszeilenoption -c hinzufügen.
taskset -cp 9726
Das Folgende ist die Ausgabe in diesem Fall:
pid 9726's current affinity list: 0-3
Q2. Wie ändere ich die CPU-Affinität mit Taskset?
Um die CPU-Affinität eines bestehenden Prozesses zu optimieren, müssen Sie die Prozess-ID (wie wir es im vorherigen Abschnitt getan haben) zusammen mit einer hexadezimalen Maske angeben, die die neue Affinität definiert.
Beispielsweise ist die aktuelle CPU-Affinität des Gedit-Prozesses (PID:9726) 'f'.
Verwenden Sie den folgenden Befehl, um die Affinität auf 0x11 zu ändern:
taskset -p 0x11 9726
Und dann können Sie die neue Affinität mit dem folgenden Befehl erneut überprüfen:
taskset -p 9726
Die folgenden Screenshots zeigen die Ausgaben für diese Befehle in meinem Fall:
So können Sie sehen, dass sich die Affinität geändert hat.
Q3. Wie kann man eine Reihe von CPUs zuweisen, während man die Affinität ändert?
Das ist keine große Sache. Alles, was Sie tun müssen, ist, die Befehlszeilenoption -c zu dem Befehl hinzuzufügen, den wir im vorherigen Abschnitt verwendet haben, zusammen mit dem CPU-Kernbereich als Eingabe.
Hier ist ein Beispiel:
taskset -cp 0,3 9726
Folgendes ist die in diesem Fall erzeugte Ausgabe:
pid 9726's current affinity list: 0
pid 9726's new affinity list: 0,3
Q4. Wie starte ich einen Prozess mit vordefinierter CPU-Affinität?
Ja, Sie können einen Prozess auch mit einer festgelegten CPU-Affinität starten.
Zum Beispiel habe ich den Text-Gedit-Editor mit CPU-Affinität 0xa gestartet.
taskset 0xa gedit
Schlussfolgerung
Zugegeben, der Taskset-Befehl ist nichts für einen durchschnittlichen Befehlszeilenbenutzer. Es wird hauptsächlich von serverseitigen Experten zur Prozessoptimierung in einer Multi-Core-Umgebung verwendet. Wir haben hier die Grundlagen des Tools besprochen. Weitere Informationen finden Sie auf der Manpage.