Core CPU vs. virtualisasi

8

Kami memiliki sistem host KVM di Ubuntu 9.10 dengan CPU Xeon Quad-core yang lebih baru dengan hyperthreading. Seperti yang dijelaskan pada halaman produk Intel , prosesor memiliki 4 core tetapi 8 thread. / proc / cpuinfo dan htop daftar kedua prosesor 8, meskipun masing-masing menyatakan 4 core di cpuinfo. KVM / QEMU juga melaporkan 8 VCPU tersedia untuk ditugaskan kepada para tamu.

Pertanyaan saya adalah ketika saya mengalokasikan VCPU ke tamu VM, haruskah saya mengalokasikan per-inti atau per-utas? Karena KVM / QEMU melaporkan server memiliki 8 VCPU untuk dialokasikan, haruskah saya melanjutkan dan menetapkan tamu untuk menggunakan 4 CPU di mana saya sebelumnya akan mengaturnya untuk menggunakan 2 (dengan asumsi 4 total VCPU tersedia)? Saya ingin mendapatkan yang terbaik dari perangkat keras host tanpa mengalokasikan berlebihan.

Pembaruan: Jawaban Chopper3 tidak diragukan lagi pendekatan yang tepat. Namun, saya masih ingin mendengar dari pakar perangkat keras mana pun di luar sana yang dapat menjelaskan aspek kinerja utas vs. inti ... siapa saja?

nedm
sumber

Jawaban:

8

Tetapkan jumlah vCPU terendah yang dibutuhkan server Anda untuk menjalankan fungsinya, jangan mengalokasikan terlalu banyak atau Anda dapat dengan mudah memperlambat VM Anda.

Chopper3
sumber
1
Ini sepertinya pendekatan yang bijaksana. Namun, saya ingin tahu bagaimana mengalokasikan VCPU per utas daripada per inti mempengaruhi kinerja. Tetapi saya telah melihat beberapa hal yang sangat buruk yang dapat terjadi dari alokasi yang berlebihan, dan menggunakan jumlah VCPU yang sama seperti pada host yang tidak mengalami hipertensi tampaknya menangani beban yang cukup untuk para tamu, jadi saya akan pergi dengan cukup baik sendirian dan berencana untuk bereksperimen pada kotak non-produksi kapan-kapan.
nedm
1
+1, Jawabannya juga tergantung pada beban kerja Anda. Untuk VM yang sangat terikat dengan CPU, hitung sebagai mengambil seluruh inti, untuk VM yang menganggur atau IO terikat menghitungnya sebagai mengambil utas. Tetapi secara umum, selalu mengalokasikan sesedikit yang Anda bisa lolos dan Anda akan menghindari sakit kepala besar.
Chris S
1
Sementara saya setuju dengan pendekatan minimalis, KVM bukan VMWare dalam pengertian ini. Tidak ada penjadwalan geng berarti lebih banyak vCPU per VM dapat digunakan tanpa membahayakan
dyasny
5

Biasanya, HT berfungsi dengan baik pada beban kerja yang lebih berat pada IO - CPU dapat menjadwalkan lebih banyak tugas pemrosesan dari antrian CPU virtual lainnya sementara CPU virtual pertama menunggu di IO. Benar-benar semua subsistem HT mendapatkan Anda adalah peralihan konteks dipercepat perangkat keras - yang merupakan pola beban kerja yang juga digunakan saat beralih antar VM. Jadi, HT akan (biasanya) mengurangi sedikit perlambatan ketika Anda memiliki lebih banyak VM dan core, asalkan setiap VM mendapatkan satu inti virtual.

Menetapkan banyak vCPU ke VM dapat meningkatkan kinerja jika aplikasi dalam VM ditulis untuk threading, tetapi juga membuat hidup lebih sulit untuk hypervisor; ia harus mengalokasikan waktu pada 2 atau 4 CPU sekaligus - jadi jika Anda memiliki CPU quad-core dan quad-vCPU VM, hanya satu VM yang bisa dijadwalkan selama jangka waktu tersebut (sedangkan ia dapat menjalankan 4 VM single-vCPU yang berbeda sekaligus).

techieb0y
sumber
@ Chris, @ techieb0y: Terima kasih, ini adalah jenis wawasan yang saya cari.
nedm
Ini tidak sepenuhnya benar. Ketika seorang VM dengan quad vCPUs perlu menjadwalkan satu v-core, inilah yang dijadwalkan pada host, tidak semua 4 core. Setidaknya ini yang terjadi dengan KVM (saya tahu pendekatan vmware kurang efektif, karena mereka melakukan penjadwalan)
dyasny
5

Ini agak rumit. Bergantung pada bebannya, HT dapat meningkatkan kinerja hingga ~ 30% atau menguranginya. Biasanya saya menyarankan untuk tidak mengalokasikan lebih banyak vCPU daripada yang Anda miliki core fisik, untuk satu VM, tetapi jika VM agak menganggur (dan tentu saja, VM seperti itu tidak akan benar-benar memerlukan terlalu banyak CPU), dapat diberikan hingga sebagai banyak vCPU karena Anda memiliki utas. Anda tidak benar-benar ingin memberikan satu VM lebih banyak vCPU daripada inti yang dapat Anda jadwalkan . Dan dalam hal apa pun, saran @ Chopper3 benar - jangan beri VM lebih banyak v-CPU daripada yang diperlukan.

Jadi, tergantung pada seberapa banyak dan kritisnya VM Anda, Anda tidak melakukan keseluruhan sama sekali, tetap pada jumlah inti fisik, atau mencapai setinggi jumlah thread per VM.

Sekarang, memasuki pertanyaan HT, umumnya adalah hal yang baik untuk dimiliki, terutama ketika Anda melakukan lebih banyak vCPU ke VM Anda daripada Anda memiliki inti fisik atau bahkan utas, karena membuatnya lebih mudah bagi penjadwal Linux untuk menjadwalkan vCPU tersebut.

Satu hal terakhir, dengan kvm, vCPU yang ditetapkan untuk VM hanyalah sebuah proses pada host, yang dijadwalkan oleh penjadwal Linux, sehingga semua optimasi normal yang dapat Anda lakukan di sini dengan mudah berlaku. Selain itu, pengaturan inti / soket hanyalah cara proses ini akan ditampilkan untuk OS tamu VM, pada host itu masih hanya sebuah proses, terlepas dari bagaimana VM melihatnya.

dyasny
sumber
2

Saya pikir untuk menguraikan jawaban Chopper3: jika sistem sebagian besar cpu-idle, jangan menetapkan sekelompok vcpu, jika mereka cpu-intens, sangat berhati-hati untuk tidak melakukan penempatan keseluruhan. Anda harus dapat mengalokasikan total 8 vCPU tanpa pertengkaran. Anda dapat melakukan keseluruhan, tetapi jika Anda melakukannya, pastikan tidak ada tamu tunggal, terutama tamu yang menggunakan CPU intensif, memiliki 8 vcpu, atau Anda akan memiliki pendapat. Saya tidak tahu mekanisme penjadwal KVM lebih spesifik dari itu.

Di atas didasarkan pada pemahaman berikut tentang vCPU versus pinned CPU, tetapi juga asumsi bahwa KVM akan memungkinkan satu tamu (atau beberapa tamu) untuk memonopoli semua CPU yang sebenarnya dari orang lain jika Anda mengalokasikannya (/ mereka) cukup banyak utas. vCPU ~ host thread, guest CPU CPU = host Core, guest CPU (Belum bermain dengan vCPU campuran dan menyematkan CPU pada tamu yang sama, karena saya tidak memiliki Hyperthreading.)

Nakarti
sumber
1
vCPU yang disematkan hanyalah proses CPU virtual yang ditugaskan untuk berjalan hanya pada inti tertentu (atau subset inti). Jika Anda tidak melakukan penempatan keseluruhan dan ingin memastikan VM tidak bersaing untuk waktu CPU inti yang sama, Anda dapat menyematkannya ke inti yang berbeda. Ini juga merupakan cara untuk melakukan NUMA menyematkan, meskipun Anda dapat melakukannya secara langsung saat ini
dyasny