Tại sao cơ sở dữ liệu Azure SQL (SQL Server) của tôi bị quá tải với IO dữ liệu trong một khoảng thời gian? [đóng cửa]


9

Tôi đang chạy cơ sở dữ liệu Azure SQL theo phiên bản S2 (50 DTU). Việc sử dụng bình thường của máy chủ thường treo khoảng 10% DTU. Tuy nhiên, máy chủ này thường xuyên rơi vào trạng thái nơi nó sẽ gửi mức sử dụng cơ sở dữ liệu DTU tới 85-90% trong nhiều giờ. Sau đó, đột nhiên nó quay trở lại mức sử dụng 10% bình thường.

nhập mô tả hình ảnh ở đây

Các truy vấn đối với máy chủ từ ứng dụng dường như vẫn hoạt động nhanh chóng trong trạng thái quá tải này.

Tôi có thể mở rộng máy chủ từ S2 => bất cứ thứ gì (ví dụ S3) => S2 và dường như xóa hết trạng thái được treo. Nhưng sau đó vài giờ, nó sẽ lặp lại chu kỳ trạng thái quá tải tương tự. Một điều kỳ lạ khác mà tôi nhận thấy là nếu tôi chạy máy chủ này trên gói S3 (100 DTU) 24/7 thì tôi đã không quan sát thấy hành vi này. Nó dường như chỉ xảy ra khi tôi hạ thấp cơ sở dữ liệu xuống gói S2 (50 DTU). Trong kế hoạch S3, tôi luôn luôn sử dụng 5-10% DTU. Rõ ràng là không được sử dụng đúng mức.

Tôi đã kiểm tra các báo cáo truy vấn Azure SQL để tìm kiếm các truy vấn giả mạo, nhưng tôi thực sự không thấy điều gì bất thường và nó hiển thị các truy vấn của tôi bằng cách sử dụng các tài nguyên như tôi mong đợi.

nhập mô tả hình ảnh ở đây

Như chúng ta có thể thấy ở đây, việc sử dụng tất cả đều đến từ Data IO. Nếu tôi thay đổi báo cáo hiệu suất ở đây để hiển thị các truy vấn IO dữ liệu hàng đầu theo MAX, chúng tôi sẽ thấy điều này:

nhập mô tả hình ảnh ở đây

Nhìn vào các yêu cầu chạy dài này dường như chỉ ra các cập nhật thống kê. Không thực sự bất cứ điều gì chạy từ ứng dụng của tôi. Ví dụ: truy vấn 16302 có hiển thị:

SELECT StatMan([SC0], [SC1], [SC2], [SB0000]) FROM (SELECT TOP 100 PERCENT [SC0], [SC1], [SC2], step_direction([SC0]) over (order by NULL) AS [SB0000]  FROM (SELECT [UserId] AS [SC0], [OrganizationId] AS [SC1], [Id] AS [SC2] FROM [dbo].[Cipher] TABLESAMPLE SYSTEM (1.250395e+000 PERCENT) WITH (READUNCOMMITTED) ) AS _MS_UPDSTATS_TBL_HELPER ORDER BY [SC0], [SC1], [SC2], [SB0000] ) AS _MS_UPDSTATS_TBL  OPTION (MAXDOP 16)

Nhưng một lần nữa, báo cáo cũng cho thấy các truy vấn này chỉ sử dụng một tỷ lệ nhỏ trong việc sử dụng Data IO trên máy chủ (<4%). Tôi cũng chạy các cập nhật thống kê (và xây dựng lại chỉ mục) trên toàn bộ cơ sở dữ liệu hàng tuần như một phần của bảo trì thường xuyên.

Dưới đây là một báo cáo khác cho thấy các truy vấn IO dữ liệu MAX trong khoảng thời gian chỉ bao gồm vài giờ trong sự cố sử dụng tài nguyên cao.

nhập mô tả hình ảnh ở đây

Như chúng ta có thể thấy, thực sự không có bất kỳ truy vấn nào báo cáo việc sử dụng IO dữ liệu quan trọng.

Tôi cũng đã chạy sp_who2sp_whoisacivetrên cơ sở dữ liệu và không thực sự thấy bất cứ điều gì nhảy ra khỏi tôi (mặc dù tôi sẽ thừa nhận tôi không phải là một chuyên gia với các công cụ này).

Làm thế nào để tôi tìm ra những gì đang xảy ra ở đây? Tôi không nghĩ rằng bất kỳ truy vấn ứng dụng nào của tôi đều đổ lỗi cho việc sử dụng tài nguyên này và tôi có cảm giác rằng có một số quy trình nội bộ đang chạy trong nền trên máy chủ đang giết chết nó.


Vì vậy, bạn đang thấy rằng có các số liệu thống kê cập nhật đang chạy, điều này đương nhiên sẽ có một số chi phí I / O khá liên quan, phải không? Nếu truy vấn đó là 4% tổng số IO trong suốt 24 giờ, bạn có nghĩ rằng nó vẫn có thể là người đóng góp cho các đột biến bạn nhìn thấy trong biểu đồ không? Tôi sẽ do dự khi sử dụng từ "quá tải" khi bạn không sử dụng tối đa DTU của mình và hiệu suất truy vấn của bạn vẫn có thể chấp nhận được. Tại sao vấn đề là máy chủ sử dụng tài nguyên của nó theo thời gian khác nhau?
LowlyDBA

@LowlyDBA Tôi không chắc làm thế nào tôi có thể xác thực rằng truy vấn là nguyên nhân gây ra điều này. Khi nó chỉ hiển thị mức sử dụng 4%, tôi không nghĩ rằng điều đó sẽ dẫn đến việc sử dụng gần 100% ngưỡng DTU tổng thể. Có rất nhiều cách sử dụng không được tính đến ở đây. Về cơ bản tôi đang cố gắng tìm hiểu tại sao điều này xảy ra. Các đột biến kéo dài hàng giờ liên tục đang đặt máy chủ rất gần 100% và như đã đề cập, điều này dường như hoàn toàn không xảy ra khi tôi nhân đôi tài nguyên DTU có sẵn (gói S3).
kspearrin

Hãy nhớ DTU không chỉ là I / O, nó còn là CPU và bộ nhớ . Vì vậy, so sánh hai có lẽ không phải là một số liệu hữu ích. Gì truy vấn thực hiện cái nhìn sâu sắc công cụ cung cấp cho bạn một sự cố hình ảnh của các nguồn lực trong một cửa sổ nhỏ (chỉ là giờ bạn nhìn thấy các cành)?
LowlyDBA

@LowlyDBA Các ảnh chụp màn hình báo cáo tôi đã đăng ở trên dường như cho thấy rõ các tài nguyên đều đến từ Data IO. CPU và Log IO không thực sự là một yếu tố quan trọng. Ví dụ: xem xét các truy vấn của Max CPU% chỉ trỏ đến người vi phạm lớn nhất chỉ sử dụng 2% trong vài giờ trong khi sự cố đang xảy ra. Ảnh chụp màn hình: imgur.com/rxyMLc9
kspearrin

1
@DirkBoer Trong trường hợp của chúng tôi, điều này dường như liên quan đến thống kê truy vấn tổng hợp đang chạy trên máy chủ. Chúng tôi đã tắt thống kê tự động trên các bảng nhất định để giúp giải quyết vấn đề.
kspearrin

Câu trả lời:


1

Vì trong quá trình tăng đột biến, hoạt động nhật ký của bạn là tối thiểu, chúng tôi có thể cho rằng không có (hoặc nhiều) DUI đang diễn ra.

Bạn đề cập đến một điểm rằng sự tăng đột biến không ảnh hưởng đến hiệu suất, và tại một điểm khác mà nó làm. Đó là cái gì

Bạn cũng đề cập rằng điều này biến mất sau một hoạt động quy mô. Điều này có ý nghĩa vì nó tương tự như khởi động lại tại chỗ, điều này sẽ giết chết tất cả các quy trình một cách hiệu quả, v.v.

Tôi có giả định chính xác khi đoán rằng cơ sở dữ liệu này đang được truy cập từ tầng ứng dụng không? Nếu vậy, tôi nghi ngờ rằng các kết nối của bạn không được đóng đúng cách . Bộ thu gom rác được cho là sẽ xử lý những thứ này cuối cùng (không nên dựa vào), nhưng tôi đã thấy tình huống chính xác này xảy ra do các kết nối không được tiết lộ từ tầng ứng dụng. Trong trường hợp của chúng tôi, ứng dụng quá bận rộn đến nỗi cuối cùng chúng tôi đã nhận được các lỗi kết nối đồng thời, điều này dẫn đến sự cố.

Hãy thử truy vấn sau trong quá trình tăng đột biến:

SELECT
    c.session_id, c.net_transport, c.encrypt_option,
    s.status,
    c.auth_scheme, s.host_name, s.program_name,
    s.client_interface_name, s.login_name, s.nt_domain,
    s.nt_user_name, s.original_login_name, c.connect_time,
    s.login_time
FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s
    ON c.session_id = s.session_id
ORDER BY c.connect_time ASC

Nếu tôi đúng, bạn sẽ tìm thấy cả đống hồ sơ được trả về với trạng thái Sleepinghoặc tệ hơn Running. Nếu đó là trường hợp bạn có vấn đề thậm chí còn lớn hơn trong tầng ứng dụng.

Chúng ta có thể gỡ lỗi thêm bằng cách sao chép cơ sở dữ liệu, sử dụng truy vấn sau (sử dụng lớp cơ bản để tránh chi phí quá cao) và giám sát hành vi này.

CREATE DATABASE Database1_copy AS COPY OF Database1 ( EDITION = 'basic' );

1
Có, cơ sở dữ liệu được truy cập từ một tầng ứng dụng, nhưng theo như tôi có thể nói tất cả các kết nối được gói chính xác trong các usingcâu lệnh. Thông tin tôi đã đăng trong câu hỏi ban đầu dường như chỉ ra rằng dữ liệu IO chịu trách nhiệm cho các đột biến.
kspearrin

1
@pimbrouwers: Bạn có thể giải thích cụ thể tại sao một kết nối trong trạng thái ngủ / chạy là xấu? Sự hiểu biết của tôi về nhóm kết nối là các kết nối có thể ở trạng thái như một phần của hoạt động bình thường.
obaylis
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.