Com assignar un programa a un nucli de l'CPU usant taskset

En la mesura que els processadors multi-nucli es tornen cada vegada més comuns tant en servidors com en latops o PC d'escriptori, i fins i tot fins a dispositius mòbils, cada vegada són més les aplicacions optimitzades per a aquest tipus de sistemes. No obstant això, de vegades pot ser útil vincular un programa o procés a un o diversos nuclis específics. Vegem com aconseguir-ho ...

instal·lar taskset

L'eina taskset forma part de el paquet «util-linux». La major part de les distribucions Linux se amb el paquet pre-instal lat per defecte. En cas que taskset no mostrar, és possible instal·lar-lo de la següent manera:

En Debian / Ubuntu i derivats:

suo apt-get install util-linux

En Fedora i derivats:

sudo yum install util-linux

Veure l'afinitat de CPU (CPU affinity) d'un procés en execució

Per recuperar la informació d'afinitat de CPU d'un procés, cal utilitzar el següent format:

taskset -p PID

Per exemple, per comprovar l'afinitat de la CPU d'un procés amb PID 2915:

taskset -p 2915

Retorna el resultat:

pid 2915 s current affinity mask: ff

taskset retorna l'afinitat de CPU actual en un format de màscara de bits hexadecimal. En l'exemple, l'afinitat (representada en una màscara de bits hexadecimal) correspon a «11111111» en format binari, el que significa que el procés pot executar-se en qualsevol dels vuit nuclis de CPU diferents (de 0 a 7).

El bit més baix en una màscara de bits hexadecimal correspon a l'nucli ID 0, el segon bit més baix des de la dreta a l'nucli ID 1, el tercer bit més baix a l'nucli ID 2, etc. Així, per exemple, una afinitat de CPU «0x11» representa els nuclis ID 0 i 4.

taskset pot mostrar l'afinitat de CPU com una llista de processadors en lloc d'una màscara de bits, la qual cosa és molt més fàcil de llegir. Per utilitzar aquest format, cal executar taskset amb l'opció «-c». Per exemple:

taskset -cp 2915

Retorna el resultat:

pid 2915 s current affinity list: 0-7

Obligar un procés a que s'executi en un nucli específic

Utilitzant taskset, es pot assignar un procés en execució a un nucli específic de la CPU. Per a això, cal utilitzar el següent format:

taskset -p COREMASK PID taskset -cp CORE-LIST PID

Per exemple, per assignar un procés als nuclis 0 i 4, cal executar:

taskset -p 0x11 9030

El que retorna el resultat:

pid 9030 s current affinity mask: ff pid 9030 's new affinity mask: 11

En forma equivalent, es pot executar:

taskset -cp 0,4 9030

Amb l'opció «-c», es pot especificar una llista de IDs de nucli numèrics, separats per comes, o fins i tot es poden incloure rangs (per exemple, 0,2,5,6-10).

Llançar un programa utilitzant un nucli específic

taskset també permet llançar un nou programa utilitzant una sèrie de nuclis específics. Per a això, cal utilitzar-lo amb el següent format:

taskset COREMASK EXECUTABLE

Per exemple, per posar en marxa el programa VLC al nucli ID 0 de la CPU, cal utilitzar la següent comanda:

taskset -c 0 vlc

Dedicar un nucli únicament a un programa en especial

Si bé taskset permet assignar a un programa a un nucli en particular, això no vol dir que no hi hagi altres programes o processos que facin ús d'ell mateix. Per evitar això i dedicar un nucli sencer a un programa en especial, cal utilitzar el paràmetre de l'nucli «isolcpus», que permet reservar un nucli durant l'arrencada.

Per a això, cal afegir el paràmetre «isolcpus =» en la línia de el nucli en GRUB. Per exemple, per reservar els nuclis ID 0 i 1, cal afegir «isolcpus = 0,1».

Un cop fet això, el planificador de Linux no assignarà cap procés regular a l'nucli reservat, llevat que sigui específicament assignat amb taskset.

font: xmodul & taskset man pages.


Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   petxec va dir

    Bon post :).

  2.   Luis va dir

    Bon post però sense ànims de trollear ...

    Quina utilitat té assignar un programa a un nucli específic ???

    Vull dir; si tens un equip amb 12 nuclis el més lògic seria que determinat programa s'executés fent ús d'aquests 12 nuclis i no limitar-ja que d'aquesta manera obtenim el major rendiment possible.

    Al que sí li veig utilitat és l'opció que ens permet que a cert nucli no se li assigni cap procés deixant al seu ús exclusiu a determinat programa.

    1.    jvk85321 va dir

      Té lògica el que esmentes, a l'deixar que el planificador faci servir tots els cores es balanceja millor els recursos, però de vegades es requereix un nucli de dedicacion exclusiva, com córrer una màquina virtual amb una tasca específica, el rendiment d'aquesta màquina millora substancialment a l' no haver-hi mes processos corrent en el nucli assignat.

      atte
      jvk85321

      1.    usemoslinux va dir

        Exacte! Gràcies, jvk! 🙂

      2.    lf va dir

        Però quan aquestes creant la màquina virtual et demana que escullis la quantitat de CPU assignades ... que serveix triar aquest valor si a la fi el sistema operatiu omet això i l'executa en totes les CPU ... Per ahi l'exemple no és el millor ...

        Per fer funcionar Flash sobre Windows 8.1 x64, AMD i Firefox es recomanava triar que Flash s'executi només en un CPU, però a mi no em va funcionar. Seria còmode també que el agreguin (si és que no aquesta) als administradors de tasques dels diferents DE, o al menys a l'KDE.

      3.    lf va dir

        ah no havia entès el final de l'comentari ... Però per això caldria banear a tots els processos sobre el CPU que executa la màquina virtual. O bé assignar-los a altres CPU. Interessant i molt bon comentari.

    2.    Fernando va dir

      Serveix per crear superordinadors genis

  3.   Luis va dir

    Entès.

    Gràcies per l'aclariment.

  4.   Teca va dir

    A l'reservar un nucli per a un programa específic que passa amb els fils d'execució ?, en el cas que ho faci amb un nucli amb HT reserva 2 fils d'ejecucion per al programa ??.

  5.   Swicher va dir

    Potser aquesta comanda no sembli de molta utilitat en ordinadors amb diversos nuclis, però per als que tenim un Dual Core és bastant pràctic. Així per exemple, tinc un joc que quan l'obro em fa servir tots els nuclis de l'processador i si també tinc altres programes que necessiten la CPU (com alguna recerca amb grep en arxius grans) llavors el sistema s'alenteix. La solució és tan simple com limitar el joc a què només usi un dels nuclis.
    També estic d'acord amb lf, realment haurien d'integrar això en els administradors de tasques (dels que he provat fins ara en Gentoo, crec que cap ho té), especialment quan en Windows és una cosa que existeix des de XP (botó dret sobre un procés> «Establir afinitat ...») però fa temps vaig trobar el següent script que converteix taskset en alguna cosa una mica més intuïtiu (originalment el van publicar aquí i fins i tot es mostren alguns casos en què resulta necessari gestionar l'ús dels nuclis):
    #!/bin/bash
    read -p 'Ingrese el ID del proceso en cuestión: ' ID
    read -p 'Ingrese la lista de procesadores separados por comas: ' P
    echo 'Su ID es '$ID' y los procesadores son '$P
    sudo taskset -p -c $P $ID
    read -p 'Listo, presione enter para finalizar' P

    Amb algunes modificacions se li podria indicar el nom de l'procés en lloc de l'PID (o que accepti tots dos i que decideixi quan aquest paràmetre és una cosa o l'altra).

  6.   jorss va dir

    no hi ha una Interfax gràfica per taskset per als nous usuari els seria de grat