Bagaimana cara mengubah frekuensi switch konteks Linux?

17

Bagaimana mungkin untuk mengubah frekuensi switch-konteks Linux (linaro, ubuntu, debian)?

Saya setuju untuk menukar sistem yang kurang responsif dengan sistem yang lebih efisien.

EDIT1: Saya memiliki proses utama yang ingin saya jalankan secepat mungkin (siklus clock maksimal per detik), jadi saya berpikir untuk mengurangi frekuensi konteks-switch (= meningkatkan timeslice). Pertanyaannya adalah bagaimana melakukannya, dan apakah akan ada efek yang signifikan. Bisakah saya menghitung biaya pengalih konteks? Artinya, dapatkah saya memperkirakan jika saya meningkatkan kutu waktu dua, apa yang akan saya dapatkan dalam kinerja% untuk proses utama yang saya pedulikan?

Nadav B
sumber
1
Saya berharap efek pengaturan ini menjadi minimal, dan relevan hanya jika Anda memiliki lebih banyak proses yang berjalan daripada inti CPU. Jika tidak ada tugas lain yang menunggu CPU tertentu, sama sekali tidak perlu mengatur timer pengalihan tugas waktu singkat, karena apa pun yang dapat membuat tugas lain dapat dijalankan adalah panggilan sistem atau gangguan perangkat keras, yang keduanya akan mengembalikan CPU ke kernel.
Simon Richter
Maaf sudah gila di sini, tetapi bisakah seseorang menjelaskan apa arti 'frekuensi pemindahan konteks' dalam konteks pertanyaan ini?
user1717828
@sourcejedi lihat EDIT1 saya - bisakah saya memperkirakan peningkatan throughput dalam% ketika saya mengurangi frekuensi saklar konteks?
Nadav B
@NadavB Saya sudah mengedit jawaban saya. Pengukuran spesifik paling baik saat mengoptimalkan. Anda tidak harus memperlakukannya sebagai kotak hitam, misalnya Anda dapat menggunakan perf untuk mengukur kesalahan cache jika CPU Anda bagus. AIUI, berbagai jenis miss cache CPU (termasuk miss TLB) adalah biaya individual yang paling penting dari pengalihan konteks.
sourcejedi

Jawaban:

17

Jika tugas Anda adalah satu - satunya proses yang meminta waktu pada CPU tertentu, tidak akan ada konteks yang beralih di antara tugas-tugas :-). Tetapi CPU mungkin masih terganggu, menyebabkan konteks beralih ke kernel dan kembali. Dan satu kemungkinan penyebabnya adalah pre-emption timer, memeriksa apakah ada tugas lain untuk dijalankan pada CPU ini ...

Linux dapat menghindari penghentian pre-emption timer pada cpu ketika tidak ada alasan untuk melakukannya. Lihat CONFIG_NO_HZ_FULL. Untuk menggunakan fitur ini, itu harus diaktifkan ketika kernel dibangun, dan itu harus diaktifkan menggunakan opsi boot.

Secara default, tidak ada CPU yang akan menjadi CPU tick-adaptif. Parameter boot "nohz_full =" menentukan CPU tick-adaptif. Sebagai contoh, "nohz_full = 1,6-8" mengatakan bahwa CPU 1, 6, 7, dan 8 adalah CPU tick-adaptif. Perhatikan bahwa Anda dilarang menandai semua CPU sebagai CPU centang-adaptif [...]

LWN.net mengatakan "menurut Ingo Molnar, sebanyak 1% dari waktu CPU akan disimpan" untuk CPU tick-adaptif. Dokumen kernel mengatakan ini memiliki enam biaya berbeda, dan ada juga daftar "MASALAH UMUM".

Keuntungan ini relatif kecil, terutama dibandingkan dengan potensi perolehan throughput dari pengurangan frekuensi konteks-switch antara beberapa tugas, seperti yang dirujuk dalam jawaban ini: Bagaimana mengubah panjang irisan waktu yang digunakan oleh penjadwal CPU Linux?

Cetak kecil: pengukuran ini pre-date Spectre, Meltdown, KPTI, dan x86 ASID mendukung :-(. Dan saya kira itu juga berlaku untuk perangkat keras yang agak lama. Tanyakan pada pakar kernel atau jalankan pengukuran Anda sendiri tentang bagaimana biaya konteks-switch memiliki diubah pada versi kernel dan perangkat keras spesifik Anda ... PTI sebagian besar seharusnya dimitigasi oleh ASID, kecuali untuk perangkat lunak yang sangat sering memanggil kernel, contoh utama adalah basis data. Tapi saya tidak memiliki pemahaman yang baik tentang angka-angka .

Harapan Molnar dalam tambalan RFC asli adalah bahwa seiring berjalannya waktu, "kemungkinan akan diaktifkan oleh sebagian besar distro Linux". Saya perhatikan Fedora 28 menyediakan kernel default yang dibangun dengan NO_HZ_FULLdukungan. Namun, Debian 9 tidak.


Baru-baru ini, Linux v4.17 menghapus sisa tick 1 Hz dari nohz_fullCPU . Saya membayangkan efek pada throughput cukup kecil :-), tapi saya sudah mencoba mengikuti status NO_HZ_FULLmanfaat ketika ada beberapa proses runnable pada CPU -

setelah kita mencapai 0 Hz kita dapat [kemudian] menghapus asumsi centang periodik dari nr_running> = 2 juga, dengan secara esensial menginterupsi tugas sibuk hanya sesering kendala sched_latency yang harus kita lakukan - setiap 4-40 msecs, tergantung pada nr_running .

Ini agak membingungkan karena pre-emption sudah mulai menggunakan centang terpisah yang lebih tepat di v2.6.25-rc1, komit 8f4d37ec073c, "sched: tick preemption high-res" . Ditemukan melalui komentar ini pada artikel LWN.net yang sama: https://lwn.net/Articles/549754/ ).

sourcejedi
sumber
bagaimana dengan kernel.sched_rr_timeslice_ms?
Nadav B
1
@NadavB jika Anda menggunakan tugas sched_rr realtime, katakan demikian. Ini adalah topik spesialis. Jika tidak, maka tidak :-).
sourcejedi