Trường hợp tò mò của HADR_SYNC_COMMIT chờ đợi


11

Chúng tôi đang nhận thấy một mô hình thú vị cho sự HADR_SYNC_COMMITchờ đợi trong môi trường của chúng tôi. Chúng tôi có một bản sao ba; một chính, một trong những đồng bộ thứ cấp và một async thứ trong một trung tâm dữ liệu và chúng tôi chỉ thêm ba hơn ASYNC bản sao trong một trung tâm dữ liệu (~ 2.400 dặm).

Kể từ đó, chúng tôi đã bắt đầu nhận thấy sự gia tăng rất lớn về sự HADR_SYNC_COMMITchờ đợi. Khi chúng tôi xem xét các phiên hoạt động, chúng tôi thấy một loạt các COMMIT TRANSACTIONtruy vấn đang chờ trên bản sao SYNC

Từ ảnh chụp màn hình, chúng ta có thể thấy rõ có một bước nhảy HADR_SYNC_COMMITchờ đợi vào ngày 29 tháng 6 và cuối cùng chúng ta đã bỏ 'hai' trong số ba bản sao không đồng bộ trong trung tâm dữ liệu từ xa vào buổi trưa ngày 1 tháng Bảy. Điều đó đã giảm thời gian chờ đợi đáng kể cùng với nó.

hình ảnh

Những gì chúng tôi đã kiểm tra cho đến nay - Nhật ký gửi hàng đợi, Làm lại hàng đợi, thời gian đông cứng cuối cùng và thời gian cam kết cuối cùng trên các bản sao từ xa. Chúng tôi có các đợt giao dịch nhỏ liên tục trong giờ làm việc và do đó, hàng đợi gửi khá nhỏ tại một dấu thời gian nhất định (bất kỳ nơi nào trong khoảng từ 60KB đến 1MB).
Các bản sao từ xa gần như đồng bộ, có rất ít sự khác biệt giữa thời gian cam kết cuối cùng và thời gian đông cứng cuối cùng cho bất kỳ lsn riêng lẻ nào trên bản sao.

Ống mạng là 10G và chúng tôi đã sửa đổi kích thước bộ đệm truyền từ 256 megs thành 2 hợp đồng biểu diễn, điều này được thực hiện theo giả định rằng mạng đã bỏ các gói và truyền lại chúng; một trong những cách đó dường như không giúp được gì nhiều.

Vì vậy, tôi tự hỏi các bản sao ASYNC phải làm gì với sự HADR_SYNC_COMMITchờ đợi? Không phải bản sao SYNC chỉ phụ thuộc một mình vào loại chờ này, tôi còn thiếu gì ở đây?


1
Vì vậy, có thực sự có một vấn đề? Rất nhiều người chỉ nhìn vào sự chờ đợi của họ và nói, này, đây là sự chờ đợi cao nhất, đó hẳn là một vấn đề! Chờ đợi chỉ là một con số và sẽ luôn luôn là một con số có số lượng cao nhất - điều đó không nhất thiết có nghĩa là phải giải quyết vấn đề về hiệu suất. Đối với sự chờ đợi này, có vẻ như bạn đã loại trừ nguyên nhân phổ biến nhất và vì những người thứ hai của bạn không bị tụt lại phía sau, tôi sẽ không dành nhiều năng lượng cho "vấn đề" này cho đến khi
Aaron Bertrand

bạn đã có một số triệu chứng khác cùng với số lượng cao trong bộ đếm chờ và bạn có thể tương quan với bộ đếm chờ cao.
Aaron Bertrand

@AaronBertrand Vâng, có. Các spids hoạt động trên bản sao chính chờ các khối log cứng lại trên phần thứ cấp đồng bộ hóa, sự chậm trễ / chờ đợi này lần lượt làm cho ứng dụng chậm đi đáng kể. Pagelatch_up chờ đợi vào ngày 9 tháng 7 mà bạn thấy trong ảnh chụp màn hình là do sự tranh chấp tempdb (chờ trên trang pfs), chúng tôi đã thêm nhiều tệp từ phía dba và các ứng dụng đã điều chỉnh các thủ tục được lưu trữ đánh vào tempdb rất thường xuyên để giảm thiểu vấn đề đó. Quay lại hadr_sync_waits, tại sao cam kết async ảnh hưởng đến hadr_sync_commits ở vị trí đầu tiên? Cảm ơn.
Arun Gopinath

1
Tôi đoán rằng thời gian chờ bao gồm thời gian chuyển và dữ liệu được truyền cùng nhau, async chỉ không phải chờ ack cam kết. Vì vậy, bạn càng có nhiều thư mục phụ, cho dù là đồng bộ hóa hay không đồng bộ, thì thời gian sẽ được sử dụng để chuyển hoạt động nhật ký càng nhiều (điều này không nhất thiết là thời gian đồng hồ, vì một số có thể đồng thời). Bạn có thể muốn mọi người trong mạng thử xem liệu có bất kỳ độ trễ không đáng có nào xảy ra nói chung hoặc khi bạn thêm nhiều thư mục phụ.
Aaron Bertrand

Câu trả lời:


7

Đầu tiên mô tả về sự kiện chờ đợi mà câu hỏi của bạn liên quan là:

Chờ xử lý cam kết giao dịch cho cơ sở dữ liệu thứ cấp được đồng bộ hóa để làm cứng nhật ký. Sự chờ đợi này cũng được phản ánh bởi bộ đếm hiệu suất trễ giao dịch. Loại chờ này được dự kiến ​​cho các nhóm khả dụng được đồng bộ hóa và cho biết thời gian gửi, viết và xác nhận nhật ký vào cơ sở dữ liệu thứ cấp.

https://msdn.microsoft.com/en-us/l Library / ms179984.aspx

Đi sâu vào cơ chế của sự chờ đợi này, bạn có các khối nhật ký được truyền đi và cứng lại nhưng quá trình phục hồi chưa hoàn tất trên các máy chủ từ xa. Với trường hợp này và do bạn đã thêm các bản sao bổ sung, lý do là HADR_SYNC_COMMIT của bạn có thể tăng do yêu cầu băng thông tăng. Trong trường hợp này Aaron Bertrand là chính xác trong nhận xét của mình về câu hỏi.

Nguồn: http://bloss.msdn.com/b/psssql/archive/2013/04/26/alwayson-hadron-learning-series-hadr-sync-commit-vs-writelog-wait.aspx

Đi sâu vào phần thứ hai của câu hỏi của bạn về cách chờ đợi này có thể liên quan đến sự chậm trễ của ứng dụng. Điều này tôi tin là một vấn đề nhân quả. Bạn đang nhìn vào sự chờ đợi của mình ngày càng tăng và một khiếu nại của người dùng gần đây và đưa ra kết luận có khả năng không chính xác rằng hai người có mối quan hệ khi điều này hoàn toàn không phải là trường hợp. Việc bạn đã thêm các tệp tempdb và ứng dụng của bạn trở nên phản ứng nhanh hơn với tôi cho thấy rằng bạn có thể đã gặp một số vấn đề tranh chấp tiềm ẩn có thể bị làm trầm trọng thêm bởi chi phí bổ sung của mức cô lập ảnh chụp nhanh ẩn khi cơ sở dữ liệu nằm trong nhóm khả dụng. Điều này có thể có ít hoặc không có gì để làm với sự chờ đợi HADR_SYNC_COMMIT của bạn.

Nếu bạn muốn kiểm tra điều này, bạn có thể sử dụng dấu vết sự kiện mở rộng, xem xét hadr_db_commit_mgr_update_harden XEvent trên bản sao chính của bạn và lấy đường cơ sở. Khi bạn có đường cơ sở, bạn có thể thêm các bản sao của mình trở lại từng cái một và xem dấu vết thay đổi như thế nào. Tôi đặc biệt khuyến khích bạn sử dụng một tệp nằm trên một ổ đĩa không chứa bất kỳ cơ sở dữ liệu nào và đặt cuộn qua và kích thước tối đa. Vui lòng điều chỉnh bộ lọc thời lượng khi cần thiết để thu thập các sự kiện phù hợp với sự chờ đợi của bạn để bạn có thể khắc phục sự cố và tương quan điều này với bất kỳ đội nào khác cần tham gia.

CREATE EVENT SESSION [HADR_SYNC_COMMIT-Monitor] ON SERVER  -- Run this on the primary replica 
ADD EVENT sqlserver.hadr_db_commit_mgr_update_harden(
    WHERE ([delay]>(10))) -- I strongly encourage you to use the delay filter to avoid getting too many events back, this is measured in milliseconds
ADD TARGET package0.event_file(SET filename=N'<YourFilePathHere>')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO
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.