SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

HADR_THROTTLE_LOG_RATE_MISMATCHED_SLO によるトランザクションログの書き込み性能の低下について

leave a comment

2019/6 に SQL Database の変更が入り、Geo レプリケーションが有効な環境で異なるサービスレベルを使用している場合に、プライマリサーバーの更新に Geo セカンダリサーバーが追いつけなくなると性能調整が行われるようになりました。

この調整が発生すると、どのような I/O 傾向になるのかを把握しておくことは重要です。

Geo レプリケーションのセカンダリが下に構成されているときに発生しますプライマリよりもサイズ (低い SLO) を計算します。 プライマリ データベースは、遅延のログの使用量のため、セカンダリで調整されます。 これは、セカンダリ データベースの変更率が、プライマリ データベースの遅れが不足しているコンピューティング容量を持つことが原因です。

となっているので、ドキュメント上は、プライマリと Geo セカンダリの性能を変えている (Geo セカンダリの方の性能を下に設定している) 場合に、調整が行われる可能性が出てきます。
本投稿では、調整が発生することで、どのような I/O 性能の低下を招くかを見てみたいと思います。
今回、検証で使用したスクリプトについては https://gist.github.com/MasayukiOzawa/e3a2ff81628d074eacf4664e36d5ecfb に残してありますので、興味のある方はカスタマイズして試していただければ。

今回は、プライマリに P4 (500 DTU) を使用し、セカンダリに P1 (125 DTU) を使用しています。
P1 と P4 では、トランザクションの書き込みのスループットが 4 倍程度異なります。
プライマリ (P4) に大量のトランザクションを発生させると、トランザクションの量によっては、セカンダリ (P1) の書き込みが性能上限に達し、トランザクションの反映に遅延が発生します。
遅延が発生した状態が継続してしまうと、Geo セカンダリにフェールオーバーした場合に損失するデータが多くなってしまいます。
それを防ぐために、大きな遅延が発生してくるとプライマリ側で「HADR_THROTTLE_LOG_RATE_MISMATCHED_SLO」という待ち事象で確認ができる、スロットリングが発生し、プライマリの書き込み性能が調整されます。
I/O の傾向としては次のようになります。
image

  • 左の Y 軸が、棒グラフとして表示しているHADR_THROTTLE_LOG_RATE_MISMATCHED_SLO の発生回数
  • 右の Y 軸が、線グラフとして表示しているトランザクションログのファイルの書き込みのスループット (MB/sec)

を示したものとなります。
処理を開始した直後には、20 MB/sec 以上の性能でトランザクションログに書き込みが発生できています。
しかし、HADR_THROTTLE_LOG_RATE_MISMATCHED_SLO の待ち事象が発生しだすと、トランザクションログの書き込みのスループットが減少していきます。
Geo セカンダリの遅延が解消できるまで、HADR_THROTTLE_LOG_RATE_MISMATCHED_SLO が発生し、プライマリのトランザクションログの書き込み性能が抑えられます。
(どこまで調整されるかですが、公式のドキュメントには記載されていませんが、値としては Geo セカンダリのトランザクションログの書き込み性能上限ぐらいまでは低下していそうな感じがあります)
プライマリのトランザクションログの書き込み性能は調整され低下しているため、時間が経過し、Geo セカンダリのトランザクションがプライマリに追いついてくると待ち事象が減少し、トランザクションログの書き込みのスループットが上昇していることが確認できますね。
image
プライマリと Geo セカンダリのトランザクションの遅延については、sys.dm_geo_replication_link_status の last_commit の値がプライマリとセカンダリでどれだけ離れているかが参考となりそうです。
次の画像は、HADR_THROTTLE_LOG_RATE_MISMATCHED_SLO が発生してる際の last_commit の値を出力したものです。
image
プライマリと Geo セカンダリについては、4 分程度、最後にコミットが発生した時間帯に差が出ています。
この状態では HADR_THROTTLE_LOG_RATE_MISMATCHED_SLO が発生していますので、プライマリの更新性能には調整が入っており、時間がたつとプライマリと Geo セカンダリの last_commit が近づき、プライマリの書き込み性能の調整が緩和され、通常の性能まで戻っていきます。
image
HADR_THROTTLE_LOG_RATE_MISMATCHED_SLO が発生している状態では、この待ち事象が発生しているクエリだけでなく、該当の DB の書き込み性能が大幅に低下した状態となります。
Geo セカンダリを使用し、セカンダリ側の性能を抑えることでコストを低下させることができますが、大量のトランザクションを発生している環境では、プライマリの更新性能が大きく抑えられるタイミングが発生する可能性があります。
Geo セカンダリを使用している環境では HADR_THROTTLE_LOG_RATE_MISMATCHED_SLO の発生状況に気を付けておくと良いのではないでしょうか。

Share

Written by Masayuki.Ozawa

9月 15th, 2019 at 5:03 pm

Leave a Reply