differenza tra taskset e cpuset


8

Sto cercando di ridurre la latenza della mia applicazione di rete linux. Ho imparato che esistono due strumenti per "associare" un programma a un particolare core della CPU: taskset e cpuset.

  1. Quale dovrei preferire? Sono equivalenti a un livello inferiore?
  2. (disposizione) La mia applicazione ha un singolo thread e dovrebbe elaborare una singola connessione tcp (nessuna riconnessione) su una rete LAN veloce con la minor latenza possibile. Sono sulla buona strada?

Hai letto le loro rispettive pagine man?
Michael Hampton,

Hai eseguito una profilazione dettagliata in modo da essere sicuro che sia la parte di rete Linux a causare la latenza e non l'applicazione?
Tero Kilkanen,

Quale sistema operativo / distribuzione / versione / kernel stai eseguendo?
ewwhite,

Inoltre, che tipo di hardware è coinvolto?
Marca

Risposte:


12

Taskset serve per associare un processo a una o più CPU; essenzialmente specificando dove può essere eseguito all'esecuzione iniziale o mentre è in esecuzione. Se si utilizza RHEL / CentOS su apparecchiature server moderne, numactlsi consiglia di utilizzare taskset.

Cpuset / cset è per la protezione della CPU ed è un framework costruito attorno a cgroup Linux. Cset non è mai stato popolare in alcune distribuzioni (come RHEL) perché ci sono altri strumenti disponibili per la gestione dei processi.

Il primo comando seguente crea uno scudo che limiterebbe le attività del sistema operativo ai core della CPU 0 e 8. Il secondo sposterà la sessione di shell corrente sullo scudo della CPU specificato, determinando un isolamento dei processi del sistema e dell'utente.

# cset shield --cpu 1-7,9-15 --kthread=on
# cset proc --move --pid=$$ --threads --toset=user

Ci sono altre cose che è possibile verificare e mettere a punto prima di intraprendere il percorso dei processi di associazione alle CPU; interrupt ( irqbalancedisabilitazione parziale), impostazioni di risparmio energetico, scheduler di sistema, elevatori I / O, politica in tempo reale ( chrt).

Vedi: Impostazioni TCP a bassa latenza su Ubuntu

Ecco un esempio ( contorto ) di un wrapper di applicazione che seleziona un core, arresta irqbalance, lo avvia e blacklist il core selezionato, quindi esegue ./your_program con SCHED_FIFO e priorità 99 sul core selezionato.

Core=5
CoreMask=`echo "16 o 2 $Core ^ p" | dc`
service irqbalance stop
  until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
IRQBALANCE_ONESHOT=1 IRQBALANCE_BANNED_CPUS=${CoreMask} irqbalance
sleep 1
  until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
numactl --physcpubind=${Core} --localalloc chrt -f 99 ./your_program

1
Nota, è possibile per un'applicazione ripristinare le sue affinità durante l'utilizzo taskset. Se usi cpuset non è possibile alterare le tue affinità rispetto a ciò che ti concede cpuset.
Matthew Ife,

E numactl??
ewwhite,

1
Lo stesso, entrambi i programmi chiamano la stessa chiamata di sistema sottostante sched_setaffinity.
Matthew Ife,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.