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-info
output 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.
cpufreq-info
di OS host, mungkin akan mengeluh bahwa tidak ada driver yang tersedia.cpufreq-info
tidak mengeluh dan mengeluarkan informasi yang benar, sehingga CPU didukung penuh (tentu saja dengan cara!). Driver yang digunakan adalah powernow-k8 yang juga logis.Jawaban:
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_threshold
yang 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.local
di 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):
Jika Anda tidak memiliki salah satu TSC modern ini, Anda harus:
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=enable
atauclocksource=hpet
pada 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:
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.
sumber
Bukan tamu yang memicu kelas atas - tuan rumah harus melakukan ini. Jadi, Anda harus menurunkan level pemicu yang sesuai pada host.
sumber
sudo bash -c "echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold"
Sumber: ivanlam.info/blog/2012/04/26/…cpuspeed
berada 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.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
sumber