Setelah melakukan beberapa tes, saya mendapatkan hasil seperti di bawah ini:
echo 0 > /sys/devices/system/cpu/cpu4/online
tidak menonaktifkan CPU ke-4.
"nonaktifkan CPU ke-4" berarti bahwa proses selanjutnya tidak akan ditugaskan ke CPU ke-4 lagi. Dengan kata lain, proses yang terletak di CPU ke-4 sebelum "nonaktifkan CPU ke-4" tidak akan dipindahkan dari CPU saat menonaktifkan CPU.
Mengatakan bahwa saya memiliki empat CPU:0, 1, 2 dan 3. Jadi saya bisa:
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
untuk memaksa ./MyShell.sh
untuk ditugaskan ke CPU0.
Omong-omong, reboot akan mengaktifkan semua CPU secara otomatis.
Selain jawaban @Yves, Anda sebenarnya dapat menggunakan isolcpus
parameter kernel.
Untuk menonaktifkan CPU/inti ke-4 (CPU 3) dengan Debian atau Ubuntu:
Di /etc/default/grub
tambahkan isolcpus=3
ke GRUB_CMDLINE_LINUX_DEFAULT
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=3"
Jalankan
sudo update-grub
Mulai ulang server.
isolcpus — Mengisolasi CPU dari penjadwal kernel.
Sinopsis isolcpus=cpu_number [, cpu_number,...]
Deskripsi Hapus CPU yang ditentukan, seperti yang ditentukan oleh cpu_numbervalues, dari penyeimbangan SMP kernel umum dan pengaturan jadwal. Satu-satunya cara untuk memindahkan proses ke atau menonaktifkan CPU "terisolasi" adalah melalui syscalls afinitas CPU. cpu_number dimulai dari 0, jadi nilai maksimum adalah 1 lebih sedikit dari jumlah CPU pada sistem.
Opsi ini adalah cara yang disukai untuk mengisolasi CPU. Alternatifnya, menyetel topeng CPU dari semua tugas dalam sistem secara manual, dapat menyebabkan masalah dan kinerja penyeimbang beban yang kurang optimal.
Yang cukup menarik, penggunaan parameter kernel ini dapat menyisihkan CPU untuk nanti menggunakan afinitas CPU ke satu proses/menyematkan proses ke CPU, dan dengan demikian keduanya memastikan tidak ada lagi proses pengguna yang berjalan di CPU tersebut.
Selain itu, juga dapat membuat server lebih stabil dengan jaminan proses tertentu dengan beban yang sangat tinggi akan memiliki CPU sendiri untuk dimainkan. Saya telah melihat Meru melakukan itu dengan pengontrol berbasis Linux mereka sebelum mengetahui penyiapan ini.
Perintah terkait untuk menetapkan proses ke CPU keempat (CPU 3), adalah:
sudo taskset -cp PID
taskset
digunakan untuk menyetel atau mengambil afinitas CPU dari proses yang sedang berjalan dengan PID-nya atau untuk meluncurkan PERINTAH baru dengan afinitas CPU tertentu. Afinitas CPU adalah properti penjadwal yang "mengikat" proses ke kumpulan CPU tertentu pada sistem. Penjadwal Linux akan menghormati afinitas CPU yang diberikan dan proses tidak akan berjalan di CPU lain. Perhatikan bahwa penjadwal Linux juga mendukung afinitas CPU alami:penjadwal mencoba menjaga proses pada CPU yang sama selama mungkin karena alasan kinerja. Oleh karena itu, memaksakan afinitas CPU tertentu hanya berguna pada aplikasi tertentu.
Ringkasan
Ada beberapa teknik yang diterapkan untuk pertanyaan ini:
atur isolcpus = 4
di grub dan reboot dapat menonaktifkan CPU/CPU 4 ke-5 secara permanen untuk proses lahan pengguna;
echo 0 > /sys/devices/system/cpu/cpu4/online
menonaktifkan CPU/CPU 4 ke-5, yang akan tetap bekerja untuk proses yang telah ditetapkan padanya tetapi tidak ada lagi proses baru yang akan ditetapkan ke CPU 4;
taskset -c 3 ./MyShell.sh
akan memaksa MyShell.sh
untuk ditugaskan ke CPU/CPU ke-4 3 sedangkan CPU ke-4 masih dapat menerima proses tanah pengguna lain jika isolcpus tidak mengecualikannya dari melakukan itu.
PS. Secara anekdot, contoh terbaik saya menggunakan isolcpus
/taskset
di lapangan, adalah frontend SSL untuk sangat sibuk situs, yang terus tidak stabil setiap beberapa minggu, di mana Ansible/ssh
tidak akan membiarkan saya masuk dari jarak jauh lagi.
Saya menerapkan teknik yang dibahas di atas, dan terus bekerja dengan sangat stabil sejak saat itu.