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.