Cấu hình bộ nhớ tối đa và tối thiểu của SQL Server


8

Các cài đặt chính xác cho bộ nhớ tối thiểu và bộ nhớ tối đa trong trường hợp sử dụng này là gì?

Máy chủ có ram 8GB, bộ xử lý Intel Xeon kép, chạy Windows Server 2008 R2 / Sql Server 2008 Standard Edition. Nó đang chạy một số cơ sở dữ liệu có kích thước từ 30 GB - 5 GB.

Ban đầu, việc sử dụng bộ nhớ được đặt thành cài đặt mặc định (min = 0 max = 2.147.483.647). Trên các cài đặt này, hầu hết việc sử dụng bộ nhớ đã được sử dụng bởi sqlservr.exe và cuối cùng máy chủ sẽ cần phải được khởi động lại mỗi ngày hoặc hai ngày. Nó sẽ chạy bình thường lúc đầu nhưng trong vòng một ngày bắt đầu hết thời gian cho các thao tác đơn giản như tra cứu bản ghi bằng khóa chính.

Tôi đã thay đổi min = 4.096 và max = 6.144. Điều này dẫn đến việc chỉ sử dụng bộ nhớ 1,4GB. Tuy nhiên, bây giờ cả bốn cpus đang chạy ở mức sử dụng 50-60% cpu liên tục. Các tác vụ mất nhiều thời gian hơn 1/3 để thực thi, mặc dù máy chủ ổn định hơn nhiều.


Mua thêm RAM và để tối đa mặc định.
Remus Rusanu

4
@RemusRusanu Tôi giả sử bạn có nghĩa là tối thiểu để mặc định!
Kin Shah

Chúng tôi có các trường hợp sử dụng rất giống nhau và các vấn đề tương tự (HĐH không có mem do SQL lấy tất cả) khi mọi người quên thực hành. Thực hành của chúng tôi là sử dụng 0 dưới dạng tối thiểu và một nửa có sẵn dưới dạng tối đa.
Paul

@kin không, ý tôi là tối đa . Tôi nên nói rằng để lại cả min và max ở các giá trị mặc định, nhưng tôi không bao giờ hiểu tại sao mọi người sẽ thay đổi min dù thế nào ...
Remus Rusanu

1
@RemusRusanu Tôi cho rằng đó là một lỗi đánh máy, vì với lượng kiến ​​thức thực tế bạn có + câu trả lời xuất sắc của bạn. Mặc dù vậy, tôi không đồng ý với việc để bộ nhớ Max làm mặc định.
Kin Shah

Câu trả lời:


10

Nhìn vào khả năng RAM của bạn cho máy chủ cụ thể này và bạn đang chạy một số cơ sở dữ liệu từ 30 GB đến 5 GB , bạn chắc chắn cần thêm RAM trên máy chủ này.

Bạn đã không đề cập rằng đây là một phiên bản độc lập hoặc máy chủ này đang có nhiều hơn một phiên bản máy chủ sql đang chạy.

Cài đặt bộ nhớ MAX của bạn có vẻ ổn đối với máy chủ có RAM 8GB. Xem những đề xuất thực hành tốt nhất được đề xuất từ ​​Glenn Berry .

Tôi thực sự khuyên bạn nên thực hiện một đường cơ sở của môi trường của bạn bằng cách sử dụng các bộ đếm PERFMON bên dưới để có được giá trị tốt về cấu hình bộ nhớ của bạn:

  • SQL Server: Trình quản lý bộ đệm \ Tuổi thọ trang
  • SQL Server: Trình quản lý bộ đệm \ Trang đọc / giây
  • Đĩa vật lý \ Đĩa đọc / giây
  • Bộ nhớ \ Mbyte có sẵn
  • SQL Server: Trình quản lý bộ nhớ - Tổng bộ nhớ máy chủ
  • SQL Server: Trình quản lý bộ nhớ - Bộ nhớ máy chủ mục tiêu

Tổng bộ nhớ máy chủ: Lượng bộ nhớ hiện được phân bổ cho Bộ đệm và không phải tổng bộ nhớ cho SQL Server

Bộ nhớ máy chủ đích: Kích thước lý tưởng của vùng đệm tương ứng với bộ nhớ tối đa chẳng hạn.

Lưu ý: Nếu Tổng bộ nhớ máy chủ> Bộ nhớ máy chủ mục tiêu, thì nó gợi ý áp lực bộ nhớ.

Tập lệnh bên dưới sẽ giúp bạn tìm các thông báo Bộ nhớ THẤP hoặc CAO từ sys.dm_os_ring_buffers- phiên sức khỏe hệ thống:

SELECT CONVERT (varchar(30), GETDATE(), 121) as [RunTime],
dateadd (ms, (rbf.[timestamp] - tme.ms_ticks), GETDATE()) as [Notification_Time],
cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') AS [Notification_type],
cast(record as xml).value('(//Record/MemoryRecord/MemoryUtilization)[1]', 'bigint') AS [MemoryUtilization %],
cast(record as xml).value('(//Record/MemoryNode/@id)[1]', 'bigint') AS [Node Id],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsProcess)[1]', 'int') AS [Process_Indicator],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsSystem)[1]', 'int') AS [System_Indicator],
cast(record as xml).value('(//Record/MemoryNode/ReservedMemory)[1]', 'bigint') AS [SQL_ReservedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/CommittedMemory)[1]', 'bigint') AS [SQL_CommittedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/AWEMemory)[1]', 'bigint') AS [SQL_AWEMemory],
cast(record as xml).value('(//Record/MemoryNode/SinglePagesMemory)[1]', 'bigint') AS [SinglePagesMemory],
cast(record as xml).value('(//Record/MemoryNode/MultiplePagesMemory)[1]', 'bigint') AS [MultiplePagesMemory],
cast(record as xml).value('(//Record/MemoryRecord/TotalPhysicalMemory)[1]', 'bigint') AS [TotalPhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePhysicalMemory)[1]', 'bigint') AS [AvailablePhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalPageFile)[1]', 'bigint') AS [TotalPageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePageFile)[1]', 'bigint') AS [AvailablePageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalVirtualAddressSpace)[1]', 'bigint') AS [TotalVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailableVirtualAddressSpace)[1]', 'bigint') AS [AvailableVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/@id)[1]', 'bigint') AS [Record Id],
cast(record as xml).value('(//Record/@type)[1]', 'varchar(30)') AS [Type],
cast(record as xml).value('(//Record/@time)[1]', 'bigint') AS [Record Time],
tme.ms_ticks as [Current Time]
FROM sys.dm_os_ring_buffers rbf
cross join sys.dm_os_sys_info tme
where rbf.ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR' 
--and cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') = 'RESOURCE_MEMPHYSICAL_LOW'
ORDER BY rbf.timestamp ASC

Một số tài liệu tham khảo tốt:


2
Bạn có so sánh tổng và mục tiêu sai cách, nhưng trong mọi trường hợp, có nhiều cách tốt hơn để xác định xem máy chủ có chịu áp lực bộ nhớ ngoài hay không.
Paul White 9

@paulwhite bạn có thể vui lòng làm rõ thêm một chút để tôi có thể cải thiện câu trả lời của mình không? Cảm ơn đã xem xét.
Kin Shah

Đó là một ví dụ độc lập
sa555
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.