Làm cách nào để SQL Server giải phóng bộ nhớ?


19

Tôi biết SQL thích RAM, nhưng phát hành nó khi Windows yêu cầu. Tôi biết đây là cách SQL được cho là hoạt động. Nhưng tôi có một Quản trị viên Windows không tin rằng SQL sẽ thực sự trả lại RAM và trên máy chủ (ảo) cụ thể này, SQL không cần nhiều khi Dịch vụ phân tích kết thúc, nhưng không có gì khác trên máy chủ này làm phiền yêu cầu SQL nhiều.

Vì vậy, tôi đang cố trấn an các Quản trị viên Windows rằng các vấn đề với môi trường ảo không phải là "vì SQL đang sử dụng quá nhiều RAM", nhưng tôi dường như không thể thuyết phục SQL phát hành nó mà không khởi động lại dịch vụ.

Khi xử lý các khối, dịch vụ SQL vui vẻ lấy 8GB RAM, nhưng vì không có áp lực nào nên nó không giải phóng nhiều thứ này trong một ngày bình thường. Các anh chàng Windows hét lên, và sẽ tốt hơn nhiều khi SQL phát hành bản này.

Tôi không muốn sử dụng cài đặt bộ nhớ tối đa, vì tôi thực sự muốn SQL sử dụng nhiều RAM khi xử lý. Tôi chỉ muốn nó quay trở lại một lần nữa sau đó.

Nó có khả năng là một bản sao của cả SQL Server không giải phóng Bộ nhớLấy lại bộ nhớ từ SQL Server , nhưng tôi tự hỏi liệu có câu trả lời khác không. Chờ đợi Windows đòi lại nó sẽ không thuyết phục được những kẻ Windows ở đây. Khởi động lại dịch vụ là một lựa chọn, nhưng tôi thực sự không phải là người hâm mộ ý tưởng đó.

Tôi muốn biết làm thế nào để Windows yêu cầu trả lại ...


2
Điều gì ... một sysadmin đang phàn nàn về RAM được sử dụng? Tôi cảm thấy tồi tệ khi RAM không được sử dụng, bởi vì nếu không được sử dụng, nó sẽ lãng phí ...
Mark Henderson

Tôi cũng không hiểu, nếu máy không cần bộ nhớ - vấn đề nằm ở đâu? Đây là cách hệ điều hành và các ứng dụng của nó hoạt động bình thường ... với tải công việc có dịch vụ SQL nhàn rỗi giữ hầu hết bộ nhớ khi không có gì khác cần nó có thể tăng thời gian phản hồi và / hoặc hiệu suất cho công việc SQL tiếp theo?
Oskar Duveborn

Quản trị viên Windows cảm thấy rằng SQL đang làm căng thẳng máy vì quá trình này có quá nhiều RAM. Tôi biết hộp không bị căng thẳng từ SQL và có thể chứng minh bằng cách khởi động lại dịch vụ SQL, cho thấy rằng nó chỉ tiêu tốn nhiều RAM khi lấy dữ liệu để xử lý SSAS. Vì vậy, tôi muốn SQL giải phóng bộ nhớ để hiển thị lượng RAM mà SQL đang sử dụng trong phần còn lại của ngày. Đây không phải là về việc khiến họ cung cấp thêm RAM, mà chỉ khiến họ ngừng đổ lỗi cho SQL.
Rob Farley

2
Đồng ý với Farseeker, sysadmin sẽ được sử dụng RAM. Nếu nó không được thu hồi, thì máy chủ sẽ không cần nó. Có thể yêu cầu sysadmin xem xét các lỗi trang để cho thấy hệ thống không bị căng thẳng?
Nick Kavadias

2
Nếu sysadmin của bạn không hiểu được Lỗi của Trang là gì và tại sao việc sử dụng bộ nhớ nhưng không có Lỗi Trang thực sự xảy ra không phải là vấn đề, tôi không biết cách giúp bạn. Bạn không thể sửa chữa ngu ngốc. Tuy nhiên, một điều bạn có thể làm là sử dụng sp_cool để định cấu hình bộ nhớ tối đa khi bạn không sử dụng hệ thống và cấu hình lại nó khi bạn cần. Điều này có vẻ khá ngớ ngẩn, tuy nhiên. sp_configurenói chung là một cái gì đó bạn nên đặt một lần và để lại một mình.
Bacon Bits

Câu trả lời:


12

Tôi tin rằng tùy chọn duy nhất của bạn là khởi động lại Dịch vụ SQL hoặc chạy một ứng dụng tiêu tốn nhiều bộ nhớ để buộc SQL giải phóng nó.

Tôi thích đề xuất của @Nick Kavadias: theo dõi Bộ nhớ: Lỗi trang / Bộ đếm hiệu suất của Sec để cho thấy rằng SQL không đặt bộ nhớ của HĐH dưới áp lực.


2
Cảm ơn Mitch ... Hãy để tôi tìm tệp văn bản 10 GB đó cho Notepad.
Rob Farley

lol!, thực sự đó không phải là một ý tưởng tồi!
Mitch Wheat

có thể sử dụng tệp 2GB ...
Mitch Wheat

5

Một cách để cho họ thấy rằng nó sẽ làm điều đó là để SQL Server nhai hết bộ nhớ. Sau đó sao chép một tệp khổng lồ qua mạng (tệp SQL Backup lớn hoạt động tốt cho việc này). Điều này sẽ khiến bộ đệm hệ thống lấp đầy và Windows sẽ bắt đầu yêu cầu SQL trả lại bộ nhớ. SQL sẽ bắt đầu đưa bộ nhớ trở lại HĐH cho đến khi nó đạt đến cài đặt bộ nhớ tối thiểu của bạn.

(Xin lỗi đã không nhận được toàn bộ câu hỏi qua Twitter, rõ ràng cần hơn 140 ký tự.)


1
Tôi hy vọng một số quy trình tôi có thể sử dụng sẽ yêu cầu SQL trả lại bộ nhớ (sau khi bộ đệm đã được dọn sạch và loại bỏ), nhưng không phải làm tê liệt hộp để làm điều đó.
Rob Farley

Tôi không nghĩ rằng có một cách để buộc trình quản lý bộ nhớ Windows yêu cầu trả lại bộ nhớ mà không buộc vấn đề thông qua các phương tiện khác. Bạn có thể có thể viết một cái gì đó trực tiếp chạm vào API win32 để làm như vậy, nhưng theo tôi biết cách duy nhất để kích hoạt Windows để yêu cầu bộ nhớ trở lại là khiến nó cần thêm bộ nhớ cho một quá trình khác. Kiểm tra với Bob hoặc Paul, họ có thể có thêm thông tin.
mrdenny

3
Trình điều khiển khinh khí cầu của VMware thực hiện chính xác điều này - nó yêu cầu Windows cho bộ nhớ ngày càng nhiều hơn để SQL Server (hoặc bất kỳ ứng dụng nào khác) từ bỏ bộ nhớ của họ.
Brent Ozar

Vâng - tôi đã hy vọng rằng tôi sẽ không phải làm điều gì đó như thế.
Rob Farley

@BrentOzar, trình điều khiển ballon của VMware chỉ lấy lại bộ nhớ từ bộ đệm của hệ thống , không phải bộ nhớ xử lý thực tế; nó được thiết kế như một cách để nói với HĐH "không sử dụng hết bộ nhớ khả dụng của bạn cho những thứ tầm thường", không mang nó xuống.
Massimo

2

Bạn đề cập đến 'khối' vì vậy không rõ bạn nói về động cơ AS hay động cơ quan hệ. Công cụ quan hệ có thể giải phóng bộ nhớ theo yêu cầu:

DBCC FREESYSTEMCACHE('<cache name>');

Trong đó 'tên bộ đệm' được lấy từ sys.dm_os_memory_clerks . Thông số kỹ thuật của DBCC FREESYSTEMCACHE chỉ đề cập đến các nhóm thống đốc, nhưng nhiều bộ đệm khác có thể bị trục xuất thực sự.

Nhưng nếu tất cả bộ nhớ được sử dụng bởi nhóm bộ đệm, thì việc xóa toàn bộ nhóm bộ đệm sẽ dẫn đến suy giảm hiệu năng rất lớn và tải IO rất lớn. Tốt hơn hãy để SQL tự xử lý việc này.


1
Xin chào Remus, bộ đệm bộ đệm quan hệ là lớn sau khi xử lý một khối. Sau đó, tôi thực sự muốn bộ nhớ cache được dọn sạch, bỏ và bộ nhớ trở lại Windows. DBCC DROPCLEANBUFFERS và FREESYSTEMCACHE làm trống bộ nhớ cache nhưng không trả lại bộ nhớ cho Windows, vì vậy đó không hoàn toàn là những gì tôi muốn.
Rob Farley

2
Về lý thuyết, bạn có thể giả mạo áp lực bộ nhớ (ví dụ: bạn có thể dùng trampoline QueryMemoryResourceNotification msdn.microsoft.com/en-us/l Library / aa366799% 28VS85% 29.aspx ) nhưng tôi thực sự sẽ không thực sự đến đó. Nếu SQL không giải phóng bộ nhớ đã cam kết là do HĐH không cần nó. HĐH không cần bộ nhớ vì SQL là ứng dụng duy nhất trên máy chủ ( stackoverflow.com/questions/1401834/ mẹo ), phải không? Nếu bạn chạy một số ứng dụng khác dọc theo SQL, bạn đã có nó.
Remus Rusanu

2

Với cả động cơ AS và DS, bạn có thể đặt nắp trên bộ nhớ để chúng ở dưới ngưỡng an toàn; điều này được khuyến nghị trên 64 máy có nhiều RAM và / hoặc nhiều phiên bản SQL. Đối với ít nhất là công cụ cơ sở dữ liệu nếu bạn thay đổi giới hạn bộ nhớ xuống dưới mức sử dụng hiện tại, nó sẽ giảm dung lượng bộ nhớ khi không phải khởi động lại dịch vụ, mặc dù không chắc chắn về SSAS.


Có nắp là ổn, nhưng tôi nghĩ rằng tôi sẽ muốn kéo bộ nhớ tối đa xuống sau khi xử lý và sau đó đẩy nó ra, khi tôi muốn dọn dẹp bộ đệm, thả chúng và hỏi Windows về áp lực bộ nhớ.
Rob Farley

1

Cách dễ nhất tôi đã tìm thấy là đi đến thuộc tính bộ nhớ máy chủ, nhập giá trị nhỏ hơn, áp dụng, đợi vài phút và điều chỉnh cấu hình sao lưu.

Chúng tôi cũng đã tìm thấy việc sử dụng bộ nhớ máy chủ sql tiết kiệm thực sự có thể cải thiện hiệu suất của máy chủ vì nó cung cấp cho windows nhiều ram hơn cho bộ nhớ đệm, v.v.

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.