Tiêu thụ bộ nhớ SQL Server 2012 bên ngoài nhóm bộ đệm


9

Tôi đã có một phiên bản SQL Server 2012 SP2 Enterprise Edition tiêu thụ ~ 20GB bộ nhớ cao hơn mức tối đa. giới hạn bộ nhớ. Ví dụ được giới hạn ở 65GB nhưng bộ nhớ vật lý được sử dụng từ truy vấn bên dưới hiển thị 86GB

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

Máy chủ là vật lý với 2 nút NUMA. Có cách nào để tôi có thể tìm ra những gì đang tiêu thụ bộ nhớ ngoài vùng đệm (tôi cho rằng đó là những gì đang xảy ra)?

Đây là đầu ra của DBCC MEMORYSTATUS: -

đầu ra của DBCC MEMORYSTATUS

Và đây là giới hạn bộ nhớ đã đặt: -

ảnh chụp màn hình giới hạn bộ nhớ

Cảm ơn trước.

CẬP NHẬT: - Tôi đã chạy truy vấn mà Aaron đề xuất

SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC

Đây là đầu ra: -

Bộ nhớClerkOutput

SUM của trang_kb lên tới ~ 60GB

CẬP NHẬT 2: - Đầu ra đầy đủ của DBCC MEMORYSTATUS có tại đây: - http://pastebin.com/nGn6kXEc

CẬP NHẬT 3: - Đầu ra của tập lệnh Shanky trong tệp excel tại đây: - http://jmp.sh/LKRlH4K

CẬP NHẬT 4: - Ảnh chụp màn hình đầu ra của: -

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

Ảnh chụp màn hình PhysMemInUse

Vì vậy, điều này dường như chỉ ra rằng SQL Server đang sử dụng nhiều hơn bộ 65GB.


Điều này mang lại những gì? SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;?
Aaron Bertrand

Xin chào Aaron, cảm ơn bạn đã trả lời. Tôi sẽ cập nhật câu hỏi với đầu ra ngay bây giờ
dbafromthecold

Câu trả lời:


11

Max điều khiển bộ nhớ máy chủ đệm hồ bơi và tất cả các phân bổ kích thước trang, nhưng vẫn không kiểm soát những thứ như phân bổ của Windows trực tiếp (máy chủ liên kết, sp_OA, XPS), bộ nhớ cần thiết cho đề / ngăn xếp chủ đề, vv .

Bạn có thể có thể mong đợi mức này cao hơn trên NUMA (mặc dù tôi không chắc 20 GB là bình thường); vấn đề là, bạn không thể mong đợi bộ nhớ máy chủ tối đa kiểm soát hoàn toàn bộ nhớ được sử dụng bởi một phiên bản của SQL Server. Nếu bạn muốn toàn bộ cá thể (không chỉ nhóm bộ đệm, bộ đệm kế hoạch và CLR) sử dụng không quá 64GB, bạn nên đặt bộ nhớ máy chủ tối đa ở mức thấp hơn.

Một số ý tưởng tiềm năng để theo dõi điều này (tôi sẽ bình thường hóa mọi thứ thành MB):

  • quầy hiệu suất

    Xem nếu bất cứ điều gì nhảy ra ở đây là quá lớn:

    SELECT counter_name, instance_name, mb = cntr_value/1024.0
      FROM sys.dm_os_performance_counters 
      WHERE (counter_name = N'Cursor memory usage' and instance_name <> N'_Total')
      OR (instance_name = N'' AND counter_name IN 
           (N'Connection Memory (KB)', N'Granted Workspace Memory (KB)', 
            N'Lock Memory (KB)', N'Optimizer Memory (KB)', N'Stolen Server Memory (KB)', 
            N'Log Pool Memory (KB)', N'Free Memory (KB)')
      ) ORDER BY mb DESC;
    
  • 20 nhân viên hàng đầu

    Bạn đã làm điều này, nhưng cho đầy đủ:

    SELECT TOP (21) [type] = COALESCE([type],'Total'), 
      mb = SUM(pages_kb/1024.0)
    FROM sys.dm_os_memory_clerks
    GROUP BY GROUPING SETS((type),())
    ORDER BY mb DESC;
    
  • kích thước ngăn xếp chủ đề

    Trước tiên, hãy đảm bảo số này bằng 0 và không phải là một số tùy chỉnh (nếu không phải là 0, hãy tìm hiểu lý do và khắc phục nó):

    SELECT value_in_use
      FROM sys.configurations 
      WHERE name = N'max worker threads';
    

    Nhưng bạn cũng có thể thấy bao nhiêu bộ nhớ đang bị chiếm bởi các ngăn xếp luồng bằng cách sử dụng:

    SELECT stack_size_in_bytes/1024.0/1024 
      FROM sys.dm_os_sys_info;
    
  • Các mô-đun bên thứ 3 được tải

    SELECT base_address, description, name
      FROM sys.dm_os_loaded_modules 
      WHERE company NOT LIKE N'Microsoft%';
    
    -- you can probably trace down memory usage using the base_address
    
  • DMV liên quan đến bộ nhớ

    Bạn cũng có thể phát hiện ra điều gì đó khác thường khi nhìn vào các DMV này:

    SELECT * FROM sys.dm_os_sys_memory;
    SELECT * FROM sys.dm_os_memory_nodes WHERE memory_node_id <> 64;
    

Bài viết này được viết trước SQL Server 2012, vì vậy một số tên và tính toán cột có thể phải được điều chỉnh, nhưng cũng có thể cung cấp một số cách khác để thử:

Một số nền tảng tốt trong một bài viết khác trên trang web đó quá:

Một số thông tin tốt về các loại điều sử dụng bộ nhớ ngoài max server memory(nhưng không có dữ liệu tốt về cách thu thập mức sử dụng thực tế):


Cảm ơn Aaron, máy chủ có sẵn rất nhiều bộ nhớ, tôi chỉ muốn xem liệu tôi có thể tìm ra thứ gì đang sử dụng 20GB đó không. Có cách nào để xác định mức tiêu thụ bộ nhớ của Direct Windows Allocations hoặc Thread Stacks không?
dbafromthecold

Tôi đã chạy tập lệnh và bộ đếm Máy chủ bị đánh cắp (KB) ở mức 14 GB. Đi đào để xem liệu tôi có thể nhận thêm thông tin nào không
dbafromthecold

Bộ nhớ máy chủ bị đánh cắp dường như không phải là vấn đề. Vẫn đang tìm kiếm
dbafromthecold

Mặc dù không phải là vấn đề ở đây, nhưng điều đáng nói là Nhóm đối tượng Cột (CACHESTORE_COLUMNSTOREOB ProjectPOOL) nằm ngoài nhóm bộ đệm. Xem bài đăng trên blog này từ Niko Neugebauer
Blaž Dakskobler

@ BlažDakskobler vâng, cảm ơn, trong bộ nhớ cũng vậy. Tôi sẽ cập nhật bài viết khi có cơ hội
Aaron Bertrand

3

Tôi đã nhận được dưới đây định nghĩa từ Bob Dorr về những gì bộ nhớ máy chủ Max trong SQL Server 2012 kiểm soát. Bạn cũng có thể đọc Sách trực tuyến để biết thêm chi tiết

Bộ nhớ máy chủ tối đa kiểm soát cấp phát bộ nhớ SQL Server, bao gồm nhóm bộ đệm, bộ nhớ biên dịch, tất cả bộ nhớ cache, cấp bộ nhớ qe, bộ nhớ quản lý khóa và bộ nhớ CLR (về cơ bản là bất kỳ clerk nào được tìm thấy trong dm_os_memory_clerks). Bộ nhớ cho ngăn xếp luồng, đống bộ nhớ, nhà cung cấp máy chủ được liên kết khác với SQL Server hoặc bất kỳ bộ nhớ nào được cấp phát bởi một máy chủ không phải là SQL Server DLL DLL không được kiểm soát bởi bộ nhớ máy chủ tối đa.

Bộ nhớ được phân bổ cho ngăn xếp luồng, DLL của bên thứ ba, Nhà cung cấp máy chủ được liên kết khác với Microsoft (như MySQL.PostgreQuery, v.v.) hoặc bất kỳ DLL nào được tải trong không gian địa chỉ SQL Server không phải là SQL Server được cấp phát bên ngoài bộ nhớ máy chủ tối đa. Hoạt động sao lưu IIRC trong SQL Server 2012 vẫn được phân bổ bộ nhớ ngoài vùng đệm.

Bạn có đang sử dụng máy chủ được liên kết để truy vấn RDBMS khác không? Bất kỳ phần mềm nào khác được cài đặt trên cùng một máy Windows. Bạn có thể đăng trên một số vị trí được chia sẻ đầu ra của các truy vấn sau đây không

select type,
sum(pages_kb)/1024 as [Memory utilized in MB],
sum(awe_allocated_kb)/1024 as [Memory allocated though Windows API]
 from sys.dm_os_memory_clerks
 group by type
 order by [Memory utilized in MB] desc
 Go
-------

 select (virtual_address_space_committed_kb/1024) as virtual_address_space_committed_MB,
 (locked_page_allocations_kb/1024) locked_page_allocations_MB,
 (pages_kb/1024) [memory allocated MB]
  from sys.dm_os_memory_nodes
  Go
-------
SELECT SUM (pages_in_bytes)/1024 as 'KB Used', type 
FROM sys.dm_os_memory_objects
GROUP BY type 
ORDER BY 'KB Used' DESC;
GO
--------
select name,
type,
sum(pages_kb)/1024 as [Mem MB],
sum(entries_count) as [Total Entry count] from sys.dm_os_memory_cache_counters
group by
type, name
order by [Mem MB] desc
Go
-----
select * from sys.dm_os_loaded_modules where company <> 'Microsoft Corporation'
go

Bạn cũng có thể tải lên DBCC MMEMORYSTATUSđầu ra hoàn chỉnh trên một số vị trí được chia sẻ và đăng liên kết ở đây. Điều này sẽ giúp hiểu được thành phần nào đang chiếm bộ nhớ

Chỉnh sửa: Theo đầu ra bộ nhớ dbcc, tôi có thể thấy 2 nút NUMA và bộ nhớ được sử dụng bởi mỗi nút là xấp xỉ

Node 1 : VM Committed 33554380

Node 2: VM Committed  33554420

Total is approx 64 G. 

Một lần nữa nếu bạn thấy Trình quản lý bộ nhớ trong memorystatus xuất ra

Memory Manager                           KB
---------------------------------------- -----------
VM Reserved                              260726964
VM Committed                             **67108820**

VM commit thực sự là Bộ nhớ ảo được SQL Server cam kết và vì bộ nhớ này được cam kết nên nó có physical memory backing it. Điều này một lần nữa khiến tôi nghĩ rằng SQL Server đang sử dụng 65 G như được đặt trong bộ nhớ máy chủ tối đa

Đây là bộ nhớ máy chủ tối đa là gì. Vì vậy, bộ nhớ được phân phối tốt giữa cả hai nút, bạn cũng có thể thêm đầu ra của hàm truy vấn bên dưới để kiểm tra. Vui lòng thêm ảnh chụp màn hình

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

@DBAFromTheCold: Đã muộn nhưng bạn vẫn đang tìm kiếm câu trả lời, nếu có, tôi muốn thử thêm một lần nữa :) Bạn có thể đăng sản lượng hoàn chỉnh củaselect * from sys.dm_so_process_memory
Shanky

Xin chào Shanky, cảm ơn bạn đã phản hồi nhưng vấn đề đã tự giải quyết. Về phần tôi, SQL không phát hành bộ nhớ. Tôi đang theo dõi máy chủ và nếu nó xảy ra lần nữa, tôi sẽ đăng cập nhật. Thực sự muốn đi đến tận cùng của điều này.
dbafromthecold 2/03/2015
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.