Untuk kata pengantar saya menggunakan Debian Wheezy dengan kernel 3.2 pada chipset AMD64. Mesin saya memiliki dua inti Xeon E5-2690. Saya mengatur parameter boot sehingga semua core pada satu CPU didedikasikan untuk satu proses. Untuk melakukan ini, saya telah menetapkan isolcpus = 8,9,10,11,12,13,14,15 dalam grub.
Sejauh ini baik. Sekarang katakanlah saya ingin menggunakan CPU yang terisolasi untuk perintah yang diberikan, agar sederhana saya hanya akan menggunakan loop infinite sederhana:
$ tasket -c 8-15 bash -c 'sementara true; do echo hello> / dev / null; selesai &
Sejauh ini bagus, top menunjukkan bahwa core 8 berputar hingga utilisasi mendekati 100%. Sekarang katakanlah saya meluncurkan perintah itu lagi:
$ tasket -c 8-15 bash -c 'sementara true; do echo hello> / dev / null; selesai &
Sekarang top menunjukkan bahwa core 9-15 tetap tidak digunakan dan kedua proses berbagi core 8. Jika sebaliknya saya melakukan ini:
$ tasket -c 8 bash -c 'sementara true; do echo hello> / dev / null; selesai &
$ tasket -c 9 bash -c 'sementara true; do echo hello> / dev / null; selesai &
Core 8 dan 9 masing-masing mendapatkan utilisasi 100% sebagaimana mestinya. Ini hanya berlaku untuk isolcpus karena tasket yang sama dengan core 1-7 menyebarkan proses dengan benar ke core yang relevan. Selanjutnya "tasket -p" menunjukkan bahwa topeng afinitas untuk proses 8-15 diatur dengan benar. Tampaknya penjadwal kernel menolak untuk menggunakan apa pun kecuali inti terendah yang ditentukan pada mask afinitas isolcpus.
Sekarang biasanya ini tidak akan menjadi masalah besar dengan contoh saya di atas, cukup tentukan core individu untuk setiap proses. Namun saya ingin menjalankan aplikasi yang sangat multithread pada CPU khusus. Saya ingin menentukan set inti dan memiliki kumpulan utas secara otomatis digunakan, tanpa harus secara individual mengatur ulang afinitas prosesor untuk setiap utas individu yang muncul.
Apakah ada yang tahu bagaimana cara mendapatkan scheduler untuk memberi saya lebih dari satu inti dari set isolcpu?
Jawaban:
Setelah seharian frustrasi saya telah menentukan solusi. Perilaku ini tampaknya merupakan artefak dari algoritma penjadwal kernel default (SCHED_OTHER untuk distro / kernel ini). Mengubah proses ke algoritma yang berbeda menghilangkan masalah, isolcpus digunakan secara memadai di seluruh proses / utas.
Saya akhirnya menggunakan SCHED_RR, tetapi saya juga menguji SCHED_FIFO dan SCHED_IDLE yang keduanya sepertinya berfungsi. Proses dapat diluncurkan dengan algoritma alternatif dengan menggunakan utilitas chrt:
$ sudo chrt -r 1 [perintah]
(Jika Anda ingin menjalankan sebagai non-root Anda dapat menggunakan utilitas setcap untuk mengaktifkan CAP_SYS_NICE pada file biner yang terkait dengan perintah)
sumber