Host CPU tidak mengukur frekuensi ketika tamu KVM membutuhkannya

8

Pengamatan:
Saya memiliki server HP dengan CPU dual core AMD (Turion II Neo N40L) yang dapat menskalakan frekuensi dari 800 hingga 1500 MHz. Penskalaan frekuensi bekerja di bawah FreeBSD 9 dan di bawah Ubuntu 12.04 dengan kernel Linux 3.5. Namun, ketika saya meletakkan FreeBSD 9 di lingkungan KVM di atas Ubuntu, penskalaan frekuensi tidak berfungsi. Tamu (dengan demikian FreeBSD) tidak mendeteksi frekuensi minimum dan maksimum dan karenanya tidak skala apa pun ketika pekerjaan CPU semakin tinggi. Pada host (dengan demikian Ubuntu) proses KVM menggunakan antara 80 dan 140% dari sumber daya CPU tetapi tidak ada penskalaan frekuensi yang terjadi, frekuensinya tetap pada 800 MHz, meskipun ketika saya menjalankan proses lain pada kotak Ubuntu yang sama, gubernur ondemand dengan cepat skala frekuensi hingga 1500 MHz!

Kekhawatiran dan pertanyaan:
Saya tidak mengerti bagaimana CPU mungkin divirtualisasi, dan jika terserah kepada tamu untuk melakukan penskalaan yang tepat. Apakah ini memerlukan beberapa fitur CPU agar dapat diakses oleh tamu agar ini berfungsi?

Apendix:
The berikut Red Hat rilis catatan cenderung untuk menyarankan skala frekuensi yang keluar untuk bekerja bahkan dalam lingkungan tervirtualisasi (lihat bab 6.2.2 dan 6.2.3), pikir catatan gagal ke alamat mana teknologi virtualisasi pekerjaan ini dengan (KVM, Xen , dll?)

Sebagai informasi, cpufreq-infooutput pada Ubuntu adalah:

$ cpufreq-info
cpufrequtils 007: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to [email protected], please.
analyzing CPU 0:
  driver: powernow-k8
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 8.0 us.
  hardware limits: 800 MHz - 1.50 GHz
  available frequency steps: 1.50 GHz, 1.30 GHz, 1000 MHz, 800 MHz
  available cpufreq governors: conservative, ondemand, userspace, powersave, performance
  current policy: frequency should be within 800 MHz and 1.50 GHz.
                  The governor "ondemand" may decide which speed to use
                  within this range.
  current CPU frequency is 800 MHz.
  cpufreq stats: 1.50 GHz:14.79%, 1.30 GHz:1.07%, 1000 MHz:0.71%, 800 MHz:83.43%  (277433)
analyzing CPU 1:
  driver: powernow-k8
  CPUs which run at the same hardware frequency: 1
  CPUs which need to have their frequency coordinated by software: 1
  maximum transition latency: 8.0 us.
  hardware limits: 800 MHz - 1.50 GHz
  available frequency steps: 1.50 GHz, 1.30 GHz, 1000 MHz, 800 MHz
  available cpufreq governors: conservative, ondemand, userspace, powersave, performance
  current policy: frequency should be within 800 MHz and 1.50 GHz.
                  The governor "ondemand" may decide which speed to use
                  within this range.
  current CPU frequency is 800 MHz.
  cpufreq stats: 1.50 GHz:14.56%, 1.30 GHz:1.06%, 1000 MHz:0.79%, 800 MHz:83.59%  (384089)

Alasan saya ingin fitur ini bekerja adalah: hemat energi, jalankan lebih tenang (kurang panas) dan juga rasa ingin tahu yang sederhana untuk memahami dengan lebih baik mengapa ini tidak berfungsi dan bagaimana membuatnya bekerja.

Huygens
sumber
1
Microserver itu hanya mendukung Windows dan RHEL, lihat quickspecs.
berjalan cpufreq-infodi OS host, mungkin akan mengeluh bahwa tidak ada driver yang tersedia.
Chris S
Secara resmi mendukung Windows dan RHEL. Saya tidak bermaksud bahwa OS lain tidak akan berjalan di atasnya. Perhatikan bahwa penskalaan CPU berfungsi dengan baik di Ubuntu dan FreeBSD ketika diinstal pada bare metal (jadi tidak melalui virtualisasi). Selain itu, ketika diinstal pada bare metal kedua OS bekerja dengan sempurna, tidak ada driver yang hilang atau perilaku aneh. Akhirnya, cpufreq-infotidak mengeluh dan mengeluarkan informasi yang benar, sehingga CPU didukung penuh (tentu saja dengan cara!). Driver yang digunakan adalah powernow-k8 yang juga logis.
Huygens
@ Chris Saya telah menambahkan informasi cpufreq-info ke pertanyaan awal.
Huygens
Jika Anda benar-benar tidak perlu penskalaan frekuensi, Anda selalu dapat menonaktifkannya.
Michael Hampton

Jawaban:

10

Saya telah menemukan solusinya berkat tip yang diberikan oleh Nils dan artikel yang bagus .

Menyetel ondemand gubernur CPU DVFS

Gubernur ondemand memiliki satu set parameter untuk dikendalikan ketika menendang penskalaan frekuensi dinamis (atau DVFS untuk penskalaan tegangan dan penskalaan frekuensi). Parameter tersebut terletak di bawah pohon sysfs:/sys/devices/system/cpu/cpufreq/ondemand/

Salah satu parameter ini up_thresholdyang seperti namanya adalah ambang (unit adalah% dari CPU, saya belum tahu apakah ini per core atau core yang digabung) di atas mana gubernur ondemand menendang dan mulai mengubah frekuensi secara dinamis.

Untuk mengubahnya menjadi 50% (misalnya) menggunakan sudo sederhana:
sudo bash -c "echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold"

Jika Anda root, perintah yang lebih sederhana mungkin:
echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold

Catatan: perubahan itu akan hilang setelah host berikutnya reboot. Anda harus menambahkannya ke file konfigurasi yang dibaca saat boot, seperti /etc/init.d/rc.localdi Ubuntu.

Saya telah menemukan bahwa VM tamu saya, walaupun mengkonsumsi banyak CPU (80-140%) pada host mendistribusikan beban pada kedua core, jadi tidak ada satu inti pun di atas 95%, dengan demikian CPU, yang membuat saya kesal, adalah tinggal di 800 MHz. Sekarang dengan tambalan di atas, CPU secara dinamis mengubah frekuensinya per core lebih cepat, yang lebih sesuai dengan kebutuhan saya, 50% tampaknya merupakan ambang batas yang lebih baik untuk penggunaan tamu saya, jarak tempuh Anda mungkin bervariasi.

Secara opsional, verifikasi jika Anda menggunakan HPET

Ada kemungkinan bahwa beberapa yang berlaku yang menerapkan timer yang tidak benar mungkin terpengaruh oleh DVFS. Ini bisa menjadi masalah pada host dan / atau lingkungan tamu, meskipun host dapat memiliki beberapa algoritma berbelit-belit untuk mencoba meminimalkan ini. Namun, CPU modern memiliki TSC (Time Stamp Counter) yang lebih baru yang tidak tergantung pada frekuensi CPU / core saat ini, yaitu: konstan (constant_tsc), invarian (invariant_tsc) atau non-stop (nonstop_tsc), lihat artikel Chromium ini tentang sinkronisasi ulang TSC untuk informasi lebih lanjut tentang masing-masing. Jadi jika CPU Anda dilengkapi dengan salah satu TSC ini, Anda tidak perlu memaksakan HPET. Untuk memverifikasi apakah CPU host Anda mendukungnya, gunakan perintah yang sama (ubah parameter grep ke fitur CPU yang sesuai, di sini kami menguji TSC konstan):

$ grep constant_tsc /proc/cpuinfo

Jika Anda tidak memiliki salah satu TSC modern ini, Anda harus:

  1. HPET aktif, ini dijelaskan di sini setelah;
  2. Tidak menggunakan CPU DVFS jika Anda memiliki aplikasi apa pun di VM yang mengandalkan waktu yang tepat, yang direkomendasikan oleh Red Hat .

Solusi yang aman adalah mengaktifkan timer HPET (lihat di bawah untuk lebih jelasnya), mereka lebih lambat untuk query daripada TSC (TSC ada di CPU, vs HPET ada di motherboard) dan mungkin tidak memiliki ketepatan (HPET> 10MHz; TSC sering jam CPU maks) tetapi mereka jauh lebih dapat diandalkan terutama dalam konfigurasi DVFS di mana setiap inti dapat memiliki frekuensi yang berbeda. Linux cukup pintar untuk menggunakan timer terbaik yang tersedia, ia akan mengandalkan TSC terlebih dahulu, tetapi jika ternyata terlalu tidak dapat diandalkan, ia akan menggunakan HPET. Ini berfungsi baik pada sistem host (bare metal), tetapi karena tidak semua informasi diekspor dengan benar oleh hypervisor, ini lebih merupakan tantangan bagi VM tamu untuk mendeteksi TSC yang berperilaku buruk. Triknya adalah untuk memaksa menggunakan HPET di tamu, meskipun Anda akan memerlukan hypervisor untuk membuat sumber jam ini tersedia untuk para tamu!

Di bawah ini Anda dapat menemukan cara mengkonfigurasi dan / atau mengaktifkan HPET di Linux dan FreeBSD.

Konfigurasi HPET Linux

HPET, atau pengatur acara presisi tinggi, adalah pengatur waktu perangkat keras yang dapat Anda temukan di sebagian besar PC komoditas sejak 2005. Pengatur waktu ini dapat digunakan secara efisien oleh OS modern (kernel Linux mendukungnya sejak 2.6, dukungan stabil pada FreeBSD sejak 9.x terbaru) tetapi diperkenalkan pada 6.3 ) untuk memberikan pengaturan waktu yang konsisten untuk manajemen daya CPU. Hal ini memungkinkan untuk membangun implementasi scheduler-tick juga yang lebih mudah .

Pada dasarnya HPET seperti penghalang keamanan yang bahkan jika tuan rumah memiliki DVFS aktif, acara tuan rumah dan waktu tamu akan kurang terpengaruh.

Ada artikel bagus dari IBM tentang mengaktifkan HPET , artikel ini menjelaskan cara memverifikasi timer perangkat keras mana yang digunakan kernel Anda, dan mana yang tersedia. Saya berikan di sini ringkasan singkat:

Memeriksa timer perangkat keras yang tersedia:
cat /sys/devices/system/clocksource/clocksource0/available_clocksource

Memeriksa timer aktif saat ini:
cat /sys/devices/system/clocksource/clocksource0/current_clocksource

Cara yang lebih sederhana untuk memaksa penggunaan HPET jika tersedia, adalah memodifikasi bootloader Anda untuk meminta untuk mengaktifkannya (sejak kernel 2.6.16). Konfigurasi ini tergantung pada distribusi, jadi silakan merujuk ke dokumentasi distribusi Anda sendiri untuk mengaturnya dengan benar. Anda harus mengaktifkan hpet=enableatau clocksource=hpetpada baris boot kernel (ini lagi tergantung pada versi kernel atau distribusi, saya tidak menemukan informasi yang masuk akal).
Ini memastikan bahwa tamu menggunakan timer HPET.

Catatan: pada kernel 3.5 saya, Linux sepertinya mengambil secara otomatis hpet timer.

Konfigurasi HPET tamu FreeBSD

Pada FreeBSD orang dapat memeriksa timer mana yang tersedia dengan menjalankan:
sysctl kern.timecounter.choice

Penghitung waktu yang dipilih saat ini dapat diverifikasi dengan:
sysctl kern.timecounter.hardware

FreeBSD 9.1 tampaknya secara otomatis lebih suka HPET daripada penyedia timer lainnya.

Todo: cara memaksa HPET di FreeBSD.

Hypervisor ekspor HPET

KVM tampaknya mengekspor HPET secara otomatis ketika tuan rumah memiliki dukungan untuk itu. Namun, untuk tamu Linux mereka akan lebih suka jam yang diekspor secara otomatis lainnya yaitu kvm-jam (versi paravirtualised dari host TSC). Beberapa orang melaporkan masalah dengan jam pilihan, jarak tempuh Anda mungkin beragam. Jika Anda ingin memaksa HPET di tamu, lihat bagian di atas.

VirtualBox tidak mengekspor jam HPET ke tamu secara default, dan tidak ada opsi untuk melakukannya di GUI. Anda perlu menggunakan baris perintah dan memastikan VM dimatikan. perintahnya adalah:

./VBoxManage modifyvm "VM NAME" --hpet on

Jika tamu terus memilih sumber lain dari HPET setelah perubahan di atas, silakan merujuk ke bagian di atas bagaimana memaksa kernel untuk menggunakan jam HPET sebagai sumber.

Huygens
sumber
apakah ada aplikasi nyata untuk ini, atau itu hanya trik satu kali?
ewwhite
@white apa yang Anda maksud dengan trik satu kali? Temuannya adalah bahwa DVFS (penskalaan tegangan dan frekuensi) sebenarnya bekerja dengan KVM dan host Linux. Proses pemanfaatan CPU sebesar 80-140% mungkin didistribusikan pada kedua inti secara merata, sehingga tidak ada satu inti yang mencapai ambang standar 95% yang akan mengarah pada penskalaan frekuensi. Tanpa mengubah apa pun, jika saya benar-benar membuat proses utas tunggal yang menggunakan 100% dari satu inti dalam VM, maka penskalaan freq ditendang, jadi saya tidak melihatnya. Adapun aplikasi nyata dari DVFS, ini tentang penghematan daya dan penurunan suhu.
Huygens
@ewwhite Maksud Anda "apakah ada aplikasi yang menyetel nilai ini untuk saya?" Saya kira jawabannya adalah tidak. Kalau tidak, seseorang sudah akan memasukkan default yang masuk akal . 95 jelas tidak masuk akal di sini.
Michael Hampton
Tidak, apakah ada aplikasi (alasan) untuk ingin menggunakan ini dalam pengaturan tervirtualisasi?
ewwhite
Alasan: Saya tidak ingin CPU berjalan dengan kecepatan penuh karena beberapa alasan: konsumsi daya lebih tinggi, suhu lebih tinggi, lebih cepat aus, FAN berputar lebih cepat (lebih banyak daya dan lebih cepat memakai), membutuhkan baterai UPS yang lebih besar.
Huygens
4

Bukan tamu yang memicu kelas atas - tuan rumah harus melakukan ini. Jadi, Anda harus menurunkan level pemicu yang sesuai pada host.

Nils
sumber
Menarik, apakah Anda tahu cara melakukan ini?
Huygens
@ Huygens Biasanya ini dilakukan melalui semacam cpufrequency-daemon. Ada file konfigurasi untuk daemon di mana Anda dapat mengubah perilakunya dan nilai-nilai naik / turun. Tidak yakin di mana tepatnya ini berada di Ubuntu.
Nils
Anda menyelesaikannya, secara default (setidaknya pada Ubuntu) ambangnya adalah 95%, saya tidak yakin apakah itu per CPU. Dengan menurunkannya menjadi 50% saya memiliki perilaku yang diharapkan! Di Ubuntu Anda akan melakukannya seperti ini: sudo bash -c "echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold"Sumber: ivanlam.info/blog/2012/04/26/…
Huygens
1
@ Huygens Saya punya masalah ini pada CentOS - ada file config untuk cpuspeedberada di / etc / sysconfig / cpuspeed untuk membuat perubahan permanen. Dalam kasus saya, saya memiliki VBox-VM dengan hanya satu CPU (secara fisik dual-core). Saya harus menurunkan level menjadi 45% untuk mendapatkan efek kelas atas di VM.
Nils
2

pada host, cpu kvm terlihat seperti sebuah proses. Mekanisme penskalaan tidak mengawasi proses, hanya konsumsi CPU keseluruhan.

dan umumnya merupakan praktik terbaik untuk menonaktifkan scaling / throttling / etc saat menjalankan VMs

dyasny
sumber
Anehnya, ketika saya melakukan top pada host saya dapat melihat bahwa konsumsi CPU secara keseluruhan adalah sekitar 80-130%, (btw semua dikonsumsi oleh proses kvm dan ksm) tetapi tidak skala frekuensi. Ketika saya menjalankan proses lain yang menggunakan CPU, gubernur ondemand dengan cepat memulai! Satu-satunya perbedaan yang saya asumsikan adalah bahwa proses kvm menggunakan beberapa teknologi virtualisasi (AMD svm dalam kasus saya) yang dapat membuat gubernur host tidak bereaksi. Dan tamu tidak berhasil meminta hw yang mendasari untuk skala saya kira, meskipun pada bare metal berhasil.
Huygens
Bisakah Anda merujuk ke artikel yang merinci mengapa penskalaan frekuensi bukan praktik terbaik saat menjalankan VM? Saya ingin tahu mengapa. Red Hat tampaknya mendukung ini, lihat bab 6.2.4 (ada masalah dalam rilis lebih awal dari RHEL 5.3) access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/…
Huygens
Saya tidak memiliki artikel yang berguna, tetapi pikirkan tentang apa itu virtualisasi, dan bagaimana cara kerjanya. Anda berencana untuk menggunakan mesin yang kurang dimanfaatkan dengan memuatnya dengan VM. VM harus stabil dan dapat diprediksi. Apakah menurut Anda penyesuaian frekuensi CPU di bawah VM akan membantu? Dan berbicara tentang praktik terbaik, ubuntu sebagai tuan rumah bukan ide yang baik dalam pengalaman saya
dyasny
Anda dapat melakukan migrasi VM di antara host yang berbeda, terkadang frekuensinya berbeda. Hal yang harus stabil dalam hal ini adalah fitur yang diekspos oleh CPU dari host, sehingga jika SSE4 terbuka dan aplikasi Anda menggunakannya, setelah Anda bermigrasi ke CPU yang tidak mendukungnya, VM Anda tidak jatuh. Jadi penskalaan frekuensi, yang merupakan faktor besar dalam mengurangi konsumsi daya, seharusnya tidak menjadi masalah. Saya mencari di Google dan tidak menemukan artikel yang menyebutkan hal itu.
Huygens
1
Adapun distribusinya, saya menyebutkan Ubuntu bermasalah karena itu. Baik di SF dan situs lain, saya terus melihat orang-orang melaporkan masalah terkait KVM yang saya tidak pernah berhasil mereproduksi di Fedora atau RHEL. Jangan ragu untuk tidak setuju, saya tidak melanjutkan ke flamewar di sini.
dyasny