Berapa banyak CPU yang harus digunakan dengan Hyperthreading?


22

Katakanlah saya memiliki server cpu dengan 18 core, dengan hyperthreading aktif, yang berarti saya dapat melihat 36 CPU di htop.

Untuk sepenuhnya memanfaatkan CPU dan tidak memengaruhi kinerja single-thread, haruskah saya bertujuan agar 36 "core" berjalan pada 100%, dan core HT hanya akan bekerja lebih sedikit dan masih melaporkan 100%, atau akan berarti bahwa inti "penuh" sudah terganggu oleh tugas pada "inti HT" dan dengan demikian melakukan lebih sedikit pekerjaan single-threaded?

Saya sadar bahwa ada banyak variabel yang mempengaruhi kinerja HT, saya hanya ingin tahu apa arti cpu meter ketika berhadapan dengan HT.


6
Hyperthreading tidak benar-benar memberi Anda dua kali CPU. Pikirkan itu lebih seperti cpu membaca dalam dua program, dan setiap kali satu program akan melakukan sesuatu yang akan membutuhkan beberapa siklus, atau ketika tidak menggunakan semua sumber daya (adders, multipliers, loader, dll) itu akan beralih ke program lain sehingga dapat menggunakannya. Jadi melihat 100% di semua utas membutuhkan kebetulan yang menyenangkan dari program yang kompatibel yang berjalan pada sebuah inti.
simpleuser

4
Karena desain itu, hyperthreading bekerja dengan baik dengan beban kerja campuran. Misalnya, hypervisor di mana semua VM menjalankan layanan yang berbeda. Dalam skenario semacam itu, bahkan mungkin tidak perlu diuji. Untuk beban kerja yang lebih homogen, pengujian biasanya perlu dipastikan.
Michael Hampton

Jawaban:


14

Jika inti virtual kedua diizinkan untuk berkontribusi ketika yang pertama dinyatakan macet, itu lebih baik daripada tidak , sehingga Anda mendapatkan (setidaknya) sedikit pekerjaan tambahan.

Pertanyaannya menjadi: kapan memiliki dua utas yang berbeda menyebabkan satu berjalan lebih buruk? Prediksi cabang dan dependensi antara instruksi tidak akan berubah. Menunggu akses memori sekarang ... dua utas bersaing atas akses memori, baik dalam pemanfaatan cache dan bandwidth.

Jika Anda memiliki beberapa CPU yang berjalan dengan HT dan yang lainnya tidak, apakah itu juga berarti Anda akan menetapkan utas tertentu untuk satu jenis atau yang lain? Saya kira tidak: program Anda akan menjalankan utasnya pada inti virtual acak. Jadi, bagaimana memecah konfigurasi membantu? Karena setiap CPU memiliki cache sendiri, satu-satunya pengaruh adalah karena bandwidth memori dan beban koheransi cache.

Secara umum, Anda mencapai titik di mana memiliki sesuatu yang lebih banyak yang dapat Anda lakukan lebih mahal daripada membiarkan beberapa unit eksekusi CPU menganggur. Ini tidak tergantung pada jumlah utas secara langsung, tetapi pada apa yang dilakukan ulir , dan arsitektur memori terperinci dan nuansa kinerja dari berbagai komponen.

Tidak ada jawaban sederhana. Bahkan dengan program khusus dalam pikiran, mesin mungkin berbeda dari orang-orang yang menghubungkan pengalaman mereka sendiri.

Anda harus mencobanya sendiri dan mengukur apa yang tercepat, dengan pekerjaan spesifik pada mesin itu. Dan bahkan kemudian, itu dapat berubah dengan pembaruan perangkat lunak dan menggeser penggunaan dari waktu ke waktu.

Lihatlah volume 3 karya Anger's magnum opus . Jika Anda melihat dengan cermat pada beberapa prosesor tertentu, Anda dapat menemukan sumber daya yang membatasi di antara saluran dalam dari banyak langkah yang diperlukan untuk mengeksekusi kode. Anda perlu menemukan kasus di mana komitmen berlebihan menyebabkannya mengeksekusi lebih lambat, sebagai lawan dari tidak mengambil lebih banyak pekerjaan. Secara umum itu berarti semacam caching; dan di mana sumber daya dibagi di antara utas.


Apa yang dimaksud dengan meter CPU: ini melaporkan semua waktu yang tidak dihabiskan untuk menjalankan utas menganggur. Kedua utas logis yang ditugaskan ke inti tidak akan menganggur meskipun pekerjaan aktual yang dilakukan pada salah satu dari mereka mungkin kecil. Waktu yang dihabiskan dengan pipa macet selama beberapa siklus sampai hasilnya siap, memori diambil, operasi atom dipagari, dll. Juga tidak menyebabkan thread disimpan sebagai "tidak siap" sehingga tidak akan diam, dan waktu masih menunjukkan sedang digunakan. Menunggu RAM tidak akan ditampilkan sebagai siaga. Hanya sesuatu seperti I / O yang akan membuat thread thread dan berhenti mengisi waktu ke arahnya. Mutex sistem operasi secara umum akan melakukannya, tetapi dengan munculnya sistem multicore itu tidak lagi menjadi hal yang pasti, karena "spinlock" tidak akan membuat utas kembali ke rak.

Jadi, meteran CPU 100% tidak berarti semuanya lancar, jika CPU sering macet menunggu memori. Semakin sedikit inti logis yang menunjukkan 90% sangat mungkin menyelesaikan lebih banyak pekerjaan, karena selesai dengan angka-angka dan sekarang menunggu pada disk.

Jadi jangan khawatir tentang meteran CPU. Lihatlah kemajuan aktual yang dibuat, hanya .


23

Indikator CPU sangat buruk untuk memberi tahu Anda berapa banyak lagi kinerja yang dapat Anda peras keluar dari CPU yang mengalami hipertensi. Untuk itu, Anda harus menjalankan tolok ukur sendiri di berbagai tarif berlangganan fisik-inti. Ada beberapa beban kerja yang bekerja paling baik dengan HT yang sepenuhnya dimatikan, jadi sertakan juga kasing itu dalam pengujian Anda. Bisa jadi 1: 2 (36 pekerja paralel), atau 1: 1,5, atau bahkan 1: 2,5! Itu tergantung pada beban kerja Anda.

Secara lebih rinci, HT diimplementasikan pada silikon dengan cara yang mengurangi waktu yang dihabiskan prosesor saat konteks perlu diaktifkan atau prediksi cabang gagal. Ini membuatnya lebih mudah untuk mencapai penggunaan unit eksekusi 100% dibandingkan dengan trik sistem operasi murni. HT telah berevolusi sejak diperkenalkan, dan ada lebih banyak paralelisme pada chip modern daripada yang kami gunakan 10 tahun lalu.

Ada dua profil eksekusi yang akan memengaruhi titik langganan berlebih optimal Anda:

  • Durasi eksekusi yang panjang . Jika pekerja Anda menjalankan beberapa menit atau jam sebelum daur ulang, seperti pekerjaan rendering besar atau pemodelan lingkungan, Anda akan mendapatkan kinerja single-core yang lebih efisien per pekerja. Ini akan menurunkan rasio Anda.
  • Durasi eksekusi singkat . Jika pekerja Anda berputar dalam hitungan detik atau menit kecil, seperti utas aplikasi web, overhead yang terlibat dalam menyalakan proses baru berarti rasio Anda akan lebih tinggi.

Menit kecil? Maksudmu, beberapa menit?
Ismael Miguel

Kurang lebih. 1 hingga 5 atau lebih. Pada 120 detik per pekerja dengan 18 pekerja, Anda membalikkan yang baru setiap 7 detik. Banyak yang turun ke cache lokasi.
sysadmin1138

1
Anda tidak mengerti .. Anda mengatakan "menit kecil" pada poin ke-2 Anda. Menit selalu memiliki "ukuran" yang sama, yaitu 60 detik. Terkadang 61 detik.
Ismael Miguel

4

Anda harus melihat semua 36 core berjalan pada 100% - dengan asumsi perangkat lunak dapat melakukan itu (yang tidak sepele - penjadwalan bisa rumit dengan banyak core, sehingga penurunan di bawah 100% dapat diterima).

Tentunya ketika Anda "membagi" bijih dengan hyperthreading, arti dari 200% itu bukan "2x100% - dalam pekerjaan yang dilakukan. Tapi ini tidak terlihat oleh pengukuran apa pun yang diambil (yang berasal dari pemanfaatan CPU dan tidak memiliki konsep pekerjaan yang dilakukan). Berapa banyak pekerjaan yang harus dilakukan tergantung pada apa pekerjaan itu - di suatu tempat di atas 1,5 x pekerjaan tanpa hyper threading diharapkan sebagian besar waktu.


3

Cara hyperthreading diterapkan bervariasi dengan CPU spesifik. Dari Nehalem ke Skylake, Intel secara signifikan mengurangi rasio tetap (yaitu: 50/50) bagian pipa bersama, menuju struktur yang dibagi secara dinamis.

Lagi pula, secara umum, mengaktifkan HT menyebabkan eksekusi single-thread lebih lambat, tetapi karena cara kerja penjadwal Linux, ini hanya terjadi ketika jumlah atau thread yang berjalan lebih tinggi dari jumlah core fisik. Seperti dalam situasi seperti itu (ketika threads> core) Anda biasanya menilai total throughput yang paling penting, hyperthreading tetap merupakan kemenangan bersih.

Bagaimana ini mungkin? Poin utama yang perlu dipahami adalah bahwa CPU tidak menampilkan core fisik dan virtual sebagai core yang sama, melainkan mengekspos yang terakhir dengan cara daripada penjadwal Linux dapat menghindari penjadwalan pada mereka jika ada core fisik lain yang tersedia. Dengan kata lain, pertama-tama menggunakan semua inti fisik, lalu mulai menggunakan yang virtual.

Ini berarti daripada, umumnya, HyperThreading adalah fitur yang sangat berharga (prosesor lain, seperti Power8, menggunakan teknik SMT lebih dalam) dan bahwa untuk memaksimalkan throughput Anda harus mengaktifkannya, memuat CPU dengan setidaknya satu utas per inti virtual atau fisik. Sebagai contoh praktis, untuk mengekstrak kinerja penuh dari CPU 18-inti, Anda harus menggunakan setidaknya 36 utas.

Ada dua pengecualian:

  1. jika yang Anda inginkan adalah meminimalkan latensi dari serangkaian utas terbatas (di mana utas <inti fisik), Anda dapat menonaktifkan HT
  2. CPU yang sangat lama (Pentium4 dan, dengan cara yang jauh lebih kecil, Nehalem) memiliki aturan partisi yang tidak fleksibel yang memaksa CPU untuk membagi banyak sumber daya utama pada rasio 50/50, terpisah dari status / beban thread kedua. Dalam hal ini, Anda harus melakukan tolok ukur use case Anda untuk memastikan bahwa throughput yang ditambahkan sebanding dengan kinerja single thread yang jauh lebih rendah.
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.