Kami memiliki SQL Server 2008 R2 (10.50.1600) yang berjalan di server virtual Windows 2008 R2. Setelah memutakhirkan CPU dari 1 inti ke 4 dan RAM dari 4 gb ke 10 gb, kami perhatikan kinerjanya lebih buruk.
Beberapa pengamatan yang saya lihat:
- Kueri yang membutuhkan waktu <5 detik untuk dijalankan sekarang membutuhkan waktu> 200 detik.
- CPU dipatok pada 100 dengan sqlservr.exe sebagai biang keladinya.
- Hitungan pilih (*) pada tabel dengan 4,6 juta baris membutuhkan waktu lebih dari 90 detik.
- Proses yang berjalan di server belum berubah. Satu-satunya perubahan adalah meningkatkan cpu dan ram.
- Sql server lain memiliki file paging statis di mana server ini diatur untuk mengelolanya sendiri.
Adakah yang pernah mengalami masalah ini sebelumnya?
Per sp_BlitzErik, saya berlari
EXEC dbo.sp_BlitzFirst @SinceStartup = 1;
Memberi saya hasil ini.
Jawaban:
Ada banyak hal yang terjadi di sini, dan sebagian besar sangat luas dan tidak jelas.
2008R2 RTM keluar pada 21 April 2010. Ini benar-benar di luar dukungan. Anda akan ingin memprioritaskan mendapatkan Paket Layanan terbaru, yang keluar sekitar 3 tahun yang lalu. Dengan begitu Anda akan dilindungi jika Anda menabrak bug aneh atau sesuatu. Buka di sini untuk mencari tahu apa yang perlu Anda unduh.
Karena Anda menambahkan vCPU (dari 1 ke 4) dan tidak mengubah pengaturan apa pun, kueri Anda sekarang dapat berjalan paralel. Saya tahu ini terdengar seperti mereka semua akan lebih cepat, tapi tunggu dulu!
Anda mungkin telah menambahkan RAM, tetapi Anda mungkin belum mengubah Memori Server Maks sehingga server Anda dapat memanfaatkannya.
Cari tahu apa yang menunggu server Anda. Proyek open source yang saya kerjakan menyediakan skrip gratis untuk membantu Anda mengukur SQL Server Anda. Kepala di sini jika Anda ingin mencoba mereka.
Anda akan ingin mengambil sp_BlitzFirst untuk memeriksa statistik tunggu server Anda. Anda dapat menjalankannya dengan beberapa cara.
Ini akan menunjukkan kepada Anda apa yang server Anda sudah tunggu sejak dimulai.
EXEC dbo.sp_BlitzFirst @SinceStartup = 1;
Ini akan menunjukkan kepada Anda pertanyaan apa yang sedang menunggu sekarang, selama jendela 30 detik.
EXEC dbo.sp_BlitzFirst @Seconds = 30, @ExpertMode = 1;
Setelah Anda mengetahui pertanyaan apa yang menunggu (ada banyak hal yang ditulis tentang statistik menunggu di luar sana), Anda dapat mulai membuat perubahan untuk mengendalikan keadaan.
Jika Anda melihat mereka menunggu
CXPACKET
, itu berarti pertanyaan Anda berjalan paralel, dan mungkin saling menginjak. Jika Anda menekan ini, Anda mungkin ingin mempertimbangkan untuk menabrak Ambang Batas Biaya untuk Paralelisme hingga 50, dan mungkin menurunkan MAXDOP menjadi 2.Setelah langkah ini adalah ketika Anda ingin menggunakan sesuatu seperti sp_WhoIsActive atau sp_BlitzWho (yang terakhir ada di repo GitHub dari sebelumnya) untuk mulai mengambil rencana kueri. Selain dari statistik menunggu, mereka adalah salah satu hal paling penting yang dapat Anda lihat untuk mencari tahu apa yang salah.
Anda mungkin juga ingin memeriksa artikel ini oleh Jonathan Kehayias tentang Penghitung VMWare untuk memeriksa sehubungan dengan SQL Server.
Memperbarui
Meninjau statistik tunggu dan bocah itu aneh. Pasti ada sesuatu dengan CPU. Server Anda kebanyakan duduk bosan, tetapi ketika segalanya memanas, segalanya menjadi buruk. Saya akan mencoba memecah ini dengan mudah.
Anda memukul menunggu racun disebut
THREADPOOL
. Anda tidak memiliki banyak, tetapi itu masuk akal karena server Anda tidak terlalu aktif. Saya akan menjelaskan mengapa sebentar lagi.Anda memiliki rata-rata lama menunggu
SOS_SCHEDULER_YIELD
danCXPACKET
. Anda menggunakan VM, jadi Anda ingin memastikan bahwa SQL Server memiliki reservasi, atau bahwa kotak itu tidak terlalu langganan. Tetangga yang berisik benar-benar dapat merusak hari Anda di sini. Anda juga akan ingin memastikan bahwa server / VM guest / VM host tidak berjalan dalam mode Balanced Power. Ini membuat CPU Anda berputar ke kecepatan rendah yang tidak perlu, dan mereka tidak segera kembali ke kecepatan penuh.Bagaimana mereka mengikat? Dengan 4 CPU Anda memiliki 512 utas pekerja. Perlu diingat, Anda memiliki jumlah yang sama dengan satu CPU, tetapi sekarang setelah kueri Anda bisa paralel, mereka dapat mengkonsumsi lebih banyak utas pekerja. Dalam kasus Anda 4 utas per cabang paralel dari permintaan paralel.
Apa yang terjadi paralel? Kemungkinan besar semuanya. Ambang Batas Biaya default untuk Paralelisme adalah 5. Angka itu dijadikan default pada akhir 90-an yang bekerja pada desktop yang terlihat seperti ini .
Memang, perangkat keras Anda lebih kecil dari kebanyakan laptop, tetapi Anda masih sedikit di depan hal itu.
Ketika banyak pertanyaan paralel berjalan, Anda kehabisan utas pekerja tersebut. Ketika itu terjadi, pertanyaan hanya duduk menunggu thread untuk pergi. Di situlah juga
SOS_SCHEDULER_YIELD
masuk. Kueri sedang melangkah keluar dari CPU dan tidak kembali untuk waktu yang lama. Saya tidak melihat menunggu pemblokiran, jadi Anda kemungkinan besar hanya semua diisi pada paralelisme intra-query menunggu.Apa yang bisa kau lakukan?
sp_BlitzIndex
untuk mencari permintaan indeks yang hilang.Untuk pemecahan masalah yang lebih menyeluruh, lihat whitepaper yang saya tulis untuk Google tentang ukuran perangkat keras di cloud.
Semoga ini membantu!
sumber
Iya nih! Saya sudah mengalami situasi semacam ini pada SQL Server vms di server kami. Lihatlah waktu siap CPU tuan rumah vm dan penghitung driver balon memori. CPU SIAP WAKTU - BLOG BAGIAN I dan Memahami VMware Ballooning Bekerja dengan sysadmin saya adalah kuncinya, tetapi tidak mudah ...
sumber
Satu hal yang saya tidak tunjukkan menunjukkan, bahwa menambahkan vCPU ke VM sering dapat memperlambatnya karena penjadwalan.
Ide dasarnya adalah jika VM memiliki 4 vCPU, maka hypervisor harus menunggu hingga 4 core fisik tersedia sehingga dapat menjadwalkan semua vCPU, bahkan jika 3 dari mereka idle.
Jika Anda tidak memiliki banyak core di host Anda, dan beban kerja Anda yang lain sedang sibuk, ini dapat mengakibatkan menunggu ekstra, dan penurunan kinerja yang signifikan.
Dalam VMware ESXi Anda dapat melihatnya di grafik lanjutan melalui CPU Ready.
Inilah salah satu dari banyak artikel dengan contoh dunia nyata dari kejadian ini dan bagaimana ia didiagnosis .
Menambahkan lebih banyak RAM juga dapat menyebabkan penurunan kinerja tiba-tiba jika alokasi RAM VM lebih besar dari simpul NUMA.
Selain itu, konfigurasi vCPU Anda (vSockets vs. vCores) sebenarnya dapat memengaruhi beberapa aplikasi seperti SQL server. Ini karena SQL server itu sendiri sadar NUMA (untuk menghindari jenis penurunan kinerja spanning NUMA yang sama) dan karena VMware dapat menghadirkan node NUMA virtual secara berbeda.
Ini tercakup dalam posting blog di situs VMware sendiri .
Makhluk ini berkata, saya senang Anda menyelesaikan masalah dengan bantuan Erik, tetapi Anda mungkin ingin melihat dan mempertimbangkan hal-hal ini juga.
sumber
Hanya sedikit bantuan (tidak dapat memposting ini sebagai komentar) melanjutkan jawaban @ sp_BlitzErik, saya mendapat beberapa pertanyaan dengan Pinal dan Max Vernon (tidak dapat mengingat di mana) yang mengatakan berapa banyak MAXDOP yang harus Anda gunakan:
-------------------------------------------------- -------
sumber
MAXDOP = 2
yang sejalan dengan @sp_BlitzErik. Terima kasih!