sql kinerja server concurrency

8

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:

  1. 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.

  2. 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?


sumber
1
Apa lagi yang terjadi di server? Apakah ini SQL Server khusus? 7 GB tidak bagus, tapi saya pernah melihat yang lebih buruk.
Thomas Stringer

Jawaban:

6

Pilihan Anda untuk memiliki gambaran situasi yang baik ketika semuanya merangkak:

  • gunakan jejak sisi server untuk melihat sesi terpanjang dan paling berat
  • gunakan prosedur Who is Activeimpan oleh Adam Machanic - untuk menyimpan informasi saat server dimuat - skrip gratis yang fantastis
  • gunakan Activity Monitor dari Management Studio hanya untuk mendapatkan pandangan visual (CPU dan IO adalah yang menurut saya paling berguna) - alat yang cukup bagus termasuk dalam Management Studio
  • gunakan alat gratis pihak ke-3 - Confio Ignite Free - itu sangat bagus untuk saat-saat ketika semuanya lambat dan perlu melihat detail tentang statistik tunggu, pemblokiran, dll. - Alat gratis yang fantastis
  • periksa statistik agar terkini
  • periksa apakah indeks terfragmentasi dan, jika demikian, defrag mereka
  • ikuti saran lain untuk memeriksa indeks yang hilang, desain
  • periksa kemungkinan menggunakan tingkat isolasi snapshot dalam database Anda (Anda memiliki pemblokiran tinggi sehingga ada baiknya untuk melihat apakah Anda benar-benar membutuhkan tingkat isolasi Anda saat ini)

Dan semoga berhasil menyelidiki masalahnya :-).

Marian
sumber
5

Masalah Anda kemungkinan besar adalah kinerja kueri yang disebabkan oleh

  • desain yang buruk
  • pengindeksan buruk

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

gbn
sumber
4

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!

Robert Miller
sumber
3
  1. Dalam expirience saya, kami memiliki MS SQL Server 2000 dengan 2 cpu dan lebih dari 30 sesi aktif dan lebih dari 1000 transaksi. Sulit ke server, tetapi berhasil.
  2. Saya tidak yakin kunci menggunakan lebih banyak CPU. Kunci dan penggunaan CPU, menurut saya, adalah dua masalah kinerja yang berbeda.

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.

Alex_L
sumber
3

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.

Richard
sumber