Po provedení několika testů jsem dostal níže uvedené výsledky:
echo 0 > /sys/devices/system/cpu/cpu4/online
deaktivuje 4. CPU.
"zakázat 4. CPU" znamená, že pozdější procesy již nebudou přiřazeny 4. CPU. Jinými slovy, procesy umístěné na 4. CPU před "zakázat 4. CPU" nebudou přesunuty z CPU při deaktivaci CPU.
Říkám, že mám čtyři CPU:0, 1, 2 a 3. Takže můžu:
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
vynutit ./MyShell.sh
které mají být přiřazeny k CPU0.
Mimochodem, restart automaticky povolí všechny CPU.
Kromě odpovědi @Yves můžete ve skutečnosti použít isolcpus
parametr jádra.
Chcete-li deaktivovat 4. CPU/jádro (CPU 3) s Debianem nebo Ubuntu:
V /etc/default/grub
přidejte isolcpus=3
až GRUB_CMDLINE_LINUX_DEFAULT
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=3"
Spustit
sudo update-grub
Restartujte server.
isolcpus — Izolujte CPU od plánovače jádra.
Synopse isolcpus=cpu_number [, cpu_number,...]
Popis Odeberte specifikovaná CPU, jak jsou definována pomocí cpu_numbervalues, z obecného jádra SMP vyvažování a plánovacích groithmů. Jediný způsob, jak přesunout proces na nebo z "izolovaného" CPU, je přes systémová volání CPU afinity. cpu_number začíná 0, takže maximální hodnota je o 1 menší než počet CPU v systému.
Tato možnost je preferovaným způsobem izolace CPU. Alternativa, ruční nastavení masky CPU všech úloh v systému, může způsobit problémy a neoptimální výkon nástroje pro vyrovnávání zátěže.
Je zajímavé, že použití těchto parametrů jádra může být vyčleněním CPU pro pozdější použití pomocí afinity CPU k jednomu procesu/připnutí procesu k CPU, a tím se zajistí, že na tomto CPU neběží žádné další uživatelské procesy.
Kromě toho může také učinit server stabilnější a mít záruku, že konkrétní proces s velmi vysokou zátěží bude mít své vlastní procesory, se kterými si bude hrát. Viděl jsem Meru, jak to dělá se svými ovladači založenými na Linuxu, než jsem se o tomto nastavení dozvěděl.
Přidružený příkaz pro přiřazení procesu čtvrtému CPU (CPU 3) je:
sudo taskset -cp PID
taskset
se používá k nastavení nebo načtení afinity CPU běžícího procesu dané jeho PID nebo ke spuštění nového PŘÍKAZU s danou CPU afinitou. Afinita CPU je vlastnost plánovače, která „spojuje“ proces s danou sadou CPU v systému. Plánovač Linuxu bude respektovat danou afinitu CPU a proces nepoběží na žádném jiném CPU. Všimněte si, že plánovač Linux také podporuje přirozenou afinitu CPU:plánovač se z výkonnostních důvodů pokouší udržet procesy na stejném CPU tak dlouho, jak je to praktické. Vynucení konkrétní CPUafinity je proto užitečné pouze v určitých aplikacích.
SOUHRN
Na tuto otázku se používá několik technik:
nastavte isolcpus = 4
v grub a restartu lze trvale deaktivovat 5. CPU/CPU 4 pro uživatelské procesy;
echo 0 > /sys/devices/system/cpu/cpu4/online
deaktivuje 5. CPU/CPU 4, který bude stále pracovat pro procesy, které mu již byly přiřazeny, ale žádné nové procesy již nebudou přiřazeny CPU 4;
taskset -c 3 ./MyShell.sh
vynutí MyShell.sh
být přiřazen ke 4. CPU/CPU 3, zatímco 4. CPU může stále přijímat další uživatelské procesy, pokud jej z toho nevylučuje isolcpus.
PS. Anekdoticky, můj nejlepší příklad použití isolcpus
/taskset
na poli, byl SSL frontend pro velmi zaneprázdněné stránky, které byly každých pár týdnů nestabilní, kde Ansible/ssh
už by mě dálkově nepustil dovnitř.
Použil jsem výše uvedené techniky a od té doby to fungovalo velmi stabilně.