Utilizzando solo un core CPU


9

Ho bisogno di eseguire test delle prestazioni per il mio programma simultaneo e il mio requisito è che dovrebbe essere eseguito su un solo core della CPU. (Non voglio collaborare con i thread - voglio sempre avere un cambio di contesto).

Quindi ho due domande:

  1. La soluzione migliore: come firmare e riservare un solo core CPU solo per il mio programma (per forzare il sistema operativo a non utilizzare questo core CPU). Immagino che non sia possibile ma forse mi sbaglio ...

  2. Come impostare Linux (Fedora 24) per usare solo un core della CPU?



1
Si noti che le CPU moderne possono cambiare la loro velocità in base al numero totale di core in uso. Anche se ti assicuri che il tuo processo stia utilizzando solo un singolo core e nessun altro processo lo stia utilizzando, la velocità di quel core differirà a seconda di come il sistema operativo utilizzerà gli altri core. Tenerne conto durante l'esecuzione dei test.
liori,

Dovresti essere in grado di disattivare i core della CPU dal BIOS, forse è più affidabile per i tuoi test come @liori ha affermato sopra che il sistema operativo potrebbe alterare la velocità del core.
Marzo

Che ne dici di creare una VM e assegnargli solo un core? Oh, ho appena letto il "non usare questo core della CPU" quindi non importa ...
sakisk,

Risposte:


26

Su Linux, la chiamata di sistema per impostare l'affinità della CPU per un processo è sched_setaffinity. Quindi c'è lo tasksetstrumento per farlo sulla riga di comando.

Per far funzionare quel singolo programma su una sola CPU, penso che vorresti qualcosa del genere

taskset -c 1 ./myprogram

(imposta qualsiasi numero di CPU come argomento per lo -cswitch.)

Questo dovrebbe essere abbastanza vicino a un sistema a singolo processore, a condizione che gli altri processi non vengano eseguiti troppo rispetto a quello che si desidera misurare o vengano programmati su altre CPU. Se si vuole dedicare una CPU a quel singolo processo solo , e impedire altri processi di esecuzione su quella CPU, avresti bisogno di impostare la loro affinità troppo.

Quello, non so come fare correttamente. Dovresti impostare l'affinità del processore initmolto presto nel processo di avvio per assicurarti che venga ereditato da tutti i processi sul sistema. Per ovviare al problema, è possibile utilizzare taskset -c -p 0 $PIDtutti gli altri processi per forzarli a funzionare solo su CPU # 0.

systemd deve ancheCPUAffinity= controllare l'affinità nei file di unità e ci sono un paio di domande sull'impostazione dell'affinità predefinita qui su unix.SE, ma non ne ho trovate nessuna con una buona soluzione.

Sebbene @Kamil Maciorowski abbia commentato e risposto a un'altra domanda su superuser.com , l'impostazione isolcpus=1 sulla riga di comando del kernel dovrebbe "isolare quella CPU dagli algoritmi di pianificazione generali", che è qualcosa che potresti desiderare.


Questo non risponde alla domanda. Mentre il tasket (o altri metodi per impostare l'affinità del task) garantirà che un processo venga eseguito solo sul set specificato di core, non garantirà che solo quel processo verrà eseguito su quei core. Vale a dire, il sistema operativo potrebbe programmare altri processi sul core a cui hai impostato l'affinità di processo. In pratica, questa è la risposta più utile, ma sii consapevole delle limitazioni e in particolare tieni presente che non fornisce ciò che chiedi in 1) "riservare un solo core CPU solo per il mio programma (per forzare il sistema operativo a non usare questo core della CPU) "
James Greenhalgh,

@JamesGreenhalgh, ma, trovare un modo per impostare l'affinità della CPU per ogni processo risponderebbe alla domanda. È possibile impostare un'affinità cpu predefinita per i nuovi processi, come opzione kernel (linea cmd)? Ciò avrebbe effetto all'inizio del processo di avvio e influirebbe su tutti i processi.
jpaugh,

In realtà ho perso la clausola tra parentesi sull'impedire l'esecuzione di altri processi su quella CPU. O forse pensavo che il problema più grande sarebbe stato quello di assicurarsi che il programma in questione sarebbe stato eseguito su un solo core, invece di dire quattro, e che gli altri processi potessero essere considerati una specie di seccatura, che non avrebbe molta importanza rispetto a quello. Ma lo ammetto, non avevo una risposta adeguata a quella parte della domanda, a parte ciò che Kamil ha commentato ora.
ilkkachu,

@jpaugh, penso che anche allora non saresti in grado di isolarti completamente dalla possibilità di eseguire un altro processo sul "tuo" core. Ad esempio, uno che reimposta la propria affinità o addirittura il codice del kernel stesso richiede tempo non correlato alla gestione del processo. Ancora una volta, concordo pienamente sul fatto che, in pratica, questa risposta è ciò che la maggior parte farebbe per risolvere la maggior parte del problema, ma sarei davvero interessato a leggere una risposta a quell'ultima parte tra parentesi!
James Greenhalgh,
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.