Computer >> Máy Tính >  >> Lập trình >> Cơ sở dữ liệu

Xử lý cảnh báo áp suất bộ nhớ từ các bảng được tối ưu hóa bộ nhớ trong SQL Server

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.

Xử lý cảnh báo áp suất bộ nhớ từ các bảng được tối ưu hóa bộ nhớ trong SQL Server

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
Xử lý cảnh báo áp suất bộ nhớ từ các bảng được tối ưu hóa bộ nhớ trong SQL Server

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

  1. 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 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.

  2. 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
    
  3. 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
    
    Xử lý cảnh báo áp suất bộ nhớ từ các bảng được tối ưu hóa bộ nhớ trong SQL Server
  4. 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.