Lấy lại bộ nhớ từ SQL Server


10

Tôi có một phiên bản SQL Server, người sử dụng bộ nhớ tăng dần cho đến khi các cửa sổ sẽ không cung cấp cho nó nữa. Có vẻ hợp lý rằng kết quả truy vấn lớn thường xuyên sẽ làm cho cá thể phát triển.

Có cách nào để tôi có thể thuyết phục SQL Server giải phóng bộ nhớ mà nó không cần nữa không (ngoài việc khởi động lại dịch vụ)?

Chỉnh sửa:
Tôi đang sử dụng SQL Server 2000 SQL Server 08:00.2039 - SP4 (Phiên bản tiêu chuẩn)

Tôi đã có thể tìm ra điều đó bằng cách sử dụng truy vấn sau:

SELECT 'SQL Server ' 
    + CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - ' 
    + CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' (' 
    + CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'

Câu trả lời:


19

Đây chính là cách SQL Server là phải làm việc.

Nếu bạn có các dịch vụ khác trên máy đó và không muốn SQL tiêu thụ hết bộ nhớ khả dụng, bạn sẽ cần đặt bộ nhớ máy chủ tối đa. Xem Tùy chọn bộ nhớ máy chủ SQL trên MSDN.


1
Nghe giống như một lỗi hơn là một tính năng ... nó xảy ra với tôi. SQL Server chiếm 95% RAM có sẵn để làm một cái gì đó và không thể giải phóng nó khi hoàn thành.
Alchemical

1
@ Alchemical Phụ thuộc vào những gì bạn có nghĩa là " hoàn thành ". SQL Server có thể sử dụng tất cả RAM trong máy tính; sử dụng nó như một bộ đệm đĩa. Nó không " hoàn thành " bằng cách sử dụng nó làm bộ đệm đĩa cho đến khi bạn hoàn thành việc sử dụng SQL Server.
Ian Boyd

8

Các áp phích khác đều đúng theo thiết kế, nhưng bạn hoàn toàn muốn giới hạn bộ nhớ tối đa ít hơn một chút so với RAM của máy chủ. Hãy suy nghĩ về chuỗi sự kiện này:

  • SQL 2000 chạy rất vui, tiêu thụ hết RAM của máy chủ của bạn
  • Ai đó RDP, hoặc bạn phải tải lên IE để tải xuống một bản vá, hoặc các bản sao lưu của bạn khởi động, bất cứ điều gì
  • SQL phải phân bổ và bộ nhớ đủ trống để HĐH hoạt động
  • Hiệu suất giảm trong khi giải phóng bộ nhớ và phân trang vào đĩa
  • Mọi thứ diễn ra tốt đẹp một khi nó ổn định
  • Các hoạt động khác hoàn thành và SQL dần lấy lại RAM được giải phóng
  • Nói lại

Để tránh điều này, hãy định cấu hình giới hạn bộ nhớ máy chủ tối đa của bạn ở mức khoảng 80-90% bộ nhớ vật lý thực tế của bạn. Hướng dẫn cho SQL 2000 tại: http://msdn.microsoft.com/en-us/l Library / ms178067.aspx


Hãy nhớ rằng hành vi này là 2005 và 2008 - 2000 không giải phóng bộ nhớ theo yêu cầu cho HĐH.
Paul Randal

2
Không chính xác theo yêu cầu, nhưng nó giải phóng bộ nhớ trở lại HĐH. Từ liên kết tôi đã đăng: "Khi SQL Server đang sử dụng bộ nhớ động, nó sẽ truy vấn hệ thống định kỳ để xác định dung lượng bộ nhớ vật lý miễn phí. Trong Microsoft Windows 2000, SQL Server tăng hoặc thu hẹp bộ đệm bộ đệm để giữ bộ nhớ vật lý trống trong khoảng 4 MB và 10 MB tùy thuộc vào hoạt động của máy chủ. Duy trì bộ nhớ trống này ngăn Windows 2000 phân trang. Nếu có ít bộ nhớ hơn, SQL Server sẽ giải phóng bộ nhớ cho Windows 2000. Nếu có nhiều bộ nhớ hơn, SQL Server sẽ cấp phát bộ nhớ cho nhóm bộ đệm. "
sh-beta

À - đúng - đó là mẹo để ngừng hoạt động một chút bộ nhớ vật lý - bạn đã đúng!
Paul Randal

4

Nó sẽ chỉ giải phóng nó nếu HĐH báo hiệu rằng RAM bị bỏ đói hoặc nếu bạn dừng và khởi động lại dịch vụ; điều cần làm là giới hạn số lượng tối đa SQL sẽ sử dụng bằng cách định cấu hình giá trị 'bộ nhớ máy chủ tối đa'. Nếu không có gì khác trên máy chủ cần RAM (và hy vọng là không có), tôi sẽ không lo lắng về điều đó.


4

Vì vậy, để tóm tắt các câu trả lời:

Không có cách nào để nhắc MS SQL Server giải phóng bộ nhớ mà nó không cần ngay lập tức. SQL Server sẽ tự động giải phóng bộ nhớ khi cần, nhưng không phải trước đó. Và nếu bạn đang gặp vấn đề về bộ nhớ, bạn nên giảm giá trị của optin bộ nhớ "bộ nhớ máy chủ tối đa".


3

SQL Server sẽ tiêu thụ bộ nhớ và không trả lại trừ khi được hệ điều hành cho biết có áp lực bộ nhớ. Như Portman đã chỉ ra, đây là theo thiết kế và nếu bạn muốn giới hạn mức tiêu thụ bộ nhớ, bạn cần đặt bộ nhớ máy chủ tối đa mà SQL Server sẽ sử dụng.


2

Hãy nhớ rằng hành vi mà tất cả các bạn mô tả là từ SQL Server 2005 trở đi, khi trình quản lý bộ nhớ được viết lại (trong số những thứ khác) đáp ứng các yêu cầu áp suất bộ nhớ từ HĐH.

Đối với SQL Server 2000 trở về trước, một khi nó lấy được bộ nhớ, nó sẽ không trả lại cho nó, bất kể HĐH sẽ kêu gọi nó bao nhiêu.

CodeSlave - bạn đang chạy vào năm 2000, 2005 hay 2008?


À ha ... đúng vậy, SQL 2000.
BIBD

3
Nó không trả lại khi hệ điều hành hét lên, nhưng nó sẽ trả lại nếu hệ điều hành nằm dưới ngưỡng nhất định cho bộ nhớ vật lý miễn phí. Xem msdn.microsoft.com/en-us/l Library / ms178067.aspx
sh-beta

Và để củng cố những gì sh-beta đã nói, SQL Server 2000 chỉ giải phóng bộ nhớ khi thông báo rằng HĐH thiếu bộ nhớ vật lý vì phải đến Windows XP (2001), Windows mới thêm API để cho phép " HĐH hét lên nó "( msdn.microsoft.com/en-us/l Library / aa366799 ( v = vs85 ) .aspx ). SQL Server 2005 tận dụng tính năng mới đó của Windows. Nhưng khi SQL Server 2000 được viết, không có cách nào để HĐH hét lên, buộc SQL Server phải kiểm tra định kỳ áp suất bộ nhớ.
Ian Boyd

0

Tôi biết câu hỏi cũ, nhưng một cách buộc SQL (mới hơn, ít nhất là) để giải phóng bộ nhớ là viết một ứng dụng phân bổ càng nhiều bộ nhớ càng tốt, chờ trong 15 giây (ví dụ: Ngủ (15000)) và giải phóng bộ nhớ được phân bổ và thoát ra; Tôi đã thử điều này và SQL không giải phóng bộ nhớ để hệ thống lấy lại RAM; Viết mã như trên hầu như không quan trọng bằng C / C ++, chỉ cần thiết lập một chuỗi các chuỗi để giữ chuỗi khối bộ nhớ (con trỏ và kích thước), giảm dần kích thước khi "malloc ()" thất bại cho đến khi đạt được tối thiểu (giả sử ít hơn 1024) và sau đó duyệt qua danh sách được liên kết để giải phóng các khối được phân bổ

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.