Điều gì xảy ra khi không còn bộ nhớ vật lý cho SQL Server?


16

Trong khi googling tôi tìm thấy một số thông tin mâu thuẫn.

Một số trang web tuyên bố rằng khi không còn bộ nhớ vật lý cho dữ liệu, thì SQL Server sẽ chuyển dữ liệu đã có vào TEMPDB (xem: SQL Server: Làm sáng tỏ TempDb và các khuyến nghị ).

Nhưng các trang web khác nói rằng, khi không còn đủ bộ nhớ vật lý, hệ điều hành có thể sử dụng PAGE FILE và di chuyển dữ liệu từ bộ nhớ vật lý sang nó (xem Tệp trang cho SQL Server ).

Tôi tự hỏi SQL Server ghi dữ liệu ở đâu khi hết bộ nhớ vật lý? Để tempdb hoặc tập tin Trang hệ điều hành? Hoặc có thể cả hai?

Câu trả lời:


28

khi không còn bộ nhớ vật lý cho dữ liệu, thì SQL Server sẽ chuyển dữ liệu đã có vào TEMPDB

Bài viết bạn liên kết đến là sai lệch ở mức tốt nhất, và không chính xác ở một số nơi. Tôi nghĩ rằng tác giả đã cố gắng đơn giản hóa quá mức một số điều phức tạp, và khi làm như vậy đã đi quá xa.

SQL Server không di chuyển dữ liệu từ bộ nhớ (vùng đệm) vào tempdb theo cách đó. Nó sử dụng chiến lược bộ nhớ đệm "ít được sử dụng gần đây" (nói chung), vì vậy nếu có áp lực bộ nhớ và dữ liệu mới cần được kéo vào bộ nhớ, SQL Server sẽ loại bỏ dữ liệu LRU từ nhóm bộ đệm để chứa dữ liệu mới. Hành vi này thường được theo dõi bởi một bộ đếm perfmon có tên là "Tuổi thọ trang" (PLE) :

Định nghĩa của PLE là thời gian dự kiến, tính bằng giây, một trang tệp dữ liệu được đọc vào vùng đệm (bộ nhớ cache trong bộ nhớ của các trang tệp dữ liệu) sẽ vẫn còn trong bộ nhớ trước khi bị đẩy ra khỏi bộ nhớ để nhường chỗ cho dữ liệu khác trang tập tin. Một cách khác để nghĩ về PLE là một biện pháp tức thời về áp lực lên vùng đệm để tạo không gian trống cho các trang được đọc từ đĩa. Đối với cả hai định nghĩa này, một số cao hơn là tốt hơn.

Trong quá trình thực hiện truy vấn, SQL Server có thể sử dụng tempdb cho các hoạt động nhất định. Điều này thường được thực hiện nếu ước tính là xấu, nhưng bộ nhớ khả dụng thấp có thể ảnh hưởng đến hành vi này.

Một số thao tác có thể "tràn" sang tempdb theo cách này là băm các hàng (cho phép nối hoặc tổng hợp, v.v.), sắp xếp các hàng trong bộ nhớ và đệm các hàng trong khi thực hiện truy vấn song song.

Các truy vấn của người dùng cũng có thể sử dụng tempdb một cách rõ ràng (với các bảng tạm thời toàn cầu hoặc cục bộ) và ngầm sử dụng tempdb (với các mức độ cách ly ảnh chụp nhanh hoặc đọc cam kết).

Cả hai tình huống này thực sự không phù hợp với tuyên bố bạn đã trích dẫn.

khi không còn đủ bộ nhớ vật lý, hệ điều hành có thể sử dụng PAGE FILE và di chuyển dữ liệu từ bộ nhớ vật lý sang nó

Điều này chắc chắn có thể xảy ra và phần lớn nằm ngoài sự kiểm soát của SQL Server. Có một nút bạn có thể xoay để cố gắng ngăn một số loại phân trang cấp hệ điều hành, cụ thể là bật "Khóa trang trong bộ nhớ" (LPIM) :

Chính sách Windows này xác định tài khoản nào có thể sử dụng một quy trình để giữ dữ liệu trong bộ nhớ vật lý, ngăn hệ thống phân trang dữ liệu sang bộ nhớ ảo trên đĩa.

Vì vậy, những gì chúng ta có thể ngăn chặn được phân trang vào đĩa?

Trước SQL Server 2012, các trang được phân bổ thông qua một thành phần được gọi là "Phân bổ trang đơn" đã bị khóa trong bộ nhớ (không thể phân trang). Điều này bao gồm nhóm bộ đệm (trang cơ sở dữ liệu), bộ đệm thủ tục và một số vùng bộ nhớ khác.

Xem Vui với các trang bị khóa, AWE, Trình quản lý tác vụ và Cài đặt làm việc để biết chi tiết, đặc biệt là phần "4. Bây giờ tôi biết rằng SQL Server trên x64 có thể sử dụng các trang bị khóa Khóa, chính xác là gì đã bị khóa?" Đọc thêm liên quan có thể được tìm thấy ở đây: Cuộc tranh luận về máy chủ SQL tuyệt vời: Khóa trang trong bộ nhớ

Trong SQL Server 2012 trở lên, không có "Bộ phân bổ trang đơn" (bộ cấp phát một trang và nhiều trang được hợp nhất, theo cái nhìn sâu về bộ nhớ - SQL Server 2012/2014 ). Các chi tiết về những gì, chính xác, có thể và không thể được phân trang không được ghi lại chi tiết ở bất cứ nơi nào tôi thấy. Bạn có thể sử dụng một truy vấn như thế này để xem những gì đang khóa:

select osn.node_id, osn.memory_node_id, osn.node_state_desc, omn.locked_page_allocations_kb
from sys.dm_os_memory_nodes omn
inner join sys.dm_os_nodes osn on (omn.memory_node_id = osn.memory_node_id)
where osn.node_state_desc <> 'ONLINE DAC'

Trên cùng một bài viết Hỗ trợ MS, bạn cũng có thể sử dụng DBCC MEMORYSTATUSđể xem dung lượng bộ nhớ bị "khóa".

Là một lưu ý phụ, bạn có thể thấy bằng chứng về bộ làm việc của SQL Server đang được HĐH phân trang trong nhật ký lỗi. Sẽ có những thông điệp giống như thế này:

2019-09 / 02 10: 19: 27,29 spid11s Một phần đáng kể của bộ nhớ quy trình máy chủ sql đã được phân trang. Điều này có thể dẫn đến suy giảm hiệu suất. Thời lượng: 329 giây. Bộ làm việc (KB): 68780, cam kết (KB): 244052, sử dụng bộ nhớ: 28%.


0

Các phiên bản hiện đại của máy chủ SQL có cơ hội thực sự nhỏ lên hoàn toàn. SQL Server tải .NET Framework vào không gian địa chỉ của nó và sử dụng nó trong hoạt động bình thường. Nếu cả bộ nhớ vật lý và tệp trang đều hết, Windows sẽ cố gắng phát triển tệp trang; tuy nhiên ngay cả khi nó có thể phát triển tệp trang, đây không phải là hoạt động tức thời và phân bổ bộ nhớ không thành công trong khi tệp trang đang phát triển. Có một lỗi trong trình xử lý I / O không đồng bộ .NET, nơi nó cấp phát bộ nhớ để đáp ứng với thông báo APC. Nếu cuộc gọi đến newthất bại, nó sẽ némOutOfMemoryException. Ngoại lệ này được bắt gặp trong mã riêng bên trong bộ lập lịch tác vụ; tuy nhiên, I / O không đồng bộ sẽ xuất hiện để không bao giờ kết thúc. Chuỗi trình hoàn thiện cho FileStream sẽ chặn việc chờ I / O kết thúc để nó có thể bỏ ghim bộ đệm, do đó sẽ treo chuỗi hoàn tất mãi mãi. Điều này khiến .NET Framework dần dần sử dụng nhiều bộ nhớ hơn cho đến khi không thể phân bổ thêm bộ nhớ, tại thời điểm đó, máy chủ SQL sẽ không phản hồi vì winock không thể phân bổ bộ đệm nữa nên ngay cả kết nối truy cập quản trị viên cũng vô dụng.

Tôi thực sự đã gặp phải tình trạng treo máy toàn bộ lịch trình tác vụ trong một ứng dụng .NET do hết bộ nhớ. Rất may, quá trình cuối cùng đã chết do ném OutOfMemoryExceptionvào một số luồng không bắt được nó sau một vài lần thất bại để chúng tôi có thể tìm ra cái gì thực sự treo máy chủ.

Một khi tôi biết những gì tôi đang tìm kiếm, việc tìm ra lỗi trong phân tích tĩnh là dễ dàng.

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.