Vấn đề hết bộ nhớ trên SQL Server 2012 SP3


8

Tôi đã gặp lỗi OOM SQL Server định kỳ, một lần đến thời điểm SQL Server tự tắt và luôn xảy ra vào ban đêm, khi không có ai sử dụng nó và không có công việc SQL Agent nào chạy vào thời điểm đó:

Đây là lỗi điển hình:

17/08/2017 19: 31: 17, spid100, Không xác định, Không đủ bộ nhớ hệ thống trong nhóm tài nguyên 'nội bộ' để chạy truy vấn này.

17/08/2017 19: 31: 17, spid100, Không rõ, Lỗi: 701 Mức độ nghiêm trọng: 17 Bang: 123.

17/08/2017 19: 31: 17, spid112, Không rõ, Lỗi: 18056 Mức độ nghiêm trọng: 20 Bang: 29. (Params :). Lỗi được in ở chế độ terse vì có lỗi trong quá trình định dạng. Truy tìm thông báo ETW, vv được bỏ qua.

Đây là thông tin máy chủ:

  • Bộ nhớ máy chủ SQL 10GB MIN
  • Bộ nhớ máy chủ 21 GB MAX SQL
  • chỉ có 4 DB trên máy chủ
  • kích thước của chúng chỉ từ 1 đến 2 GB
  • Kích thước Tempdb không bao giờ tăng lên hơn 1GB (được đặt thành tự động tăng lên 10GB)
  • Các chỉ mục đều thấp, chỉ số cập nhật
  • Phiên bản:

    Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 
        Oct 20 2015 15:36:27 
        Copyright (c) Microsoft Corporation
        Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

Tôi đã kiểm tra nhiều mặt hàng:

  • Bộ nhớ DBCC
  • Số liệu thống kê nhanh:

    SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
    FROM sys.dm_os_process_memory;
    GO
    
    Output:
    20 GB
    Page Life Expectancy                     155932
  • Không có thống đốc tài nguyên được kích hoạt:

    select pool_id, cache_memory_kb, used_memory_kb,
           out_of_memory_count,used_memgrant_kb
      from sys.dm_resource_governor_resource_pools
    
    Output:
    
    pool_id | cache_memory_kb | used_memory_kb | out_of_memory_count | used_memgrant_kb
    --------+-----------------+----------------+---------------------+-----------------
          1 |          295368 |         641416 |                   0 |                0
    
    
    select (physical_memory_in_use_kb/1024) Memory_usedby_Sqlserver_MB,
           (locked_page_allocations_kb/1024) Locked_pages_used_Sqlserver_MB,
           (total_virtual_address_space_kb/1024 )Total_VAS_in_MB,
           process_physical_memory_low,
           process_virtual_memory_low
      from sys. dm_os_process_memory
    
    Output:
    
    Memory_usedby_Sqlserver_MB | Locked_pages_used_Sqlserver_MB | Total_VAS_in_MB | process_physical_memory_low | process_virtual_memory_low
    ----------------------------------------------------------------------------------------------------------------------------------------
                         20553 |                          20393 |       134217727 |                           0 |                          0

Máy chủ đang sử dụng SP3, tôi biết đã xảy ra sự cố rò rỉ bộ nhớ trong SP1, vì vậy loại trừ nó ra.

Bất cứ ai cũng nhận thấy bất cứ điều gì trong kết quả DBCC mà tôi nên tập trung vào?


1
Có bất kỳ dịch vụ / ứng dụng nào khác được lưu trữ trên máy chủ này không? Tài khoản SQL Server Service có phải là một phần của các trang bị khóa trong Chính sách bảo mật cục bộ không? Nhật ký sự kiện Windows có chỉ ra bất kỳ vấn đề nào khác trong khoảng thời gian bạn gặp sự cố máy chủ SQL không?
John Eisbrener

-Không có ứng dụng khác được lưu trữ trên máy chủ này, đó là máy chủ SQL chuyên dụng. Tài khoản dịch vụ máy chủ -Query là một phần của nhóm quản trị viên windows. - Tôi chỉ thấy một loạt các lỗi VSS: Lỗi dịch vụ sao chép âm lượng: Lỗi truy vấn lỗi không mong muốn cho giao diện IVssWriterCallback. hr = 0x80070005, Truy cập bị từ chối. . Điều này thường được gây ra bởi cài đặt bảo mật không chính xác trong quá trình người viết hoặc người yêu cầu. Hoạt động: Thu thập bối cảnh dữ liệu của người viết: Id lớp của nhà văn: {35e81631-13e1-48db-97fc-d5bc721bb18a} Tên người viết: NPS VSS Nhà văn ID Instance ID: {...}
user132852 17/8/17

1
Máy chủ có phải là máy ảo không? Nếu vậy, nó có tài nguyên bộ nhớ "chuyên dụng" hay nó chia sẻ với các máy ảo khác? Và, nếu nó chia sẻ bộ nhớ, việc phân phối tài nguyên bộ nhớ có bị quá tải không? Tôi đã thấy điều này xảy ra (bất kể phiên bản nào) trên các máy chủ VM nơi bộ nhớ được phân bổ quá mức.
SQL_Hacker

3
Cảm ơn bạn Shanky. Chỉ cần cập nhật, tôi đã phát hiện sự cố vào thứ Sáu tuần trước sau khi thêm nó vào giám sát, nó xuất hiện một trong các phiên giám sát ứng dụng trong ứng dụng (bên thứ ba) không được cấu hình đúng, phiên kết nối không đóng cho đến vài giờ sau khi OOM Giết nó
user132852

1
@ user132852 bạn có thể đưa giải pháp của mình vào câu trả lời và đánh dấu câu trả lời.
Thomas Kronawitter

Câu trả lời:


2

Vì Máy chủ SQL đang chạy trong VM, như được chỉ báo bởi (hypervisor)chỉ báo trong câu lệnh phiên bản, bạn nên đảm bảo rằng nó có bộ nhớ dự trữ trong VMWare (hoặc Hyper-V, v.v.) trên máy chủ.

Việc đặt trước bộ nhớ thường là 100% bộ nhớ được phân bổ cho VM cho các máy ảo SQL Server được sử dụng trong môi trường sản xuất. Nếu không có bộ nhớ, máy chủ lưu trữ có thể "đánh cắp" bộ nhớ khỏi máy ảo thông qua việc sử dụng "trình điều khiển khinh khí cầu" để một số VM khác sử dụng, có khả năng là nguyên nhân gây ra tình trạng hết bộ nhớ của bạn.

Trong VMWare vCenter, để đặt Lưu trữ bộ nhớ trên máy ảo:

  1. Tắt nguồn máy ảo trước khi định cấu hình cài đặt bộ nhớ.

  2. Trong vSphere Client, nhấp chuột phải vào máy ảo từ kho lưu trữ và chọn Chỉnh sửa cài đặt.

  3. Trong cửa sổ Thuộc tính máy ảo, chọn tab Tài nguyên và chọn Bộ nhớ.

  4. Trong bảng Phân bổ tài nguyên, chọn hộp kiểm Dự trữ tất cả bộ nhớ khách (Tất cả đã khóa).

  5. Nhấn OK.

Nếu bạn đang sử dụng Microsoft Hyper-V, hãy tắt bộ nhớ động cho VM, sử dụng quy trình này trong Trình quản lý Hyper-V:

  1. Đảm bảo VM đã tắt.
  2. Nhấp chuột phải vào VM, chọn "Cài đặt"
  3. Chọn "Bộ nhớ" từ khung bên trái.
  4. Đảm bảo "Kích hoạt bộ nhớ động" không được kiểm tra.
  5. Khởi động VM.

1

Một vài thay đổi về cấu hình tôi sẽ thực hiện:

  1. Xóa các cài đặt bộ nhớ tối thiểu, theo nghĩa đen là không cần điều này.
    • Lý do bạn muốn thay đổi điều này là vì nếu điều này được đặt, SQL Server sẽ không bao giờ giải phóng bộ nhớ dưới nhãn hiệu. Nếu các trang bị khóa trong bộ nhớ, bộ nhớ không còn có thể được phân trang.
  2. Điều chỉnh bộ nhớ sever tối đa thành 75% tổng số cho tổng <32gb hoặc 87,5% cho tổng> 32gb.
    • Giả sử SQL Server là thứ duy nhất chạy trên máy, hãy để nó tiêu thụ bất kỳ bộ nhớ nào còn lại sau khi cấp cho bộ nhớ đủ hệ điều hành để hoạt động đúng.

Bạn có thể sử dụng đoạn script sau để thực hiện điều này:

use master;
go

-- MIN Server Memory
exec sys.sp_configure
    'min server memory (MB)'
    ,0;

-- MAX Server Memory
declare
  @systemMemory int
  ,@maxServerMemory int;

select
  @systemMemory = total_physical_memory_kb / 1024
from
  sys.dm_os_sys_memory;

set @maxServerMemory = floor(@systemMemory * .75);

if @systemMemory >= 32768
  begin
    set @maxServerMemory = floor(@systemMemory * .875);
  end;

exec sys.sp_configure
  'max server memory (MB)'
  ,@maxServerMemory;

reconfigure;
go

3
Tôi biết rằng đây là những thực tiễn tốt nhất tiêu chuẩn, nhưng bạn có thể giải thích một chút về việc thay đổi chúng sẽ giúp gì với lỗi mà chúng gặp phải không?
Erik Darling
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.