Kebijaksanaan terkini tentang SQL Server dan Hyperthreading?


7

Banyak artikel di luar sana (lihat artikel SQL 2000 asli Slava Oks dan pembaruan 2005 2005 Kevin Kline ) merekomendasikan untuk menonaktifkan hyperthreading pada server SQL, atau setidaknya menguji beban kerja spesifik Anda sebelum mengaktifkannya di server Anda.

Masalah ini secara berangsur-angsur menjadi kurang relevan karena prosesor multi-core yang sebenarnya menggantikan yang mengalami hyperthreaded, tetapi apa kebijakan saat ini tentang masalah ini? Apakah saran ini berubah dengan SQL 2005 64-bit, atau SQL 2008, atau Windows Server 2008?

Idealnya, ini harus diuji terlebih dahulu dalam lingkungan pementasan, tetapi bagaimana dengan server yang sudah membuatnya menjadi produksi dengan HT diaktifkan? Bagaimana saya bisa tahu jika masalah kinerja yang kita alami mungkin terkait dengan HT? Apakah ada beberapa kombinasi spesifik dari penghitung perfmon yang mungkin mengarahkan saya ke arah itu, yang bertentangan dengan semua hal lain yang biasanya saya kejar ketika bekerja untuk meningkatkan kinerja SQL?

Mengedit : Hal ini terutama menarik karena potensi untuk seluruh papan perbaikan untuk beberapa server high-cpu saya, tapi klien akan ingin melihat sesuatu yang konkret yang membantu saya mengidentifikasi server benar-benar bisa mendapatkan keuntungan dari menonaktifkan HyperThreading. Tentu saja, pemecahan masalah kinerja konvensional sedang berlangsung, tetapi kadang-kadang sedikit membantu.


"Prosesor multi-core menggantikan yang mengalami HyperThread". Whahuh CPU Multicore tidak menggantikan yang mengalami hyperthreaded, mereka memiliki beberapa core hyperthreaded.
warren

Jawaban:


16

Dalam SQLOS penjadwal dibuat untuk setiap prosesor logis yang dilihat oleh SQL Server. Dengan hyperthreading diaktifkan, ini sama dengan menggandakan penjadwal. Salah satu tujuan dari SQLOS adalah untuk meminimalkan dan mencegah terjadinya pergantian konteks, itulah sebabnya mengapa hanya satu penjadwal yang dibuat untuk setiap prosesor logis. Setelah SQLOS membuat penjadwal, jumlah total pekerja dibagi di antara penjadwal. SQLOS mengimplementasikan suatu bentuk penjadwalan kooperatif di mana pekerja menghasilkan penjadwal karena membutuhkan sumber daya yang tidak tersedia, atau mencapai kuantum eksekusi yang memungkinkan pekerja lain untuk mengeksekusi pada penjadwal. Ini membuat konteks beralih ke minimum karena penjadwal melakukan pekerjaan dan mereka terikat satu per satu.

Memahami latar belakang itu, hyperthreading agak bekerja berlawanan dengan bagaimana SQLOS dirancang khusus untuk berfungsi. Secara khusus, paralelisme dapat menjadi masalah dengan hyperthreading dan dapat mengakibatkan CXPACKET yang tinggi menunggu karena SQLOS dapat mencoba menjalankan kueri di DOP 8 tentang apa yang sebenarnya merupakan sistem DOP 4. Jika utilisasi CPU Anda rendah, Anda mungkin tidak memperhatikan, tetapi semakin tinggi utilisasi CPU Anda, semakin bermasalah. Baru-baru ini saya berdiskusi di twitter tentang hal ini, dan konsensusnya adalah "Itu Tergantung", apakah itu akan membantu atau tidak.

Jika Anda memiliki banyak sinyal yang menunggu di server Anda, tetapi Anda memiliki utilisasi CPU yang rendah, Anda mungkin melihat manfaat mengaktifkan hyperthreading yang akan menggandakan penjadwal internal Anda dan menyebarkan pekerja lebih banyak yang berarti mereka tidak akan menunggu untuk mengeksekusi dalam antrian runnable selama. Namun jika beban kerja Anda menggunakan paralelisme sangat banyak Anda mendapatkan CXPACKET yang lama menunggu di sys.dm_os_wait_stats, Anda mungkin melihat menonaktifkan hipertreading untuk melihat apakah itu mengurangi menunggu Anda.


Terima kasih atas detailnya. Saya menganggap DBCC SQLPERF ('WAITSTATS') harus memberi saya informasi yang setara tentang SQL 2000?
BradC

Iya. Itu betul.
Jonathan Kehayias

2

Sebenarnya hyperthreading belum hilang, chip quad-core Nehalem baru Intel mengalami hyperthreading. Seperti apakah itu direkomendasikan atau tidak, "itu tergantung" seperti biasa, setiap situasi kemungkinan berbeda.

Ini tidak mungkin HT adalah akar penyebab masalah kinerja, tetapi tanpa rincian lebih lanjut, sulit untuk mengatakan apa itu. Lakukan beberapa sesi perfmon, dengan laju sampel yang cukup lama, seperti sekali setiap 30-60 detik, dan mendapatkan CPU, panjang antrian disk pada data dan log disk, harapan usia halaman adalah ukuran yang baik apakah Anda memiliki cukup memori. Jika Anda secara konsisten lebih dari 80% CPU, atau Anda antrian disk di tiga digit, Anda menemukan masalah Anda.


1

SQL Server 2000 pada HP DL360 G3:

Saya menjalankan laporan enam kali dan saya membuang yang pertama dan mencatat lima terakhir. Saya kemudian reboot database lagi dan menyalakan kembali Hyperthreading. Saya menjalankan laporan itu enam kali lagi, menyimpan data dari lima putaran terakhir.

Pengamatan:

  • Mematikan Hyperthreading tidak membutuhkan biaya 2x dalam penggunaan CPU, hanya sekitar 1,5x.
  • Mematikan Hyperthreading membuat laporan jangka panjang acak berjalan 5,2% lebih cepat (rata-rata).

Laporan berulang:

Dengan Hyperthreading: 20,95%, 21,1%, 21,9%, 20,8%, 20,5%
Jalankan waktu dalam ms: 20282, 21141, 20188, 22297, 25282. Rata-rata 21838

Tanpa Hyperthreading: 29,4%, 28,2%, 29,1%, 28,2%, 27,1%
Jalankan kali dalam ms: 20125, 20156, 19937, 21656, 21656. Rata-rata 20706
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.