memori yang digunakan oleh Kunci

9

Saya agak penasaran, salah satu edisi SQL 2012 perusahaan dengan 128 GB ukuran RAM basis data adalah 370 GB dan terus bertambah, jumlah memori yang digunakan oleh kunci (OBJECTSTORE_LOCK_Manager) petugas memori menampilkan 7466016 KB. Saya juga bisa mengkonfirmasi dengan melihat counter perfselect * from sys.dm_os_performance_counters where counter_name = 'Lock Memory (KB)'

Namun, saat saya menjalankan kueri

select count(*) from sys.dm_tran_locks

ini hanya menampilkan 16 kunci. Jadi apa yang menggunakan kunci lebih dari 7 GB. Apakah ada cara untuk mengetahuinya?

Apakah itu berarti jika begitu memori untuk kunci telah dialokasikan, SQL belum membatalkan alokasi itu? Dalam 1 jam terakhir saya tidak melihat jumlah kunci melebihi 500 tetapi memori kunci tetap sama.

Max Server Memory adalah 106 GB, Kami tidak menggunakan halaman kunci dalam memori dan saya tidak melihat tekanan memori atau kesalahan dalam log kesalahan dalam 12 jam terakhir. Penghitung MBytes yang tersedia menunjukkan lebih dari 15 GB memori yang tersedia.

Monitor aktivitas secara konsisten menunjukkan 0 tugas tunggu sehingga jelas tidak ada pemblokiran.

Mengingat kunci server SQL membutuhkan sekitar 100 byte memori, 7 GB adalah banyak memori dan mencoba mencari tahu siapa yang menggunakannya.

Saya menjalankan papan dasbor server melaporkan transaksi teratas dengan jumlah kunci mengatakan "saat ini tidak ada transaksi penguncian yang berjalan pada sistem. Namun, memori kunci masih menunjukkan seperti yang dinyatakan di atas. DB paling sibuk selama jam semalam.

Pelajar SQL
sumber
Saya menyarankan melihat system_health serta RING_BUFFERS untuk melihat apa yang terjadi
Kin Shah

Jawaban:

8

Manajer kunci adalah super-panas jalur kritis kode tersebut (mungkin yang paling hot kode jalur kritis) bahwa jika harus menunggu pada alokasi memori untuk masing-masing kinerja kunci akan tangki. Mungkin mengalokasikan blok memori besar dan mengelola sendiri. Saya tidak akan terkejut jika itu juga cadangan memori sehingga tidak kehabisan memori di beberapa jalur kode kritis.

Remus Rusanu
sumber
Remus, saya tidak tahu siapa lagi di forum ini yang tahu sisi C ++ dari SQL Server sebaik Anda. Jadi memberi Anda manfaat keraguan. :-)
SQL Learner
7

Tambahan untuk jawaban @ RemusRusanu (tidak akan cocok dengan komentar) ...

Mengingat bahwa mesin basis data akan mengizinkan hingga 5.000 kunci per objek sebelum meningkatkan dan mempertimbangkan jawaban Remus mengenai sifat kritis manajer kunci, reservasi tinggi mulai terlihat masuk akal:

5000 (kunci) * 10 (tabel atau indeks) * 96 (byte per kunci) * 1000 (permintaan bersamaan) = 4.47GB

Saya akan berspekulasi reservasi berasal dari kombinasi RAM yang tersedia dan beban kerja saat ini tetapi belum melihatnya didokumentasikan atau di-blog di mana saja. Bisa juga berspekulasi bahwa memori 128GB Anda akan dianggap murah hati pada tahun 2008 dan reservasi 7GB menandakan mengharapkan beban kerja OLTP yang berat pada ukuran itu.

Mark Storey-Smith
sumber
1
Ukuran basis data diperkirakan 1,5 TB pada akhir tahun. Layanan ini baru beberapa minggu. Perhitungan Anda masuk akal.
SQL Learner
2

sys.dm_tran_lock menunjukkan sumber daya yang dikunci dan permintaan untuk kunci pada sumber daya , bukan baris individual, yang dikunci. Setiap sumber daya yang dikunci akan menampung banyak baris dan, mungkin, objek lain, terkunci.

Mengembalikan informasi tentang sumber daya manajer kunci yang aktif saat ini. Setiap baris mewakili permintaan yang saat ini aktif kepada manajer kunci untuk kunci yang telah diberikan atau sedang menunggu untuk dikabulkan.

Kolom di set hasil dibagi menjadi dua kelompok utama: sumber daya dan permintaan. Grup sumber daya menjelaskan sumber daya tempat permintaan kunci dibuat, dan grup permintaan menjelaskan permintaan kunci.

Stoleg
sumber