MS SQL Server kami menggunakan sekitar 95% daya CPU.
Setelah server (perangkat keras) restart, atau SQL-Service restart, penggunaannya adalah 0% dan perlahan-lahan meningkat selama 1-3 hari. Tergantung berapa banyak yang digunakan.
Ketika lebih dari 80%, setiap permintaan sangat lambat.
Situs web kami berurusan dengan banyak pertanyaan besar, sehingga beberapa di antaranya memakan waktu 45-60 detik. Setelah restart (penggunaan CPU kurang dari 80%), dibutuhkan 11-20 detik untuk Permintaan yang sama.
Bagaimana saya bisa memperbaikinya? Saya telah membaca secara online bahwa masker afinitas dapat menyesuaikan penggunaan CPU, tetapi pengaturan Afinitas dinonaktifkan. Saya tidak bisa mengubahnya. Apakah ini karena saya hanya punya 1 prosesor?
Ada banyak trik yang harus dilakukan dengan kueri itu sendiri, tetapi situs web dan layanan kami cukup besar, dan ada terlalu banyak perubahan.
Kebanyakan dari mereka sudah dioptimalkan dengan cukup baik.
Saya tidak dapat terus me-restart SQL-Service, meskipun hanya membutuhkan waktu 2 detik, karena kami memiliki layanan alarm yang memungkinkan orang untuk memanggil dan merekam pesan, grup yang dipilih kemudian akan dipanggil dan mendengar pesan yang direkam.
Sistem ini digunakan oleh ratusan tim Pencarian dan Penyelamatan, dan jika SQL-Service restart selama alarm, itu akan berakhir dan orang yang memanggilnya tidak akan diberitahu.
Saya telah mencari di semua tempat, tetapi tidak menemukan apa pun kecuali hal-hal tentang "Masker Afinitas", yang tidak dapat saya ubah.
Pasti ada cara untuk menghapus cache CPU, tanpa menghentikan permintaan saat ini ... kan?
SQL: Microsoft SQL Server 11.0.2100.60
OS: Windows Server 2012 x64
Processor: 2.30 GHz
RAM: 4.00 GB
sumber
Jawaban:
Ini kemungkinan besar, tetapi Anda mungkin ingin melihat pengaturan parametrization yang dipaksakan. Jika Anda melihat sejumlah besar paket kueri saat kinerjanya buruk, kueri Anda tidak di-cache seperti yang Anda harapkan dan kueri membutuhkan waktu lama untuk memindai melalui cache untuk melihat apakah ada rencana yang sudah digunakan. Jika mengosongkan cache memecahkan masalah ini, Anda mungkin ingin melihat ke dalam mengubah pengaturan parameterisasi paksa. Anda dapat menghapus cache menggunakan:
Anda dapat memeriksa untuk melihat apa pengaturan parametrization paksa jika membersihkan cache bekerja dengan:
Ini mungkin diatur ke 0, default. Jika mereka mau, Anda dapat mengaturnya menjadi benar dengan melakukan:
Ini harus dilakukan di lingkungan pengembang terlebih dahulu dan lihat apakah ini berdampak negatif pada database dengan cara lain. Itu dapat dikembalikan menggunakan:
sumber
Afinitas tidak "menyesuaikan penggunaan CPU" (misalnya dalam kasus Anda membuat CPU melakukan lebih sedikit pekerjaan), itu memungkinkan Anda untuk mematikan CPU (mungkin untuk membuatnya tersedia untuk contoh lain pada mesin yang sama) atau mengatur CPU untuk bantuan dengan I / O saja. Bahkan jika Anda memiliki banyak CPU, Anda tidak akan dapat menggunakan yang pertama untuk membantu tujuan Anda, dan tidak mungkin bagi kami untuk menebak yang terakhir karena kami tidak tahu apa yang mendorong penggunaan CPU Anda begitu tinggi. Bisa jadi karena pengindeksan yang sangat buruk, kompilasi berlebihan, UDF skalar berlimpah, meronta-ronta I / O, siapa tahu? (Dan alasan I / O bisa menjadi penyebabnya adalah bahwa jika database Anda lebih besar dari 3 GB atau lebih, itu akan terus-menerus harus menukar data masuk dan keluar dari memori buffer pool, dan ini akan berdampak pada CPU.)
Cache CPU, juga, adalah lubang kelinci Anda tidak perlu turun. Saya sangat ragu CPU Anda meronta-ronta pada 95% karena masalah dengan cache CPU Anda.
Untuk membantu mempersempit sumber tekanan CPU, dan dengan asumsi Anda menggunakan prosedur tersimpan, Anda dapat melihat permintaan diagnostik ini dari Glenn Berry ( bersumber dari sini ) - pastikan Anda menjalankannya dalam konteks database yang tepat:
Jika Anda tidak menggunakan prosedur tersimpan, maka contoh dari John Samson ini dapat membantu mengisolasi kueri ad hoc ( bersumber dari sini ):
Anda juga dapat melihat sp_WhoIsActive Adam Machanic , prosedur tersimpan yang dapat dengan cepat menganalisis semua permintaan yang sedang berjalan, dan memungkinkan Anda untuk mengurutkannya sesuai keinginan Anda (misalnya dalam kasus Anda
@sort_order = '[CPU] DESC'
).Namun, hal pertama yang akan saya lakukan - terutama jika ini benar-benar penting untuk tim pencarian dan penyelamatan - adalah membeli perangkat keras yang lebih baik. Anda harus memiliki lebih banyak CPU dan lebih banyak RAM untuk melayani aplikasi Anda. Anda juga benar-benar membutuhkan ketersediaan tinggi yang lebih baik (mis. Pengelompokan, mirroring atau Ketersediaan Grup). Tidak ada alasan bahwa reboot mesin fisik harus membuat aplikasi Anda sepenuhnya offline - kami memiliki solusi yang lebih baik untuk masalah itu. Dan akhirnya, saya kira "server" ini hanya memiliki satu drive disk spinny. Ini berarti bahwa semua I / O - dari OS, dari file data SQL Server, file log, tempdb, dll. Semua melalui pengontrol tunggal dan berbagi aktivitas baca / tulis pada satu drive. Dapatkan lebih banyak disk. Dapatkan SSD jika / di mana Anda bisa. Gunakan RAID dan coba sebarkan I / O sebanyak mungkin.
Itu semua mengatakan, melempar perangkat keras pada masalah tidak akan menjadi satu-satunya bagian dari perbaikan. Anda perlu mengisolasi apa yang menyebabkan penggunaan CPU berlebih dan kemudian menyerang masalah-masalah itu tidak peduli perangkat keras apa yang Anda gunakan.
Lihat juga pertanyaan StackOverflow ini untuk beberapa ide lain:
/programming/945063/how-do-i-find-out-what-is-hammering-my-sql-server
sumber
Saran berikut adalah 'suntikan dalam gelap' karena saya tidak dapat melihat kode aktual.
Pertama adalah bahwa SP mungkin membuka kursor dan membiarkannya terbuka. Baca tentang Kursor, terutama Tutup dan Alokasikan. Seseorang mungkin menutup, tetapi tidak menghilangkan kursor. Perilaku mungkin telah berubah karena peningkatan, 2012 mungkin memperlakukan kursor sisa berbeda dari 2008 R2.
Kedua, mungkin ada kunci meja yang tidak dibersihkan. Sekali lagi, saya berada di kejauhan sehingga saya tidak bisa mengatakannya, tetapi itu akan menyarankan bahwa seseorang membuat tabel temp global setelah 'mulai transaksi', dan entah tidak ada 'transaksi akhir' dijalankan atau prosedur tersimpan gagal meninggalkan terkunci meja menempati ruang di tempdb.
Apakah Anda menggunakan WinLink? Sesuatu tentang hal ini terdengar agak asing.
sumber
Anda harus memiliki mekanisme caching di tempat seperti memcached untuk meningkatkan kinerja
sumber