Microsoft SQL Server rất thông minh về mặt quản lý bộ nhớ, nhưng đôi khi cảnh báo áp suất bộ nhớ và công cụ cơ sở dữ liệu yêu cầu nhiều bộ nhớ hơn, dẫn đến lỗi.
Giới thiệu
Bài đăng này thảo luận về cách giải quyết một trong những trường hợp đặc biệt mà bạn gặp phải do áp lực bộ nhớ trên SQL Server® 2019 (Phiên bản doanh nghiệp) do các bảng được tối ưu hóa bộ nhớ (Xử lý giao dịch trực tuyến trong bộ nhớ (OLTP)) gây ra. Các bước tương tự áp dụng cho SQL Server 2014 trở lên.
Bạn có thể thấy các thông báo lỗi sau nhấp nháy trên màn hình của mình:
Message: MSSQL on Windows: Stolen Server Memory is too high
Source: XXXXX\MSSQLSERVER Path: Not Present Alert
description: SQL instance "MSSQLSERVER" Stolen Server Memory on
computer "XXXXXXX.XXX.com" is too high.
Message: SQL Server Alert System: 'Severity 17' occurred on \\XXXXXXX
DESCRIPTION: There is insufficient system memory in resource pool 'internal'
to run this query.
Message: Disallowing page allocations for database 'InMemoryDB' due to
insufficient memory in the resource pool 'default'. See
'https://go.microsoft.com/fwlink/?LinkId=510837' for more information.
Message: XTP failed page allocation due to memory pressure: FAIL_PAGE_ALLOCATION 32
Giải pháp
Thực hiện các bước sau để gỡ rối và giải quyết vấn đề này:
Bước một
Bước đầu tiên là kiểm tra mức tiêu thụ bộ nhớ trong vùng đệm SQL.
Như bạn có thể thấy từ hình ảnh trước, cơ sở dữ liệu được đề cập, InMemoryDB , chỉ tiêu thụ 0,017% vùng đệm.
Bước hai
Sau đó, bạn kiểm tra Thư ký bộ nhớ hệ điều hành bằng lệnh T-SQL sau:
select * from sys.dm_os_memory_clerks order by pages_kb desc
Kết quả cho thấy rằng tổng số người tiêu dùng hàng đầu chiếm khoảng 80% tổng bộ nhớ máy chủ tối đa.
Kích thước của các bảng được tối ưu hóa bộ nhớ cũng nhỏ hơn 2 GB, bạn có thể thấy trong hình ảnh trước cho tên, DB_ID_6 . Vì vậy, lý tưởng là không nên có bất kỳ áp lực bộ nhớ nào trên máy chủ.
Bước ba
Sau khi xem xét các liên kết Hết bộ nhớ (OOM) được đề cập trong nhật ký lỗi, https://go.microsoft.com/fwlink/?LinkId=510837 , bạn cần liên kết cơ sở dữ liệu với các bảng được tối ưu hóa bộ nhớ với một nhóm tài nguyên. Liên kết này là một phương pháp hay nhất cho cơ sở dữ liệu với các bảng được tối ưu hóa bộ nhớ. Làm theo các bước để tạo một nhóm tài nguyên trong trình quản lý tài nguyên và liên kết cơ sở dữ liệu.
Các phương pháp hay nhất khuyên bạn nên bảo vệ SQL Server khỏi việc các tài nguyên của nó được tích lũy bởi một hoặc nhiều bảng được tối ưu hóa bộ nhớ và ngăn những người dùng bộ nhớ khác tiêu thụ bộ nhớ cần thiết bởi các bảng được tối ưu hóa bộ nhớ. Do đó, bạn nên tạo một nhóm tài nguyên riêng biệt để quản lý mức tiêu thụ bộ nhớ cho cơ sở dữ liệu với các bảng được tối ưu hóa bộ nhớ.
Hãy ghi nhớ những điểm sau khi thêm cơ sở dữ liệu vào nhóm tài nguyên:
- Bạn chỉ có thể liên kết cơ sở dữ liệu trên một nhóm tài nguyên.
- Bạn có thể liên kết nhiều cơ sở dữ liệu vào cùng một nhóm.
- SQL Server cho phép liên kết cơ sở dữ liệu không có bảng được tối ưu hóa bộ nhớ với nhóm nguồn, nhưng nó không có tác dụng.
- Bạn có thể tạo các bảng được tối ưu hóa bộ nhớ trong cơ sở dữ liệu sau khi liên kết nó với nhóm nguồn.
Các bước để liên kết với một nhóm tài nguyên
-
Tạo nhóm tài nguyên với phân bổ bộ nhớ:
USE [master] GO CREATE RESOURCE POOL [Admin_Pool] WITH(min_cpu_percent=0, max_cpu_percent=100, min_memory_percent=15, max_memory_percent=15, cap_cpu_percent=100, AFFINITY SCHEDULER = AUTO, min_iops_per_volume=0, max_iops_per_volume=0) GO
Lưu ý :Để tránh tình trạng hết bộ nhớ, các giá trị cho min_memory_percent và max_memory_percent nên giống nhau.
Trong trường hợp này, các bảng được tối ưu hóa bộ nhớ rất nhỏ, với 15% tổng bộ nhớ máy chủ được phân bổ cho nhóm tài nguyên. Đừng quên sử dụng các liên kết trong các tham chiếu để tính toán phần trăm bộ nhớ trong môi trường của bạn.
-
Xác minh nhóm tài nguyên và liên kết cơ sở dữ liệu với nó:
EXEC sp_xtp_bind_db_resource_pool 'InMemoryDB', 'Admin_Pool' GO
-
Xác minh liên kết trong sys.databases :
SELECT d.database_id, d.name, d.resource_pool_id FROM sys.databases d GO
-
Khởi động lại cơ sở dữ liệu để làm cho ràng buộc hoạt động:
ALTER DATABASE DB_Name SET OFFLINE GO ALTER DATABASE DB_Name SET ONLINE GO
Lưu ý :Nếu cơ sở dữ liệu luôn bật, hãy thực hiện các bước trên cả hai nút và chuyển sang Bước 4 (khởi động lại cơ sở dữ liệu), thực hiện chuyển đổi dự phòng cơ sở dữ liệu sang phiên bản thứ hai.
Kết luận
Trong trường hợp này, tất cả các cảnh báo liên quan đến áp suất bộ nhớ đã dừng lại sau khi thêm cơ sở dữ liệu với các bảng được tối ưu hóa bộ nhớ vào nhóm tài nguyên. Tôi đã theo dõi nhật ký lỗi SQLServer trong vài tuần cho vấn đề cụ thể này và không có dấu vết của bất kỳ áp lực bộ nhớ nào. Các bước này đã giúp khắc phục áp lực bộ nhớ trên cấp công cụ cơ sở dữ liệu với thời gian chết tối thiểu.
Sử dụng tab Phản hồi để đưa ra bất kỳ nhận xét hoặc đặt câu hỏi nào. Bạn cũng có thể bắt đầu cuộc trò chuyện với chúng tôi.