2017-08-01 16 views
15

Trên máy chủ của chúng tôi với RAM 32 GB, chúng tôi có một phiên bản SQL Server đang chạy được giới hạn với bộ nhớ tối đa là 80%.SQL Server hoàn toàn chậm lại sau khi chiếm toàn bộ bộ nhớ

Mọi thứ hoạt động tốt khi mức sử dụng bộ nhớ thấp. Xem ảnh chụp màn hình bên dưới enter image description here

Nhưng khi thời gian trôi qua, 3-4 ngày do đó SQL sẽ sử dụng toàn bộ RAM (80% tổng số).

Trong 3-4 ngày này, chúng tôi không thực hiện thay đổi đối với máy chủ, nhưng từng ngày nó tiếp tục ăn nhiều RAM hơn.

Khi đạt đến giới hạn tối đa, toàn bộ hiệu suất sẽ xuất hiện và chúng tôi sẽ phải đối mặt với thời gian chờ truy vấn trên trang web của chúng tôi. Phải mất nhiều giây để thực hiện cùng một truy vấn được thực hiện trong mili giây.

Tại thời điểm này, chúng tôi không có lựa chọn nào khác ngoài việc khởi động lại toàn bộ máy chủ và mọi thứ trở lại bình thường. (Khởi động lại dịch vụ duy nhất không làm việc)

này sẽ làm việc cho một tuần hoặc lâu hơn, sau đó chúng tôi phải khởi động lại nó một lần nữa

Tôi đã đọc trên mạng, máy chủ SQL không giải phóng bộ nhớ. Nhưng họ cũng đã đề cập rằng đó là cách các hàm SQL, nhưng không ảnh hưởng đến hiệu năng. Trong trường hợp của tôi nó và hiệu suất bị.

Có rò rỉ bộ nhớ không? Hoặc một lưu trữ proc tiêu thụ rất nhiều bộ nhớ và không bao giờ phát hành nó? Nếu vậy làm thế nào để tôi gỡ lỗi nó?

+2

Tôi đã có một vấn đề tương tự, nhưng tìm thấy giải pháp (hơi kỳ lạ) là đặt giới hạn thấp hơn nhiều. Đúng là SQL Server sẽ chỉ lấy nhiều bộ nhớ cho chính nó vì nó được cho phép và không phát hành nó. Nếu giới hạn quá cao, thì cuối cùng các chức năng khác của máy chủ bị mất bộ nhớ, và toàn bộ hệ thống phải tiếp tục hoán đổi, làm chậm mọi thứ trong đó có SQL Server –

+0

Kích thước cơ sở dữ liệu của bạn là bao nhiêu? Bạn đã kiểm tra thủ công các chức năng, thủ tục cho bất kỳ mức tiêu thụ bộ nhớ cao nào chưa? – user4221591

+6

@JonathanWillcock chính xác là lý do tại sao máy chủ sql nên được cài đặt trên một máy chuyên dụng (ảo hoặc phisical, không quan trọng) mà không có gì khác hiện diện ngoại trừ mức tối thiểu cần thiết để máy chủ chạy. –

Trả lời

19

Theo mặc định máy chủ SQL tiêu thụ toàn bộ bộ nhớ nếu không được ngắt và sử dụng tất cả bộ nhớ có sẵn khi được giới hạn. Đây là Normal.You cũng sẽ phải đảm bảo SQLSERVER là ứng dụng duy nhất trên hộp (được khuyến nghị) và also try to cap memory as per best practices.

tôi sẽ bắt đầu xử lý sự cố sử dụng dưới đây cách tiếp cận

1.Start tìm ký ức đầu tiêu thụ các truy vấn và xem liệu tôi có thể làm giảm sử dụng bộ nhớ của các truy vấn truy vấn tiêu thụ ..memory có thể được tìm thấy bằng cách dưới đây truy vấn.

SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, 
((CASE qs.statement_end_offset 
WHEN -1 THEN DATALENGTH(qt.TEXT) 
ELSE qs.statement_end_offset 
END - qs.statement_start_offset)/2)+1), 
qs.execution_count, 
qs.total_logical_reads, qs.last_logical_reads, 
qs.total_logical_writes, qs.last_logical_writes, 
qs.total_worker_time, 
qs.last_worker_time, 
qs.total_elapsed_time/1000000 total_elapsed_time_in_S, 
qs.last_elapsed_time/1000000 last_elapsed_time_in_S, 
qs.last_execution_time, 
qp.query_plan 
FROM sys.dm_exec_query_stats qs 
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt 
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp 
ORDER BY qs.total_logical_reads DESC -- logical reads 
-- ORDER BY qs.total_logical_writes DESC -- logical writes 
-- ORDER BY qs.total_worker_time DESC -- CPU time 

bây giờ bạn đã tìm thấy các truy vấn gây ra bộ nhớ cao, bạn cần tinh chỉnh chúng để xem bạn có thể giảm mức sử dụng bộ nhớ hay không.

EX: truy vấn có thể được thực hiện nhiều lần đọc do một chỉ số không phù hợp hoặc có thể là thiết bị IO của bạn có một vấn đề do đó vùng đệm dữ liệu là nhận được đỏ mặt nhiều lần

2.You cũng có thể tìm linh kiện hàng đầu mà sử dụng bộ nhớ, mang đến cho bạn một sự hiểu biết về cách RAM là chi

SELECT TOP(20) [type], [name], SUM(single_pages_kb) AS [SPA Mem, Kb] 
FROM sys.dm_os_memory_clerks 
GROUP BY [type], [name] 
ORDER BY SUM(single_pages_kb) DESC; 

nếu vùng đệm dữ liệu sử dụng bộ nhớ nhiều hơn một cách nhất quán, tôi sẽ không phải lo lắng về điều đó, nhưng nếu nó là cachestore_obcp.sau đó bạn có thể gặp phải nhiều truy vấn ad-hoc lấp đầy cửa hàng bộ nhớ cache mà là xấu

Một cuộc điều tra dẫn đến khác, vì vậy bạn sẽ phải khắc phục dựa trên dẫn như không có giải pháp một cú nhấp chuột

Lưu ý phụ: Không được đề xuất:
một trong các trường hợp dev của chúng tôi được sử dụng để đối mặt với cùng một vấn đề, vì vậy thay vì thực hiện tất cả các công cụ điều chỉnh, chúng tôi đã sử dụng lệnh dưới đây để phát hành bộ nhớ hiệu quả ngay lập tức..nhưng điều này không hề đề nghị cho một trường hợp sản xuất, vì điều này tuôn ra kế hoạch được lưu trữ trong bộ nhớ cache và bạn có thể phải đối mặt với áp lực CPU nhẹ

DBCC FREEPROCCACHE WITH NO_INFOMSGS; 

Tài liệu tham khảo:

+1

+1 và http://searchsqlserver.techtarget.com/feature/Built-in-tools-troubleshoot-SQL-Server-memory-usage – Sujith

3

Bạn cần phải tìm ra các truy vấn đắt nhất và cần phải xem xét các lệnh truy vấn, nhiều lần mã truy vấn không được tối ưu hóa hiệu quả . Điều chỉnh hiệu suất bạn cần làm.

+4

"Điều chỉnh hiệu suất bạn cần làm". - đó không phải là những gì Sư Phụ Yoda đã nói từ rất lâu rồi sao? :) – heemayl

Các vấn đề liên quan