Linux taskset Command Tutorial voor Beginners (met voorbeelden)

Ooit gehoord van de term processor affiniteit? Het is een functie waarmee je processen aan een bepaalde centrale verwerkingseenheid, of aan een reeks van CPU’s, kunt binden of ont-binden. Ja, je kunt het systeem vertellen welke CPU kern(en) gebruikt moeten worden om een bepaald proces uit te voeren. Voor theoretische details over het bestaan van processor affiniteit ga je hier.

In deze zelfstudie bespreken we een hulpprogramma – taskset genoemd – waarmee je processor affiniteit kunt bereiken. Maar voor we dat doen, is het de moeite waard te vermelden dat alle voorbeelden in deze handleiding getest zijn op een Ubuntu 20.04 LTS machine en op Debian 10.

Linux taskset commando

Met het taskset commando kun je de CPU affiniteit van een proces instellen of opvragen. Hieronder volgt de syntaxis:

taskset [options] mask command [argument...]
taskset [options] -p [mask] pid

Hier is hoe de man pagina van het gereedschap het uitlegt:

       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.

Hieronder volgen enkele vraag-antwoord-achtige voorbeelden die je een beter idee moeten geven van hoe het taskset commando werkt.

Q1. Hoe gebruik je taskset om de CPU affiniteit van een proces op te vragen?

Als je taskset de CPU affiniteit van een al draaiend proces wilt laten zien, gebruik je het commando op de volgende manier:

taskset -p [PID]

Vervang gewoon PID door de ID van het proces waarvan je de CPU affiniteit wilt ophalen. Bijvoorbeeld:

taskset -p 9726

Het bovenstaande commando gaf de volgende uitvoer:

pid 9726's current affinity mask: f

Dus de hexadecimale waarde ‘f’ betekent hier dat het proces op elk van de 4 processorkernen kan draaien: 0,1,2,3.

Als je de uitvoer in termen van CPU bereik wilt hebben, kun je de -c commandoregel optie toevoegen.

taskset -cp 9726

Het volgende is de uitvoer in dit geval:

pid 9726's current affinity list: 0-3

Q2. Hoe de CPU affiniteit veranderen met taskset?

Om de CPU affiniteit van een bestaand proces aan te passen, moet je het proces ID opgeven (zoals we in de vorige paragraaf deden) samen met een hexadecimaal masker dat de nieuwe affiniteit bepaalt.

Bijvoorbeeld, de huidige CPU affiniteit van het Gedit proces (PID: 9726) is ‘f’.

Hoe de CPU affiniteit veranderen met taskset

Om de affiniteit te veranderen in 0x11, gebruik je het volgende commando:

taskset -p 0x11 9726

En dan kun je de nieuwe affiniteit weer controleren met het volgende commando:

taskset -p 9726

De volgende schermafdrukken tonen de uitvoer van deze commando’s in mijn geval:

Taken gebruiken

Je kunt dus zien dat de affiniteit veranderd is.

Q3. Hoe wijs je een reeks CPU’s toe terwijl je de affiniteit verandert?

Dit is geen groot probleem. Alles wat je hoeft te doen is de -c command-line optie toe te voegen aan het commando dat we in de vorige sectie hebben gebruikt, samen met het CPU core bereik als invoer.

Hier is een voorbeeld:

taskset -cp 0,3 9726

Hieronder volgt de uitvoer die in dit geval wordt geproduceerd:

pid 9726's current affinity list: 0
pid 9726's new affinity list: 0,3

Q4. Hoe start je een proces met voorgedefinieerde CPU affiniteit?

Ja, je kunt ook een proces starten met een ingestelde CPU affiniteit.

Ik lanceerde bijvoorbeeld de teksteditor gedit met CPU affiniteit 0xa.

taskset 0xa gedit

Conclusie

Akkoord, het taskset commando is niet voor een doorsnee commandoregel gebruiker. Het wordt vooral gebruikt door server-side experts voor proces optimalisatie in een multi-core omgeving. We hebben de basisprincipes van het gereedschap hier besproken. Ga voor meer info naar zijn man pagina.