bộ nhớ được sử dụng bởi Khóa


9

Tôi hơi tò mò, một trong những phiên bản SQL 2012 dành cho doanh nghiệp với 128 GB dung lượng RAM của cơ sở dữ liệu là 370 GB và đang tăng lên, dung lượng bộ nhớ được sử dụng bởi các nhân viên khóa (OBargetSTORE_LOCK_Manager) hiển thị 7466016 KB. Tôi cũng có thể xác nhận rằng bằng cách nhìn vào quầy hoàn hảoselect * from sys.dm_os_performance_counters where counter_name = 'Lock Memory (KB)'

Tuy nhiên, khi tôi chạy truy vấn

select count(*) from sys.dm_tran_locks

Nó chỉ hiển thị 16 ổ khóa. Vì vậy, những gì đang sử dụng hơn 7 GB ổ khóa. Có cách nào để tìm ra?

Điều đó có nghĩa là nếu một khi bộ nhớ cho các khóa đã được cấp phát thì SQL vẫn chưa được giải phóng nó? Trong 1 giờ qua tôi không thấy số lượng khóa vượt quá 500 nhưng bộ nhớ khóa vẫn giữ nguyên.

EDIT: Bộ nhớ máy chủ tối đa là 106 GB, Chúng tôi không sử dụng các trang khóa trong bộ nhớ và tôi không thấy bất kỳ áp lực bộ nhớ hoặc bất kỳ lỗi nào trong nhật ký lỗi trong 12 giờ qua. Avialble MBytes couter hiển thị hơn 15 GB bộ nhớ khả dụng.

EDIT 2 Trình giám sát hoạt động luôn hiển thị 0 nhiệm vụ chờ nên rõ ràng là không chặn.

Xem xét khóa máy chủ SQL mất khoảng 100 byte bộ nhớ 7 GB là rất nhiều bộ nhớ và cố gắng tìm ra ai đang sử dụng nó.

EDIT 3: Tôi chạy một bảng điều khiển máy chủ báo cáo giao dịch hàng đầu bằng số đếm khóa cho biết "hiện tại không có giao dịch khóa nào đang chạy trên hệ thống. Tuy nhiên, bộ nhớ khóa vẫn hiển thị như đã nêu ở trên. DB bận nhất trong giờ qua đêm.


Tôi sẽ đề nghị nhìn vào system_health cũng như RING_BUFFERS để xem điều gì đang xảy ra
Kin Shah

Câu trả lời:


8

Người quản lý khóa là một con đường như vậy siêu nóng quan trọng mã (có lẽ là những nóng đường dẫn mã quan trọng nhất) mà nó nếu nó sẽ phải chờ đợi vào một phân bổ bộ nhớ cho mỗi hoạt động khóa sẽ bể. Nó có thể phân bổ các khối bộ nhớ lớn và tự quản lý chúng. Tôi sẽ không ngạc nhiên nếu nó cũng dự trữ bộ nhớ để nó không hết bộ nhớ trong một số đường dẫn mã quan trọng.


Xin lưu ý, tôi không biết ai khác trong diễn đàn này biết C ++ của SQL Server tốt như bạn. Vì vậy, cung cấp cho bạn một lợi ích của sự nghi ngờ. :-)
Người học SQL

6

Phụ lục cho câu trả lời của @ RemusRusanu (sẽ không phù hợp với nhận xét) ...

Cho rằng công cụ cơ sở dữ liệu sẽ cho phép tối đa 5000 khóa cho mỗi đối tượng trước khi leo thang và tính đến câu trả lời của Remus liên quan đến bản chất quan trọng của trình quản lý khóa, mức bảo lưu cao bắt đầu có vẻ hợp lý:

5000 (khóa) * 10 (bảng hoặc chỉ mục) * 96 (byte mỗi khóa) * 1000 (truy vấn đồng thời) = 4,47GB

Tôi sẽ suy đoán việc đặt chỗ bắt nguồn từ sự kết hợp giữa RAM có sẵn và khối lượng công việc hiện tại nhưng chưa thấy nó được ghi lại hoặc viết blog về bất cứ nơi nào. Cũng có thể suy đoán rằng bộ nhớ 128GB của bạn sẽ được coi là hào phóng trong năm 2008 và việc đặt trước 7GB là dấu hiệu cho thấy khối lượng công việc OLTP nặng ở kích thước đó.


1
Kích thước cơ sở dữ liệu dự kiến ​​là 1,5 TB vào cuối năm nay. Nó đã hoạt động được vài tuần. Tính toán của bạn có ý nghĩa
Người học SQL

2

sys.dm_tran_lock hiển thị các tài nguyên bị khóa và yêu cầu khóa đối với các tài nguyên , không phải các hàng riêng lẻ, đã bị khóa. Mỗi tài nguyên bị khóa sẽ giữ nhiều hàng và, có thể, các đối tượng khác, bị khóa.

Trả về thông tin về tài nguyên quản lý khóa hiện đang hoạt động. Mỗi hàng đại diện cho một yêu cầu hiện đang hoạt động cho người quản lý khóa cho một khóa đã được cấp hoặc đang chờ để được cấp.

Các cột trong tập kết quả được chia thành hai nhóm chính: tài nguyên và yêu cầu. Nhóm tài nguyên mô tả tài nguyên mà yêu cầu khóa được thực hiện và nhóm yêu cầu mô tả yêu cầu khóa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.