Kami telah mengalami beberapa masalah kinerja di lingkungan produksi kami.
kami menemukan bahwa ketika sesi aktif naik di atas 25, penggunaan CPU mencapai 100% dan butuh waktu lama untuk turun.
Lingkungan yang kita miliki:
Produk Microsoft SQL Server Enterprise Edition 9.3 (sp2)
CPU 2 (Xeon 2.13)
Memori 7G
snapshot detail sesi1
Sesi Aktif 25
Transaksi Aktif 496
Sesi Idle 289
Transaksi yang Diblokir 29
cuplikan detail sesi2
Sesi Aktif 59
Transaksi Aktif 885
Sesi Idle 267
Transaksi yang Diblokir 49
Saya ingin tahu:
apakah 2CPU dapat menangani 25 sesi aktif (500 transaksi aktif) dengan baik. PS: kami telah menguji bahwa tanpa permintaan konkurensi, satu transaksi, yang membaca / menulis 5 tabel, membutuhkan waktu sekitar 1 detik di tingkat aplikasi.
apakah transaksi yang diblokir membutuhkan lebih banyak penggunaan CPU. PS: transaksi yang diblokir terutama karena kunci pada 2 tabel.
apa solusinya: Tambahkan CPU? atau aplikasi tuning (java / hibernate) untuk mempersingkat transaksi ini dan mengurangi blok di atas meja?
Jawaban:
Pilihan Anda untuk memiliki gambaran situasi yang baik ketika semuanya merangkak:
Dan semoga berhasil menyelidiki masalahnya :-).
sumber
Masalah Anda kemungkinan besar adalah kinerja kueri yang disebabkan oleh
Kunci / pemblokiran berasal dari pengindeksan yang buruk karena semua waktu yang dihabiskan memindai tabel ujung ke ujung. CPU tidak relevan di sini.
Sebagai perbaikan cepat, periksa indeks yang hilang menggunakan informasi dalam artikel ini: http://blogs.msdn.com/b/bartd/archive/2007/07/19/are-you-using-sql-s-missing- index-dmvs.aspx
sumber
Saya setuju dengan GBN dan Marian.
Untuk menjawab pertanyaan Anda mengenai 2-CPU yang menangani 25 permintaan: Saya memiliki sistem 2-CPU yang mendukung sekitar 750 koneksi pengguna dan rata-rata berjalan dari 4K Permintaan Batch per detik. Beberapa item penting bagi saya: Desain, Manajemen, dan Tuning. Jika Anda mulai dengan desain aplikasi dan basis data yang buruk maka Anda akan gagal memuat (pikirkan penskalaan).
CPU tinggi dapat menunjukkan tekanan memori. Anda menyebutkan hanya ada 7GB memori yang tersedia untuk SQL Server. Jika Anda memiliki indeks berkinerja buruk (Terlalu banyak indeks, indeks salah, atau tidak ada indeks) maka ini akan menyebabkan sistem untuk halaman lebih banyak dari database ke dalam memori untuk berbagai permintaan lalu jika ada indeks yang sesuai. Saya akan mengingatkan untuk membuat indeks pembuatan hog-wild karena yang salah juga akan merugikan Anda karena masing-masing memiliki potensi untuk memerlukan pembaruan selama operasi pembaruan baris (Buat-Perbarui-Hapus).
Juga, menggunakan Indeks Hilang DMV memerlukan menggunakan apa yang Anda ketahui tentang aplikasi dan database Anda dan tidak hanya menerapkan setiap indeks yang direkomendasikan. Saya akan memeriksa entri blog Kimberly Tripp tentang indeks di sini . Setelah bagian Indeks, melihat kategori lain mungkin membantu situasi Anda.
Jika pembaruan Java / Hibernate Anda dari 5 tabel dalam satu transaksi melakukan pembaruan melalui beberapa round-trip ke database, maka Anda membiarkan diri Anda terbuka untuk pertengkaran (permintaan CRUD Diblokir). Masalah bertambah buruk jika aplikasi tidak dapat kembali ke database tepat waktu. Saat berada di aplikasi, transaksi aktif terkait dapat memblokir permintaan lain dari pemrosesan dan menyebabkan batas waktu permintaan.
Tambahkan dua masalah di atas bersama-sama dan Anda mulai memiliki kasus sakit kepala kinerja yang buruk.
Mengurangi jumlah perjalanan pulang-pergi basis data dalam konteks satu transaksi akan menjadi hal yang sangat baik untuk dikejar. Mungkin prosedur tersimpan akan membantu.
Sisanya akan membutuhkan pekerjaan untuk mendapatkan skala aplikasi Anda. Anda mungkin juga mempertimbangkan memori, tetapi itu harus terjadi setelah desain dan tinjauan kinerja dilakukan dan perubahan yang diperlukan diimplementasikan sebagai penambahan memori segera akan menutupi masalah Anda.
Ikuti sepenuhnya saran yang telah diuraikan Marian.
Saya akan mengatakan Anda telah menemukan diri Anda tantangan yang luar biasa dan berharap Anda sukses besar!
sumber
Adapun solusinya, pertama Anda harus yakin bahwa masalah utama Anda adalah CPU. Cobalah membaca masalah ini untuk menemukan sumber masalah Anda dan untuk mendapatkan solusi yang tepat. Finnaly, jika Anda bisa melakukan transaksi sekecil mungkin - lakukanlah.
sumber
Pikiran pertama saya adalah mengurangi jumlah transaksi dan mengurangi jumlah pemblokiran. Bisakah Anda memecah beberapa transaksi menjadi beberapa bit? Bisakah Anda menarik beberapa pertanyaan dari transaksi? Seperti yang disebutkan Alex_l - transaksi sekecil mungkin ideal di sini.
Saya setuju dengan gbn, menambahkan indeks juga mungkin membantu.
Pikiran lain adalah bahwa saya juga akan melihat kunci Anda. Apakah Anda mengeluarkan kunci tingkat meja ketika Anda hanya memperbarui satu baris? Anda mungkin mempertimbangkan menyarankan kunci tingkat baris ke SQL Server. Itu akan memecahkan banyak masalah. (Memang, jika Anda punya 5 tabel, itu mungkin tidak terjadi, tetapi hanya pemikiran.)
Akhirnya, saya akan melihat tabel Anda yang Anda gunakan. Jika semua orang memblokir pada tabel tertentu, dapatkah Anda memindahkan logika untuk tabel itu ke akhir transaksi Anda? Jika Anda bisa mengurangi waktu Anda memegang kunci di meja permintaan tinggi itu, itu bisa membantu.
sumber