Linux: Mengapa frekuensi CPU berfluktuasi saat menggunakan gubernur kinerja?

8

Saya menggunakan mesin Debian 8 amd64 untuk benchmarking. Selama percobaan, saya ingin CPU beroperasi pada frekuensi yang tetap (lebih disukai maksimum yang dimungkinkan). Ini akan mengesampingkan kecepatan jam CPU sebagai sumber variasi dalam hasil.

Setelah membaca, tampaknya hal yang benar untuk dilakukan adalah mengubah pengatur CPU performance, yang dijelaskan di sini dalam dokumentasi kernel Linux :

"Kinerja" gubernur CPUfreq menetapkan CPU secara statis ke frekuensi tertinggi dalam batas scaling_min_freq dan scaling_max_freq.

Sayangnya, rincian lebih lanjut tentang scaling_min_freqdan scaling_max_freqtidak disediakan. Semoga itu tidak menjadi masalah, karena frekuensi CPU yang digunakan adalah nilai maksimum dari interval.

Jadi saya telah mengaktifkan gubernur ini menggunakan cpufreq-set:

$ cat / sys / devices / system / cpu / cpu * / cpufreq / scaling_governor
kinerja
kinerja
kinerja
kinerja

Dan untuk ukuran yang baik, saya juga menonaktifkan mode turbo boost di bios:

$ cat / sys / devices / system / cpu / intel_pstate / no_turbo
1

Berdasarkan uraian kinerja gubernur di atas, saya berharap tidak ada fluktuasi dalam kecepatan clock CPU. Namun jika saya berulang kali berlari cpufreq-info, saya melihat kecepatan jam berfluktuasi:

$ cpufreq-info | grep 'CPU fr saat ini'
  frekuensi CPU saat ini adalah 4,00 GHz.
  frekuensi CPU saat ini adalah 3,99 GHz.
  frekuensi CPU saat ini adalah 4,00 GHz.
  frekuensi CPU saat ini adalah 4,00 GHz.
$ cpufreq-info | grep 'CPU fr saat ini'
  frekuensi CPU saat ini adalah 4,00 GHz.
  frekuensi CPU saat ini adalah 4,00 GHz.
  frekuensi CPU saat ini adalah 4,00 GHz.
  frekuensi CPU saat ini adalah 3,96 GHz.
$ cpufreq-info | grep 'CPU fr saat ini'
  frekuensi CPU saat ini adalah 4,00 GHz.
  frekuensi CPU saat ini adalah 4,00 GHz.
  frekuensi CPU saat ini adalah 4,00 GHz.
  frekuensi CPU saat ini adalah 3,94 GHz.
$ cpufreq-info | grep 'CPU fr saat ini'
  frekuensi CPU saat ini adalah 4,01 GHz.
  frekuensi CPU saat ini adalah 4,00 GHz.
  frekuensi CPU saat ini adalah 4,00 GHz.
  frekuensi CPU saat ini adalah 3,98 GHz.

Apakah fluktuasi ini disebabkan oleh perangkat keras, BIOS, kernel, atau faktor lain? Apakah ada cara untuk mengatur frekuensi CPU sedemikian rupa sehingga tidak berfluktuasi sama sekali?

Edd Barrett
sumber
Apa jenis perangkat keras server yang Anda gunakan? Apa pengaturan daya dan kinerja CPU dari perangkat keras itu?
ewwhite
Ini sebenarnya mesin desktop dengan CPU i7. Saya sudah mengunggah dmesg dan cpuinfo di sini: gist.github.com/vext01/73eea539eb041acf784b . Re: pengaturan bios, saya harus pergi ke mesin dan mencari. Apakah ada pengaturan khusus yang Anda pikirkan?
Edd Barrett
Itu bukan fluktuasi "banyak" dibandingkan dengan variasi pstate normal ... :)
rogerdpack

Jawaban:

9

Setelah beberapa percobaan, saya pikir saya bisa menjawab pertanyaan saya sendiri.

Seperti yang disebutkan dalam utas ini , pada perangkat keras Intel tertentu, ada dua cara untuk mengelola frekuensi CPU:

  • Menggunakan pstate.
  • Menggunakan ACPI biasa.

Ketika pstate digunakan, BIOS memiliki beberapa pendapat atas kecepatan clock, dan tampaknya ini adalah sumber fluktuasi.

Anda dapat memaksa pstate off dengan menambahkan intel_pstate=disableargumen kernel (sunting /etc/default/grubdan tambahkan argumen ke GRUB_CMDLINE_LINUX_DEFAULT. Akhirnya jalankan sudo update-grub).

Setelah melakukan ini, output dari cpufreq-infoterlihat jauh berbeda, dan saya juga melihat bahwa satu set gubernur CPU yang berbeda tersedia (misalnya ondemandsekarang tersedia).

Yang paling penting, setelah mengatur gubernur ke performance, kecepatan jam sekarang diperbaiki (dalam kasus saya ke 4.00GHz).

Anda dapat melihat /sys/devices/system/cpu/cpu*/cpufreq/scaling_driveruntuk menentukan apakah pstate atau ACPI digunakan untuk menskalakan CPU. File-file ini dapat mengasumsikan nilai acpi-cpufreqatau intel_pstate.

Edd Barrett
sumber
Trik lain: gunakan ´lsmod´ untuk mendaftar modul yang dimuat oleh kernel, blacklist setiap modul yang terkait dengan penskalaan kecepatan CPU / p-state / c-state / apa pun dan reboot mesin. Cari "modul kernel daftar hitam".
Rufo El Magufo
4

Untuk prosesor Intel kontemporer, frekuensi dikontrol oleh prosesor itu sendiri dan status-P yang terpapar pada perangkat lunak terkait dengan tingkat kinerja. Gagasan bahwa frekuensi dapat diatur ke frekuensi tunggal adalah fiksi untuk prosesor Intel Core . Bahkan jika driver penskalaan memilih status P tunggal, frekuensi aktual prosesor akan berjalan dipilih oleh prosesor itu sendiri. [1]

[1] https://www.kernel.org/doc/Documentation/cpu-freq/intel-pstate.txt

SaveTheRbtz
sumber
Menarik. Jadi, apakah ini masih berlaku ketika saya beralih intel_pstate=disableke kernel? Apakah saya menggunakan `" mode lama "ketika saya melakukan itu?
Edd Barrett
1) tidak yakin. perlu berkonsultasi dengan Intel Architectures Software Developer's Manual.2) ya. PS. Anda mungkin juga ingin bermain denganx86_energy_perf_policy
SaveTheRbtz
Terima kasih atas komentar anda Karena saya masih ragu, saya membiarkan pertanyaan terbuka untuk saat ini. Mungkin seseorang akan menjelaskan situasinya nanti.
Edd Barrett
-1

saya membaca utas ini karena saya terlalu mencari untuk menetapkan frekuensi tetap ke cpu saya karena kipas tidak bekerja lagi (tentu saja hal-hal itu terjadi ketika Anda di luar negeri di pulau yang hilang untuk rekreasi menyelam!) jadi maksud saya lebih untuk mengatur frekuensi terendah (800Mhz) ..saya akhirnya berhasil membuat perubahan ke scaling_max_freq di / sys / devices / system / cpu / cpu * / cpufreq / untuk setiap cpu dari konfigurasi & sekarang tidak apa-apa frekuensinya seharusnya berpindah dari 800Mhz untuk .... 800Mhz. Ini bekerja dan memecahkan masalah overheating yang saya punya pengalaman .. (frekuensinya sekarang 799Mhz dan tidak bergerak yang memungkinkan cpu tetap sekitar 50 ° C!)

PS: saya juga menonaktifkan mode turbo (3,1Ghz)

steve.29
sumber