Dopo aver fatto alcuni test, ho ottenuto i seguenti risultati:
echo 0 > /sys/devices/system/cpu/cpu4/online
disabilita la quarta CPU.
"disabilita la 4a CPU" significa che i processi successivi non saranno più assegnati alla 4a CPU. In altre parole, i processi che si trovano nella 4a CPU prima di "disabilitare la 4a CPU" non verranno spostati fuori dalla CPU durante la disabilitazione della CPU.
Dicendo che ho quattro CPU:0, 1, 2 e 3. Quindi posso:
echo 0 > /sys/devices/system/cpu/cpu1/online
echo 0 > /sys/devices/system/cpu/cpu2/online
echo 0 > /sys/devices/system/cpu/cpu3/online
./MyShell.sh
per forzare il ./MyShell.sh
da assegnare alla CPU0.
A proposito, il riavvio abiliterà automaticamente tutte le CPU.
Oltre alla risposta di @Yves, sei effettivamente in grado di utilizzare il isolcpus
parametro del kernel.
Per disabilitare la quarta CPU/core (CPU 3) con Debian o Ubuntu:
In /etc/default/grub
aggiungi isolcpus=3
a GRUB_CMDLINE_LINUX_DEFAULT
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=3"
Esegui
sudo update-grub
Riavvia il server.
isolcpus — Isola le CPU dallo scheduler del kernel.
Sinossi isolcpus=numero_cpu [, numero_cpu ,...]
Descrizione Rimuove le CPU specificate, come definite da cpu_numbervalues, dal bilanciamento SMP del kernel generale e da scheduleralgroithms. L'unico modo per spostare un processo dentro o fuori una CPU "isolata" è tramite le chiamate di sistema di affinità della CPU. numero_cpu inizia da 0, quindi il valore massimo è inferiore di 1 rispetto al numero di CPU nel sistema.
Questa opzione è il modo preferito per isolare le CPU. L'alternativa, l'impostazione manuale della maschera della CPU di tutte le attività nel sistema, può causare problemi e prestazioni del bilanciamento del carico non ottimali.
È interessante notare che l'utilizzo di questi parametri del kernel può mettere da parte una CPU per utilizzare in seguito l'affinità della CPU con un processo/bloccare un processo su una CPU, e quindi entrambi assicurarsi che non ci siano più processi utente in esecuzione su quella CPU.
Inoltre, può anche rendere il server più stabile avendo la garanzia che un particolare processo con un carico molto elevato avrà le proprie CPU con cui giocare. Ho visto Meru farlo con i suoi controller basati su Linux prima di venire a conoscenza di questa configurazione.
Il comando associato per poi assegnare un processo alla quarta CPU (CPU 3), è:
sudo taskset -cp PID
taskset
viene utilizzato per impostare o recuperare l'affinità della CPU di un processo in esecuzione dato il suo PID o per lanciare un nuovo COMANDO con una data affinità della CPU. L'affinità della CPU è una proprietà dello scheduler che "lega" un processo a un determinato insieme di CPU nel sistema. Lo scheduler di Linux rispetterà l'affinità della CPU data e il processo non verrà eseguito su nessun'altra CPU. Si noti che lo scheduler di Linux supporta anche l'affinità naturale della CPU:lo scheduler tenta di mantenere i processi sulla stessa CPU per tutto il tempo possibile per motivi di prestazioni. Pertanto, forzare una specifica affinità CPU è utile solo in determinate applicazioni.
SOMMARIO
Esistono diverse tecniche applicate a questa domanda:
imposta isolcpus = 4
in grub e reboot è possibile disabilitare permanentemente la 5a CPU/CPU 4 per i processi di terra dell'utente;
echo 0 > /sys/devices/system/cpu/cpu4/online
disabilita la 5a CPU/CPU 4, che continuerà a funzionare per i processi che le sono già stati assegnati ma nessun nuovo processo sarà più assegnato alla CPU 4;
taskset -c 3 ./MyShell.sh
forzerà MyShell.sh
da assegnare alla 4a CPU/CPU 3 mentre la 4a CPU può ancora accettare altri processi di terra dell'utente se isolcpus non lo esclude dal farlo.
PS. Aneddoticamente, il mio miglior esempio di utilizzo del isolcpus
/taskset
sul campo, era un frontend SSL per un molto impegnato site, che continuava a diventare instabile ogni due settimane, dove Ansible/ssh
non mi farebbe più entrare da remoto.
Ho applicato le tecniche discusse sopra e da allora ha continuato a funzionare in modo molto stabile.