ukuran beban cpu dengan hyperthreading di linux


12

Bagaimana saya bisa mendapatkan penggunaan CPU multi-core yang diaktifkan dengan benar?

Sebagai contoh mari kita pertimbangkan CPU 2 inti, yang mengekspresikan 4 inti virtual.

Sebuah beban kerja berulir tunggal sekarang akan muncul sebagai 100% top, karena satu inti dari virtual core sepenuhnya digunakan. CPU dan topbekerja seperti yang diharapkan, seperti akan ada 4 core nyata.

Namun dengan dua utas, semuanya menjadi arkward: Jika semua bekerja dengan baik, mereka seimbang dengan dua core nyata, jadi kami mendapat penggunaan 200%: Dua kali 100% dan dua core virtual idle, dan menggunakan semua daya CPU yang tersedia . Sepertinya saya baik-baik saja.

Namun, jika kedua utas tersebut akan berjalan pada satu inti nyata, mereka akan muncul dengan menggunakan dua kali 100%, yang menghasilkan 200% penggunaan inti virtual. Tetapi di sisi nyata, itu akan menjadi satu inti berbagi kekuatannya pada dua utas, yang kemudian hanya menggunakan setengah dari total daya CPU.

Jadi angka penggunaan yang ditunjukkan oleh toptidak dapat digunakan untuk mengukur total beban kerja CPU.

Saya juga bertanya-tanya bagaimana hyperthreading menyeimbangkan dua virtual pada inti nyata. Jika dua utas mengambil jumlah siklus yang berbeda, apakah inti virtual akan 'beradaptasi' sehingga keduanya menunjukkan beban 100% bahkan jika beban sebenarnya berbeda?


1
Anda mengerti sistem operator tidak menyadari perbedaan antara inti virtual hyperthreading dan inti fisik?
Ramhound

Sepertinya begitu, tetapi tidak harus? Pemetaan inti nyata vs virtual adalah pemetaan satu atau dua sederhana. Masalahnya adalah bagaimana mengukur beban pada inti virtual yang benar-benar mengubah kinerja yang tersedia dengan menjadwalkannya dengan yang lain pada inti yang sebenarnya. Tetapi semua data tersedia, saya pikir, pertanyaannya adalah di mana saja alat yang mendapatkan hasil yang tepat dari mereka?
dronus

1
Saya hanya ingin memiliki ukuran beban di mana 100% berarti bahwa setiap siklus dari setiap inti nyata digunakan.
dronus

1
Cukup diucapkan: Bagaimana cara memberi tahu pada saat tertentu, apakah CPU saya akan mampu melakukan pekerjaan lebih lanjut, tanpa memperlambat pekerjaan yang sedang berlangsung saat ini?
dronus

1
@Ramhound, jadi jika saya memiliki prosesor 4-core fisik dengan 8 core logis, dan rata-rata beban saya katakan 4,00, apakah saya menggunakan 100% atau 50%?
Buttle Butkus

Jawaban:


5

Martin Tegtmeier di Oracle telah menulis posting blog yang menarik tentang ini tahun lalu: https://blogs.oracle.com/solaris/cpu-utilization-of-multi-threaded-architectures-explained-v2

Jawaban singkatnya; Hyperthreading benar-benar mengacaukan kemampuan top untuk melaporkan persentase utilisasi CPU / idle secara keseluruhan.

Dalam kasus terburuk, CPU 2-core 4-virtual-core menjalankan 2 thread pada 100% -penggunaan-per-core, hampir bisa memenuhi jenuh cpu. (Tergantung pada penggunaan port eksekusi; hanya utas yang menggunakan sumber daya komputasi yang sepenuhnya berbeda pada cpu yang masih dapat berjalan tanpa mempengaruhi kinerja pada utas saat ini.) Namun, atas masih akan melaporkan 50% idle dalam kasus ini.



4

Pemanfaatan inti sangat berbeda dari beban pada sistem. Pemanfaatan inti hanya menunjukkan seberapa banyak inti menghitung sesuatu atau menunggu instruksi. Itu bisa 100% sesuai dengan waktu yang diberikan CPU menghitung sesuatu.

Tetapi beban adalah hal yang berbeda, beban umumnya diukur untuk menentukan apakah ada proses yang harus menunggu sumber daya atau tidak. Jika proses tidak menunggu sumber daya apa pun, Anda akan melihat sistem yang sangat performan. Tetapi kadang-kadang Anda akan melihat sistem lambat tetapi pemanfaatan CPU rendah. Itu umumnya berarti beberapa proses sedang menunggu sumber daya dan tidak melepaskan CPU. Untuk skenario seperti ini Anda tidak akan melihat pemanfaatan CPU yang tinggi tetapi sistem mungkin melebihi kapasitasnya.

Dalam sistem Linux, rata-rata beban adalah nilai yang dihitung untuk mengukur kinerja keseluruhan sistem. Nilai rata-rata beban harus dibandingkan dengan sumber daya komputasi paralel, core menjadi spesifik. Jadi jika sebuah sistem dengan 4 inti fisik memiliki rata-rata beban 4 atau lebih, kita dapat dengan aman mengatakan bahwa beberapa proses akan menunggu sumber daya.

Tidak penting jika utilisasi CPU 100 atau 10 persen. Rata-rata beban bisa setinggi 200 atau 300, dalam hal ini sistem akan hampir tidak responsif.

Dalam kondisi operasi normal, rata-rata beban server tidak boleh melebihi jumlah core untuk jangka waktu lama. Paku pendek tidak penting menurut saya. 3 angka yang akan Anda lihat dalam woutput adalah memuat av. selama 1/5/15 menit.


0

Menurut pendapat saya tidak ada jawaban di atas yang memuaskan.

Saya pikir artikel yang saya maksudkan pada tautan berikut ditargetkan dengan baik untuk menjawab pertanyaan ini: http://perfdynamics.blogspot.ch/2014/01/monitoring-cpu-utilization-under-hyper.html

MENGUTIP:

Gagasan di balik HT adalah untuk memungkinkan utas aplikasi yang berbeda dijalankan ketika aplikasi yang sedang berjalan terhenti; karena salah duga cabang, gelembung dalam pipa, dll. Untuk memungkinkan itu, harus ada port lain atau register AS. Register itu menjadi terlihat oleh OS ketika HT diaktifkan. Namun, OS (dan terus meningkatkan rantai makanan ke alat perf apa pun yang Anda gunakan) sekarang berpikir dua kali kapasitas prosesor tersedia, yaitu, 100% CPU di setiap port AS.

Tetapi di bawah tenda, masih ada hanya satu unit eksekusi: inti tunggal, fisik, Anda mulai dengan sebelum HT diaktifkan. Perbedaannya adalah bahwa itu dibagi dalam beberapa cara antara 2 port AS. Bagaimana single core ditukar antara dua port sangat rumit tetapi paling mudah dipahami dalam hal antrian yang disurvei. Saya masuk ke tingkat detail di kelas-kelas GCaP saya.

Pengukuran tes kasus terbaik yang saya miliki, menunjukkan bahwa setiap port HT tidak dapat menjadi lebih dari 75% sibuk, rata-rata, atau 150% dari total kapasitas yang diharapkan 200% sesuai dengan OS. Kapasitas "hilang" 50%, yang saya sebutkan sebelumnya, adalah ilusi. Intel telah mengklaim bahwa sesuatu dalam kisaran 120% hingga 130% dapat diharapkan untuk aplikasi umum.

Bahkan, saya cukup yakin sistem operasi dapat mencapai 100% pada setiap inti virtual, tidak diragukan lagi. Saya baru saja melakukan:

mvn clean install -DskipTests -T 5

Dan saya dapat meyakinkan Anda 8 core virtual saya, dan 4 core fisik semuanya menggunakan CPU 100%. Dan saya pasti tidak memiliki 8 core pada mesin saya.

Singkatnya, Anda dapat mengasumsikan berikut ini jika total beban CPU melebihi 100%, paling banyak, dan kemungkinan besar cukup akurat, menggunakan tepat 100% inti fisik. Itu menas, jika Anda memiliki CORE 1 fisik dibagi menjadi sistem operasi CPU 1 dan CPU 2. Dan pada CPU 1 Anda memiliki total penggunaan 50% dan pada CPU 2 Anda memiliki total penggunaan 50%, kemungkinan besar dalam kehidupan nyata Anda Menekan total penggunaan 100% pada CPU itu. Anda telah memaksimalkannya.

Tapi tentu saja sistem operasi dalam alat pemantauan sistemnya tidak tahu bahwa itu menjual Anda sebuah ilusi. Dari sudut pandang sistem operasi dan bagaimana ia mengelola sumber daya, ia hanya akan percaya bahwa masing-masing dari dua core virtual tersebut masih menganggur hingga 50 persen, jadi jika ada lebih banyak tugas yang harus dijalankan, ia akan mencoba untuk mendistribusikannya secara seragam melalui kedua core tersebut. . Jadi ketika Anda menggunakan lebih dari 100% pemanfaatan CPU, selama periode penggunaan CPU, selalu ada pekerjaan yang harus dijalankan dalam periode waktu yang tidak pernah mengalami perubahan untuk mendapatkan waktu sclice pada CPU. Akhirnya akan mendapatkannya, tetapi selalu ada beberapa utas yang sebenarnya tidak berjalan meskipun mereka dijadwalkan untuk berjalan.

Terima kasih

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.