SQL Server 2008 R2 Tải xuống bộ nhớ ma Ghost?


12

Chúng tôi có một máy SQL Server 2008 R2 chuyên dụng đang gặp một số vấn đề về bộ nhớ lạ .. Bản thân máy có nhiều tài nguyên bao gồm hai bộ xử lý lõi tứ, RAM 16gb và Windows Server 2008 R2 Enterprise 64bit (đó là Dell PowerEdge 2950) .

Vấn đề kỳ lạ là hệ thống đang báo cáo 82% bộ nhớ đang sử dụng nhưng sqlservr.exe chỉ báo cáo 155mb khi sử dụng. Lý do mà tôi nghi ngờ SQL Server là vấn đề là vì nếu tôi khởi động lại quá trình sqlservr.exe, mức tiêu thụ bộ nhớ sẽ trở lại bình thường trong một khoảng thời gian.

Có ai có bất kỳ ý tưởng nào về cách tôi có thể bắt đầu theo dõi vấn đề này không?

Cảm ơn, Jason


3
Bạn đang sử dụng Khóa trang trong bộ nhớ người dùng phải không? Nếu vậy, bộ nhớ bị khóa sẽ không được báo cáo bởi người quản lý tác vụ. Xem blog.technet.com/b/askperf/archive/2008/03/25/ Khăn để biết thêm thông tin.
Đánh dấu S. Rasmussen

Chúng tôi có quyền Khóa trang trong Bộ nhớ người dùng được đặt thành "Không". Chúng tôi cũng có cài đặt "Bộ nhớ máy chủ tối đa (tính bằng MB)" trên int.MaxValue mặc định - bạn có nghĩ điều đó có thể gây ra sự cố không?
typefragger

4
Lần duy nhất tôi quan tâm là khi máy chủ sql của tôi sử dụng LESS hơn 82%!
SqlACID

Câu trả lời:


15

Bạn sẽ không có được hình ảnh chân thực về việc sử dụng bộ nhớ từ Trình quản lý tác vụ nếu tài khoản mà dịch vụ đang chạy có các trang khóa trong đặc quyền bộ nhớ (chỉnh sửa: theo nhận xét / liên kết của Mark Rasmussen). Để xác định dung lượng bộ nhớ đang được sử dụng, bạn có thể xem:

  • SQLServer: Trình quản lý bộ nhớ \ Tổng số bộ nhớ perfmon Bộ nhớ
  • DMV

Tôi không thể nhớ lại nếu có DMV hoặc sự kết hợp của nó sẽ cung cấp cho bạn tổng phân bổ bộ nhớ nhưng phần sau sẽ hiển thị phần lớn của nó.

SELECT TOP(10) [type] AS [Memory Clerk Type], SUM(single_pages_kb) AS [SPA Mem, Kb] 
FROM sys.dm_os_memory_clerks 
GROUP BY [type]  
ORDER BY SUM(single_pages_kb) DESC OPTION (RECOMPILE);

SELECT DB_NAME(database_id) AS [Database Name],
COUNT(*) * 8/1024.0 AS [Cached Size (MB)]
FROM sys.dm_os_buffer_descriptors
WHERE database_id > 4 -- system databases
AND database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id)
ORDER BY [Cached Size (MB)] DESC OPTION (RECOMPILE);

Thứ hai là thông thường thú vị nhất, phân bổ nhóm bộ đệm theo cơ sở dữ liệu. Đây là nơi chia sẻ sư tử sẽ được sử dụng và có thể hữu ích để hiểu cơ sở dữ liệu nào của bạn là người tiêu dùng lớn nhất.


Wow, cảm ơn bạn rất nhiều! Điều này (đặc biệt là cái thứ hai) đã làm cho nó hoàn toàn rõ ràng đối với tôi!
typefragger

8

Có một bài viết gần đây từ Brent Ozar của chúng tôi xử lý trường hợp này, khi Trình quản lý tác vụ không hiển thị chính xác bộ nhớ mà SQLServer ăn và các dịch vụ bổ sung của nó. Bạn có thể tìm thấy nó ở đây: Hướng dẫn về bộ nhớ máy chủ Microsoft SQL của Sysadmin .

Trích dẫn: " Tại sao SQLServer.exe không sử dụng nhiều bộ nhớ?

Khi bạn từ xa máy tính để bàn vào một máy chủ và nhìn vào Trình quản lý tác vụ, Sử dụng Mem của sqlservr.exe luôn có vẻ lập dị. Đó không phải là lỗi của SQL Server. Trình quản lý tác vụ là một kẻ nói dối bẩn thỉu, bẩn thỉu. . . Để thực sự có được một bức tranh chính xác về việc SQL Server đang sử dụng bao nhiêu bộ nhớ, bạn cần một công cụ như Process Explorer và bạn cần xác định tất cả các quy trình của SQL Server. Trong máy chủ tôi đang hiển thị ở bên phải, có hai phiên bản SQL Server (được hiển thị bởi sqlservr.exe), cộng với SQL Agent, SQL Browser và các công cụ sao lưu SQL Server. Cũng không có gì lạ khi thấy Dịch vụ phân tích máy chủ SQL, Dịch vụ tích hợp và Dịch vụ báo cáo cũng chạy trên cùng một máy chủ - tất cả đều tiêu thụ bộ nhớ.

Vậy SQL sử dụng bao nhiêu bộ nhớ? Tôi sẽ làm điều này dễ dàng cho bạn. SQL Server đang sử dụng tất cả bộ nhớ. Giai đoạn = Stage."

Vì vậy, tôi khuyên bạn nên thử truy vấn của Mark và sử dụng một công cụ tốt hơn cho báo cáo bộ nhớ. Hoặc chỉ cần tin tưởng Perfmon để báo cáo bộ nhớ, không phải Trình quản lý tác vụ.


-2

Lượng bộ nhớ được sử dụng bởi SQL, như được hiển thị trong trình quản lý tác vụ, chủ yếu sẽ là cài đặt bộ nhớ tối đa. Đây là cách cài đặt tối thiểu / tối đa hoạt động:

Khi máy chủ SQL khởi động, nó bắt đầu lấy bộ nhớ lên đến cài đặt bộ nhớ tối thiểu. Khi nhu cầu SQL của bạn tăng lên, SQL sẽ bắt đầu sử dụng nhiều bộ nhớ hơn cho đến cài đặt bộ nhớ tối đa. Bộ nhớ sau đó vẫn ở điểm (tối đa) này ngay cả khi việc sử dụng SQL không hoạt động. Điều này mang lại ấn tượng về việc SQL thực hiện các tác vụ lớn và sử dụng hết bộ nhớ đó. Trong thực tế, bộ nhớ này được bảo lưu bởi SQL.

Khi có áp lực bộ nhớ không phải SQL trên máy chủ, SQL sẽ giải phóng bộ nhớ xuống điểm cài đặt bộ nhớ tối thiểu. Đây là cách cài đặt bộ nhớ được sử dụng. Bạn có thể sử dụng các tập lệnh của Mark để xem SQL sử dụng bộ nhớ này như thế nào.


1
Min / max chi phối phân bổ nhóm bộ đệm, không có gì hơn. Đây là dòng đầu tiên trong phần mô tả Tùy chọn bộ nhớ máy chủ trong BOL. Các cài đặt hoàn toàn không liên quan đến cài đặt được hiển thị trong trình quản lý tác vụ. Mô tả của Brent về taskmgr là "kẻ nói dối bẩn thỉu, bẩn thỉu" tóm tắt tình hình cũng như bất kỳ điều gì tôi đã đọc.
Mark Storey-Smith

@ MarkStorey-Smith vui lòng đọc thêm nội dung trong liên kết trong bình luận của riêng bạn, nó chỉ giải thích thêm quan điểm của tôi. Trình quản lý tác vụ cho thấy việc sử dụng tài nguyên hệ thống. Vùng đệm không phải là tài nguyên hệ thống. Tôi đang giải thích về việc sử dụng bộ nhớ của SQL được hiển thị trong trình quản lý tác vụ. Bạn đang nói rõ ràng bằng cách đề cập đến nhóm bộ đệm, nhưng điều đó vẫn không chứng minh tôi sai.
StanleyJohns

Không chắc chắn làm thế nào tốt hơn để đặt cái này ... "Lượng bộ nhớ được sử dụng bởi SQL, như được hiển thị trong trình quản lý tác vụ, chủ yếu sẽ là cài đặt bộ nhớ tối đa. Đây là cách cài đặt tối thiểu / tối đa" .. không 't.
Mark Storey-Smith

'Đây là cách các cài đặt tối thiểu / tối đa hoạt động:' Có ​​dấu hai chấm ở cuối nghĩa là lời giải thích theo sau, không phải là nó khẳng định câu trước đó. :)
StanleyJohns

1
Tôi với Mark. Đọc blog Slava Oks : ông là thành viên của nhóm MS đã viết trình quản lý bộ nhớ. Đi đến tiêu đề "vùng đệm". Tôi trích dẫn "Hãy nhớ rằng SQL Server có hai cài đặt bộ nhớ mà bạn có thể kiểm soát bằng sp_conifigure. Chúng là bộ nhớ máy chủ tối đa và tối thiểu. Tôi không chắc nếu bạn biết nhưng hai cài đặt này thực sự kiểm soát kích thước của vùng đệm. Chúng không kiểm soát tổng thể dung lượng bộ nhớ vật lý được sử dụng bởi SQL Server "
gbn
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.