Taskset tidak bekerja pada rentang core di isolcpus

12

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?

pengguna79126
sumber
dapatkah Anda mencoba menggunakan program multithread? bash bukan multithread
c4f4t0r
1
Ya, itu yang menyebabkan saya memperhatikan (program multithreaded saya tidak menggunakan lebih dari satu core). Skrip python sederhana yang membuat banyak utas gagal memanfaatkan lebih dari satu inti saat dijalankan pada set isolcpus. (Ketika dijalankan pada core yang tidak terisolasi itu menggunakan semua 8 core yang tersedia).
user79126
baca linuxtopia.org/online_books/linux_kernel/kernel_configuration/… ini , tidak termasuk cpus dari penjadwal kernel, tetapi setelah Anda mengecualikan cpus Anda ingin menjalankan proses pada cpus yang dikecualikan?
c4f4t0r
1
Kernel tidak akan menjadwalkan utas atau proses pada isolcpu kecuali topeng afinitas prosesor menunjukkan bahwa ia harus digunakan. Kalau tidak, isolcpus akan sama dengan mematikan inti, ketika tujuannya adalah untuk memesan inti untuk alasan yang ditentukan pengguna dan memastikan tidak ada proses yang tidak diinginkan menggunakannya. Taskset mengatur topeng afinitas untuk menggunakan semua core dalam kisaran 8-15 (yang diatur dengan benar ketika diperiksa di / proc) sehingga kernel harus menjadwalkan proses pada core idle.
user79126

Jawaban:

9

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)

pengguna79126
sumber
1
Meskipun tasketting afinitas ke core 0,1 aplikasi java saya hanya menggunakan inti pertama. 'sudo chrt -r 1 [command]' juga memecahkan masalah saya.
Barry NL