Máy chủ SQL không sử dụng tất cả bộ nhớ


10

Tôi có SQL Server 2014 với bộ nhớ tối đa được đặt thành 6GB (bộ nhớ vật lý là 8GB).

Các máy chủ mục tiêu Memory là đôi khi 6GB và sau đó giảm trở lại Tổng số máy chủ Memory (khoảng 5.3GB, không bao giờ đạt đến 6GB). Tôi đã từng committed_kb trong sys.dm_os_sys_info để kiểm tra bộ nhớ được sử dụng bởi SQL Server.

Khi tôi theo dõi sys.dm_os_buffer_descriptors , tôi thấy các trang đó bị xóa khỏi bộ đệm - nhưng vẫn còn 700 MB bộ nhớ. Nếu không có gì cần bộ nhớ, làm thế nào bạn giải thích được thực tế là các trang bị xóa khỏi bộ đệm? Tôi hy vọng rằng SQL Server chỉ xóa các trang khi nó cần bộ nhớ.

Các bảng tạm thời được phân bổ không phải là một vấn đề trên máy chủ này. PLE của tôi là 3632. Bộ đệm thủ tục là 2182 MB.

Tôi hy vọng rằng các trang sẽ chỉ bị hủy khi không còn bộ nhớ, nhưng tôi có 700 MB miễn phí hoặc tôi hiểu nhầm điều này?

Ai đó có thể vui lòng cố gắng để giải thích hành vi này?

SQL Server cũng đang đọc từ đĩa, vì vậy tôi nghĩ rằng tôi có thể kết luận rằng không phải tất cả các trang cần thiết đều nằm trong bộ nhớ.

Tôi đã thực hiện một số nghiên cứu thêm và tôi đã đọc một số lượng lớn các trang từ đĩa vào bộ nhớ và nhận thấy một cái gì đó trong taskmanager trong các lần đọc:

  • Bộ nhớ đang sử dụng tăng từ 7.0GB -> 7.2GB -> 7.0GB -> 7.2GB -> ...
  • Sqlservr.exe đã tăng từ 5,3 GB -> 5,5 GB -> 5,3 GB -> 5,5 GB -> ...

Giống như Windows không cho phép sqlservr.exe tăng lên 6GB.

Tôi đã chạy truy vấn được cung cấp bởi Shanky:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(Virtual_address_committed_kb/1024 )Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys. dm_os_process_memory

Điều này đã cho kết quả như sau:

Physical_Memory_usedby_Sqlserver_MB: 5247
Locked_pages_used_Sqlserver_MB: 0
Total_Memory_in_MB: 5625
process_physical_memory_low: 0
process_virtual_memory_low: 0

Điều tôi không hiểu là tại sao Total_Memory_in_MB không bằng 6144 (bộ nhớ tối đa)?

Trong sys.dm_os_ring_buffers tôi đã tìm thấy RESOURCE_MEMPHYSICAL_LOW, vì vậy tôi nghĩ Windows đã hết bộ nhớ và SQL Server phải trả về một số. Nhưng có khoảng 1GB bộ nhớ khả dụng => tại sao Windows lại nói rằng nó sắp hết bộ nhớ?

<Record id="13861" type="RING_BUFFER_RESOURCE_MONITOR" time="20635079241">   
   <ResourceMonitor>
        <Notification>RESOURCE_MEMPHYSICAL_LOW</Notification>
        <IndicatorsProcess>0</IndicatorsProcess>
        <IndicatorsSystem>2</IndicatorsSystem>
        <NodeId>0</NodeId>
        <Effect type="APPLY_LOWPM" state="EFFECT_OFF" reversed="0">0</Effect>
        <Effect type="APPLY_HIGHPM" state="EFFECT_IGNORE" reversed="0">85827186</Effect>
        <Effect type="REVERT_HIGHPM" state="EFFECT_OFF" reversed="0">0</Effect>   
   </ResourceMonitor>   
   <MemoryNode id="0">
        <TargetMemory>6050080</TargetMemory>
        <ReservedMemory>67208656</ReservedMemory>
        <CommittedMemory>5423548</CommittedMemory>
        <SharedMemory>0</SharedMemory>
        <AWEMemory>0</AWEMemory>
        <PagesMemory>4975656</PagesMemory>   
   </MemoryNode>   
   <MemoryRecord>
        <MemoryUtilization>100</MemoryUtilization>
        <TotalPhysicalMemory>8387608</TotalPhysicalMemory>
        <AvailablePhysicalMemory>1048452</AvailablePhysicalMemory>
        <TotalPageFile>11142348</TotalPageFile>
        <AvailablePageFile>2887916</AvailablePageFile>
        <TotalVirtualAddressSpace>137438953344</TotalVirtualAddressSpace>
        <AvailableVirtualAddressSpace>137371168056</AvailableVirtualAddressSpace>
        <AvailableExtendedVirtualAddressSpace>0</AvailableExtendedVirtualAddressSpace
   </MemoryRecord> 
</Record>

Cập nhật
Sau một số nghiên cứu thêm tại sao luôn có sẵn bộ nhớ 1GB, tôi nghĩ rằng tôi đã tìm thấy thứ gì đó.
Có thể SQL Server chỉ có thể phân bổ bộ nhớ trống và bộ nhớ khả dụng bị bỏ qua? Khi chạy Process Explorer (Sysiternals) tôi thấy bộ nhớ trống là 0.

Câu trả lời:


3

Để bắt đầu, tôi phải nói rằng bạn đã đặt bộ nhớ máy chủ tối đa thành 6 GB và tổng bộ nhớ là 8 GB, do đó, bạn chỉ còn lại 2 GB cho HĐH, trong nhiều trường hợp, ngay cả khi không có gì được cài đặt ngoài SQL Server trên máy Windows , là quá ít bộ nhớ cung cấp cho hệ điều hành. Để hoạt động chính xác, trên hệ thống được cài đặt phần mềm chống vi-rút, HĐH phải được cung cấp ít nhất 4 GB. Tôi để lại 2GB cho hệ điều hành ngay lập tức và 1,5 G cho AV.

Bộ nhớ máy chủ mục tiêu đôi khi là 6GB và sau đó giảm xuống Tổng bộ nhớ máy chủ (khoảng 5,3GB, không bao giờ đạt tới 6GB).

Bộ nhớ máy chủ đích biểu thị số lượng bộ nhớ được SQL Server yêu cầu để hoạt động đúng trong trường hợp lý tưởng. Bộ nhớ máy chủ mục tiêu đang cố gắng là 6 GB vì bạn đã đặt giá trị bộ nhớ máy chủ tối đa thành 6 GB. Nó đang cố gắng tiêu thụ tất cả bộ nhớ mà nó được phép.

Tổng bộ nhớ máy chủ là những gì SQL Server thực sự có thể tiêu thụ ngay bây giờ. Đây là bộ nhớ cam kết và được hỗ trợ bởi RAM vật lý. Đây là tối đa 5,5 GB trong trường hợp của bạn.

SQL Server đang cố gắng tăng mức tiêu thụ bộ nhớ nhưng sau khi đạt 5,3 hoặc 5,5 GB, HĐH đang yêu cầu SQL Server không tăng mức tiêu thụ bộ nhớ nữa và có thể thực sự gắn cờ thông báo bộ nhớ thấp. Điều này đang xảy ra vì HĐH có thể phải đối mặt với bộ nhớ thấp như đã nói ở trên. SQLOS đáp ứng nếu HĐH Windows đối mặt với áp lực bộ nhớ bằng cách yêu cầu bộ nhớ đệm giảm bớt mức tiêu thụ. Bạn có thể Truy vấn Bộ đệm vòng để kiểm tra xem có thông báo bộ nhớ thấp không. Tôi phải thêm DMV sys.dm_os_ring_buffer không có giấy tờ nhưng an toàn.

Tôi thấy rằng các trang được loại bỏ khỏi bộ đệm - nhưng vẫn còn 700 MB bộ nhớ. Nếu không có gì cần bộ nhớ, làm thế nào bạn giải thích được thực tế là các trang bị xóa khỏi bộ đệm? Tôi hy vọng rằng SQL Server chỉ xóa các trang khi nó cần bộ nhớ.

Nếu bạn đang tìm kiếm bộ nhớ trống, tôi sẽ không đề nghị bạn xem DMV sys.dm_os_buffer_descriptors . Bộ đếm hệ điều hành Available Mbytes sẽ cho bạn biết dung lượng bộ nhớ vật lý, tính bằng byte, có sẵn cho các tiến trình đang chạy trên máy tính. Tôi đề nghị bạn cũng nên xem Phương pháp xác định để đánh giá kích thước vùng đệm hợp lý là gì? và cũng đọc SQL Server có cần thêm RAM để tìm hiểu xem SQL Server cần bao nhiêu RAM không và SQL Server có phải đối mặt với áp lực bộ nhớ không. Từ những gì bạn đã đề cập, nếu bạn chắc chắn các trang đang bị xóa khỏi nhóm bộ đệm thì có SQL Server cảm thấy rằng các trang phải được di chuyển vì nó cần không gian để chứa các trang mới. Tôi không chắc cách bạn tính 700 MB miễn phí.

Một điều khác, xin vui lòng không nhìn vào Trình quản lý tác vụ để tiêu thụ bộ nhớ SQL Server. Nó không phải luôn luôn cung cấp cho bạn các giá trị chính xác đặc biệt là khi các tài khoản SQL Server service có trang khóa trong bộ nhớ đặc quyền. Trong trường hợp của bạn, ngay cả khi SQL Server có bộ nhớ máy chủ tối đa 6 GB, hệ điều hành chỉ được cung cấp 2 GB, điều này buộc SQL Server không tăng mức tiêu thụ vì 2 GB thấp đối với SQL Server. Có gì khác ngoài SQL Server đang chạy trên hệ thống không?

Nếu bạn muốn tính mức tiêu thụ bộ nhớ SQL Server, vui lòng sử dụng:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 ) Locked_pages_used_Sqlserver_MB,
(virtual_address_space_committed_kb/1024 ) Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys.dm_os_process_memory

Điều tôi không hiểu là tại sao Total_Memory_in_MB không bằng 6144 (bộ nhớ tối đa).

Cột Total_Memory_in_MB biểu thị tổng bộ nhớ được sử dụng bởi SQL Server (tệp trang RAM +). RAM thực sự là bộ nhớ vật lý được sử dụng hoặc bộ nhớ cam kết. Một phần của quy trình SQL Server cũng được phân trang vào đĩa và được coi là bộ nhớ ảo hoặc tệp trang và do đó, nếu bạn sẽ thấy TOTAL bộ nhớ được sử dụng bởi SQL Server, đó sẽ là tổng bộ nhớ vật lý và tệp Trang.

Trong khi cột Phys_Memory_ usedby_Sqlserver_MB chỉ là bộ nhớ vật lý (bộ nhớ được hỗ trợ bởi RAM vật lý hoặc bộ nhớ đã cam kết) được sử dụng. Đây là lý do tại sao cả hai đều khác nhau. Nếu bạn thấy cột thực thì đầu tiên là bộ nhớ vật lý được sử dụng và cột còn lại là bộ nhớ ảo được cam kết.

Nếu bạn muốn xem bộ nhớ paged đó sẽ là sự khác biệt giữa Total_Memory_in_MBPhysical_Memory_usedby_Sqlserver_MB .

GHI CHÚ: Tổng bộ nhớ được sử dụng sẽ lớn hơn bộ nhớ vật lý được sử dụng.


5

SQL Server sử dụng nhiều Bộ nhớ cache khác ngoài Bộ đệm Bộ đệm mặc dù đó là bộ đệm lớn nhất (một ví dụ rõ ràng là bộ đệm kế hoạch). Bạn có thể xem xét kỹ hơn về bộ nhớ thông qua DBCC MEMORYSTATUSvà nhiều loại DMV. Bộ nhớ đích và tổng bộ nhớ tham chiếu cụ thể đến Bộ đệm / Bộ đệm.

Trích từ Christian Bolton tinh 's Professional SQL Server 2008 Internals và khắc phục sự cố :

  • MSSQL$<instance >:Memory Manager\Total Server Memory (KB):
    Điều này cho biết kích thước hiện tại của vùng đệm.
  • MSSQL$<instance >:Memory Manager\Target Server Memory (KB):
    Điều này cho biết kích thước lý tưởng cho vùng đệm. Tổng và Target phải gần như giống nhau trên một máy chủ không có áp lực bộ nhớ đã chạy trong một thời gian. Nếu Total nhỏ hơn đáng kể so với Target , thì có khả năng SQL Server không thể phát triển vùng đệm do áp lực bộ nhớ, trong trường hợp đó bạn có thể điều tra thêm.

Chỉ cần thêm ngay cả khi tổng bộ nhớ và bộ nhớ máy chủ đích giống nhau, chúng tôi không thể chắc chắn 100% rằng không có áp lực bộ nhớ. Trong trường hợp này, chúng ta cần kích hoạt thêm một số bộ nhớ và lấy dữ liệu của chúng để đưa ra kết luận.
Shanky

"Tổng và mục tiêu phải gần như giống nhau trên một máy chủ không có áp lực bộ nhớ đã chạy trong một thời gian." Hãy nghĩ về điều này. Tôi đứng lên một SQL Server mới với 128 GB RAM và tôi mang đến một cơ sở dữ liệu 1 GB duy nhất. Hãy để nó chạy trong một tháng. Tôi có thực sự tin rằng Total và Target sẽ gần như giống nhau vào cuối tháng đó không? Nếu họ không, tôi có tin rằng máy chủ đang chịu áp lực bộ nhớ không? Tôi thấy khó tin.
Mike Sherrill 'Nhớ lại mèo'
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.