[Amazon FSx for NetApp ONTAP] SnapMirrorの帯域制御をやってみる

SnapMirror relationship毎の帯域制御とグローバルスロットリングによる帯域制御を使い分けよう
2023.05.04

SnapMirrorの転送速度を抑えたいな

こんにちは、のんピ(@non____97)です。

皆さんはAmazon FSx for Netapp ONTAP(以降FSx for ONTAP)に移行するときにSnapMirrorの転送速度を抑えたいなと思ったことはありますか? 私はあります。

オンプレミスとの接続回線の帯域に余裕がない場合は、他のワークロードに影響が出ないように帯域制御をしたくなるものです。

また、DataSyncでは転送中であっても帯域制御をかけることが可能です。

そのようなことはSnapMirrorにもできるのでしょうか。

SnapMirrorの帯域制御について調べたので紹介します。

いきなりまとめ

  • SnapMirrorの帯域制御は2種類
    1. SnapMirror relationship毎の帯域制御
    2. グローバルスロットリングによる帯域制御
  • SnapMirror relationship毎の帯域制御が反映されるのは次回以降の転送から
    • 転送中のSnapMirrorには影響を与えない
  • グローバルスロットリングはクラスター(FSx for ONTAPファイルシステム)単位で設定
    • 複数のSnapMirrorが転送されている場合、合計の転送速度に対して影響を与える
    • 設定変更は、転送中のSnapMirrorにも影響を与える
    • incoming、outcomingそれぞれ設定が可能
    • SnapMirror Synchronousを行っているクラスターではグローバルスロットルを有効化することはできない
  • 帯域制御はどちらもKB単位で指定
    • 最小 : 4KBps
    • 最大 : 2TBps

帯域制御は2種類あるぞ

SnapMirrorの帯域制御は以下2種類あります。

  1. SnapMirror relationship毎の帯域制御
  2. グローバルスロットリングによる帯域制御

1つ目はSnapMirror relationshipで設定するため、他のSnapMirror relationshipには影響を与えません。

そのため、SnapMirror relationshipが複数ある場合に、重要度に応じて個別に調整することが可能です。

ただし、設定した帯域制御が反映されるのは次回以降の転送になります。転送中のSnapMirrorには影響を与えません。

To change the throttle of an active SnapMirror relationship, terminate the existing transfer and restart it to use the new value. SnapMirror restarts the transfer from the last restart checkpoint using the new throttle value, rather than restarting from the beginning.

(以下機械翻訳)

アクティブなSnapMirror関係のスロットルを変更するには、既存の転送を終了し、新しい値を使用して転送を再起動します。SnapMirrorは、転送を最初から再開するのではなく、新しいスロットル値を使用して、最後の 再開チェックポイントから転送を再始動します。

SnapMirror Configuration and Best Practices Guide for ONTAP 9.11.1 | TR-4015 | NetApp P.61

グローバルスロットリングはクラスター(FSx for ONTAPファイルシステム)単位で設定されます。

グローバルスロットリングの設定変更は、転送中のSnapMirrorにも影響を与えます。転送中に帯域を絞りたいときに便利ですね。

また、グローバルスロットリングはincoming、outcomingそれぞれ設定が可能です。

ただし、SnapMirror Synchronousを行っているクラスターではグローバルスロットルを有効化することはできません。(2023/5/1時点ではFSx for ONTAPはSnapMirror Synchronousをサポートしていないです)

SnapMirror relationshipとグローバルスロットリングはどちらも設定することが可能です。SnapMirror relationship単位で使用している帯域がグローバルスロットリングで設定した帯域を超過した場合に、帯域制御がかかるようです。

Global throttling works with the per-relationship throttle feature for SnapMirror transfers. The perrelationship throttle is enforced until the combined bandwidth of per-relationship transfers exceeds the value of the global throttle, after which the global throttle is enforced.

(以降機械翻訳)   グローバル スロットルは、SnapMirror転送のリレーションシップ単位のスロットル機能と連動します。関係ごとのスロットルは、関係ごとの転送の合計帯域幅がグローバル スロットルの値を超えるまで実施され、それ以降はグローバル スロットルが実施されます。

SnapMirror Configuration and Best Practices Guide for ONTAP 9.11.1 | TR-4015 | NetApp P.61

帯域制御はどちらもKB単位で指定します。最小は4KBpsで最大は2TBpsです。なお、0となっている場合は、帯域制御をしていないか、帯域幅が無制限であることを示しています。

SnapMirror relationshipによる帯域制御

帯域制御をかけていない場合

まず、帯域制御をかけていない場合を確認します。

環境は以下記事で作成したSnapMirror relationshipを使用します。

まず、存在しているSnapMirror relationshipの帯域制御が行われていないことを確認します。

# SnapMirror relationshipの一覧を確認
::> snapmirror show
                                                                       Progress
Source            Destination Mirror  Relationship   Total             Last
Path        Type  Path        State   Status         Progress  Healthy Updated
----------- ---- ------------ ------- -------------- --------- ------- --------
SVM:vol_test
            XDP  SVM:vol_test_dst
                              Snapmirrored
                                      Quiesced       -         false   -
                 SVM:vol_test_1_dst
                              Snapmirrored
                                      Quiesced       -         false   -
2 entries were displayed.

# どちらのSnapMirror relationshipも帯域制御を行っていない = unlimited であることを確認
::> snapmirror show -fields throttle
source-path  destination-path throttle
------------ ---------------- ---------
SVM:vol_test SVM:vol_test_dst unlimited
SVM:vol_test SVM:vol_test_1_dst
                              unlimited
2 entries were displayed.

SnapMirrorが一時停止しているので転送を再開させます。その前に、どちらも転送間間隔が5分間隔となっているため、1週間毎に変更して頻繁に転送されないようにします。

# 設定変更前のSnapMirror relationshipの確認
::> snapmirror show -fields status, schedule
source-path  destination-path schedule status
------------ ---------------- -------- --------
SVM:vol_test SVM:vol_test_dst 5min     Quiesced
SVM:vol_test SVM:vol_test_1_dst
                              5min     Quiesced
2 entries were displayed.

# SnapMirrorの転送間隔を1週間毎に変更
::> snapmirro modify -source-path SVM:vol_test -destination-path SVM:vol_test_dst -schedule weekly
  (snapmirror modify)
Operation succeeded: snapmirror modify for the relationship with destination "SVM:vol_test_dst".
                       
::> snapmirro modify -source-path SVM:vol_test -destination-path SVM:vol_test_1_dst -schedule weeklyy
  (snapmirror modify)
Operation succeeded: snapmirror modify for the relationship with destination "SVM:vol_test_1_dst".

# SnapMirrorの再開
::> snapmirror resume -source-path SVM:vol_test -destination-path SVM:vol_test_dst
Operation succeeded: snapmirror resume for destination "SVM:vol_test_dst".

::> snapmirror resume -source-path SVM:vol_test -destination-path SVM:vol_test_1_dst
Operation succeeded: snapmirror resume for destination "SVM:vol_test_1_dst".

# 設定変更後のSnapMirror relationshipの確認
::> snapmirror show -fields status, schedule
source-path  destination-path schedule status
------------ ---------------- -------- ------
SVM:vol_test SVM:vol_test_dst weekly   Idle
SVM:vol_test SVM:vol_test_1_dst
                              weekly   Idle
2 entries were displayed.

SnapMirrorの準備ができました。

NFSクライアントからSnapMirrorの転送元ボリュームをマウントして、512MiBのテストファイルを作成します。

# SnapMirrorの転送元ボリュームをマウント
$ sudo mount -t nfs svm-0404cd705c847e961.fs-05f72eb8f8d03c709.fsx.us-east-1.amazonaws.com:/vol_test /mnt/fsxn/vol_test/

# マウントされたことを確認
$ df -hT -t nfs4
Filesystem                                                                       Type  Size  Used Avail Use% Mounted on
svm-0404cd705c847e961.fs-05f72eb8f8d03c709.fsx.us-east-1.amazonaws.com:/vol_test nfs4   16G  9.4G  5.9G  62% /mnt/fsxn/vol_test

# テストファイルの作成
$ sudo dd if=/dev/urandom of=/mnt/fsxn/vol_test/throttle-test bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 2.85655 s, 188 MB/s

手動でSnapMirrorの転送を開始し、転送完了後に転送サイズと転送時間を確認します。

# 手動でSnapMirrorの転送を開始
::> snapmirror update -source-path SVM:vol_test -destination-path SVM:vol_test_dst
Operation is queued: snapmirror update of destination "SVM:vol_test_dst".

# SnapMirrorで転送したサイズと転送時間を確認
::> snapmirror show -source-path SVM:vol_test -fields last-transfer-size, last-transfer-duration
source-path  destination-path last-transfer-size last-transfer-duration
------------ ---------------- ------------------ ----------------------
SVM:vol_test SVM:vol_test_dst 524.8MB            0:0:41
SVM:vol_test SVM:vol_test_1_dst
                              -                  -
2 entries were displayed.

524.8MBを転送するのに41秒かかっていることから、転送速度は12.8MBですね。

8MBpsに変更した場合

それでは帯域制御を8MBpsに設定した場合の転送速度を確認します。

# 帯域制御を8MBpsに設定
::> snapmirror modify -source-path SVM:vol_test -destination-path SVM:vol_test_dst -throttle 8192
Operation succeeded: snapmirror modify for the relationship with destination "SVM:vol_test_dst".

# 帯域制御を8MBpsに設定されていることを確認
::> snapmirror show -source-path SVM:vol_test -destination-path SVM:vol_test_dst -fields throttle
source-path  destination-path throttle
------------ ---------------- --------
SVM:vol_test SVM:vol_test_dst 8192

NFSクライアントからテストファイルを作り直して差分が出るようにします。

$ sudo dd if=/dev/urandom of=/mnt/fsxn/vol_test/throttle-test bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 2.85109 s, 188 MB/s

手動でSnapMirrorの転送を開始し、転送完了後に転送サイズと転送時間を確認します。

::> snapmirror update -source-path SVM:vol_test -destination-path SVM:vol_test_dst
Operation is queued: snapmirror update of destination "SVM:vol_test_dst".

::> snapmirror show -source-path SVM:vol_test -destination-path SVM:vol_test_dst -fields last-transfer-size, last-transfer-duration
source-path  destination-path last-transfer-size last-transfer-duration
------------ ---------------- ------------------ ----------------------
SVM:vol_test SVM:vol_test_dst 524.9MB            0:1:30

転送速度は5.83MBpsでした。帯域制御がかかっていそうですね。

他のSnapMirror relationshipには帯域制御がかからないことも確認します。

# SnapMirror Labelを付与したSnapshotを作成
::> snapshot create -vserver SVM -volume vol_test -snapshot daily.2023-0504_0957 -snapmirror-label daily

# 手動でSnapVaultの転送を開始
::> snapmirror update -source-path SVM:vol_test -destination-path SVM:vol_test_1_dst
Operation is queued: snapmirror update of destination "SVM:vol_test_1_dst".

# SnapVaultで転送したサイズと転送時間を確認
::> snapmirror show -source-path SVM:vol_test -destination-path SVM:vol_test_1_dst -fields last-transfer-size, last-transfer-duration
source-path  destination-path   last-transfer-size last-transfer-duration
------------ ------------------ ------------------ ----------------------
SVM:vol_test SVM:vol_test_1_dst 524.9MB            0:0:27

こちらのSnapMirror relationshipの転送速度は19.4MBpsでした。他のSnapMirror relationshipには影響を与えていないことが分かりますね。

転送中に4MBpsに変更した場合

次に、SnapMirror relationship単位の帯域制御は転送中のものには反映されないことを確認します。

転送中に帯域制御を8MBpsを4MBpsに変更します。

NFSクライアントからテストファイルを作り直して差分が出るようにします。

$ sudo dd if=/dev/urandom of=/mnt/fsxn/vol_test/throttle-test bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 2.86254 s, 188 MB/s

転送中に帯域制御を8MBpsを4MBpsに変更します。

# 手動でSnapMirrorの転送を開始
::> snapmirror update -source-path SVM:vol_test -destination-path SVM:vol_test_dst
Operation is queued: snapmirror update of destination "SVM:vol_test_dst".

# 帯域制御を4MBpsに設定
::> snapmirror modify -source-path SVM:vol_test -destination-path SVM:vol_test_dst -throttle 4096
Operation succeeded: snapmirror modify for the relationship with destination "SVM:vol_test_dst".

# 帯域制御を4MBpsに設定されていることを確認
::> snapmirror show -source-path SVM:vol_test -destination-path SVM:vol_test_dst -fields throttle
source-path  destination-path throttle
------------ ---------------- --------
SVM:vol_test SVM:vol_test_dst 4096

# SnapMirrorで転送したサイズと転送時間を確認
::> snapmirror show -source-path SVM:vol_test -destination-path SVM:vol_test_dst -fields last-transfer-size, last-transfer-duration
source-path  destination-path last-transfer-size last-transfer-duration
------------ ---------------- ------------------ ----------------------
SVM:vol_test SVM:vol_test_dst 524.9MB            0:1:20

転送速度は6.56MBpsと変わらないことが分かりました。

グローバルスロットルによる帯域制御

同時転送数が1つの場合

次にグローバルスロットルによる帯域制御を確認します。

以下NetAppのKBに従って、incomingを4MBpsに設定します。

# グローバルスロットリングの有効化
::> options -option-name replication.throttle.enable on

Error: There are no entries matching your query.

# incomingのグローバルスロットルの設定
::> options -option-name replication.throttle.incoming.max_kbs 4096
1 entry was modified.

# 現在の設定値の確認
::> options

FsxId05f72eb8f8d03c709
    replication.throttle.incoming.max_kbs
                                      4096                 -
    replication.throttle.outgoing.max_kbs
                                      -                    -
2 entries were displayed.

グローバルスロットリングを明示的に有効化することはできませんでしたが、incomingのグローバルスロットルの設定はできました。

この状態で、帯域制御をしていないSnapMirror relationshipを手動で転送します。

# 帯域制御をしていないことを確認
::> snapmirror show -source-path SVM:vol_test -destination-path SVM:vol_test_1_dst -fields throttle
source-path  destination-path   throttle
------------ ------------------ ---------
SVM:vol_test SVM:vol_test_1_dst unlimited

# SnapMirror Labelを付与したSnapshotを作成
::> snapshot create -vserver SVM -volume vol_test -snapshot daily.2023-0504_1027 -snapmirror-label daily

# 手動でSnapVaultの転送を開始
::> snapmirror update -source-path SVM:vol_test -destination-path SVM:vol_test_1_dst
Operation is queued: snapmirror update of destination "SVM:vol_test_1_dst".

# SnapVaultで転送したサイズと転送時間を確認
::> snapmirror show -source-path SVM:vol_test -destination-path SVM:vol_test_1_dst -fields last-transfer-size, last-transfer-duration
source-path  destination-path   last-transfer-size last-transfer-duration
------------ ------------------ ------------------ ----------------------
SVM:vol_test SVM:vol_test_1_dst 524.9MB            0:2:27

転送速度は3.5MBpsでした。帯域制御がしっかりかかっていますね。

同時転送数が2つの場合

次に、2つ同時にSnapMirrorの転送を行った時に、グローバルスロットルによる帯域制御がどのようにかかるのかを確認します。

クラスターのSnapMirror全体の転送速度が4MBpsになるのか、それともSnapMirror relationshipそれぞれ転送速度が4MBpsになるのか気になります。

まず、NFSクライアントからテストファイルを作り直して差分が出るようにします。

$ sudo dd if=/dev/urandom of=/mnt/fsxn/vol_test/throttle-test bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 3.09033 s, 174 MB/s

手動でSnapMirrorの転送を開始し、転送完了後に転送サイズと転送時間を確認します。

# SnapMirror Labelを付与したSnapshotを作成
::> snapshot create -vserver SVM -volume vol_test -snapshot daily.2023-0504_1039 -snapmirror-label daily

# 手動でSnapMirror / SnapVaultの転送を開始
::> snapmirror update -source-path SVM:vol_test -destination-path SVM:vol_test_dst
Operation is queued: snapmirror update of destination "SVM:vol_test_dst".

::> snapmirror update -source-path SVM:vol_test -destination-path SVM:vol_test_1_dst
Operation is queued: snapmirror update of destination "SVM:vol_test_1_dst".

# SnapMirror / SnapVaultの転送が開始されたことを確認
::> snapmirror show
                                                                       Progress
Source            Destination Mirror  Relationship   Total             Last
Path        Type  Path        State   Status         Progress  Healthy Updated
----------- ---- ------------ ------- -------------- --------- ------- --------
SVM:vol_test
            XDP  SVM:vol_test_dst
                              Snapmirrored
                                      Transferring   9.93MB    true    05/04 10:41:30
                 SVM:vol_test_1_dst
                              Snapmirrored
                                      Transferring   61.14MB   true    05/04 10:41:30
2 entries were displayed.

# SnapMirror / SnapVaultで転送したサイズと転送時間を確認
::> snapmirror show -source-path SVM:vol_test -fields last-transfer-size, last-transfer-duration, last-transfer-end-timestamp
source-path  destination-path last-transfer-size last-transfer-duration last-transfer-end-timestamp
------------ ---------------- ------------------ ---------------------- ---------------------------
SVM:vol_test SVM:vol_test_dst 524.9MB            0:4:41                 05/04 10:45:53
SVM:vol_test SVM:vol_test_1_dst
                              524.9MB            0:4:15                 05/04 10:45:28
2 entries were displayed.

SnapMirror relationship毎の転送速度が1.8MBps、2.0MBpsで合計が3.8Mbpであることから、クラスターのSnapMirror全体の転送速度に影響を与えるようですね。

実行中の転送速度を抑えたいからといって、グローバルスロットリングを細くしすぎると全体の転送速度に影響があるので注意が必要です。

転送中にunlimitedに変更した場合

最後にSnapMirror転送中にunlimitedに変更した場合の速度を計測します。

まず、NFSクライアントからテストファイルを作り直して差分が出るようにします。

$ sudo dd if=/dev/urandom of=/mnt/fsxn/vol_test/throttle-test bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 3.0938 s, 174 MB/s

手動でSnapMirrorの転送を開始し、転送完了後に転送サイズと転送時間を確認します。

# SnapMirror Labelを付与したSnapshotを作成
::> snapshot create -vserver SVM -volume vol_test -snapshot daily.2023-0504_1057 -snapmirror-label daily

# 手動でSnapMirror / SnapVaultの転送を開始
::> snapmirror update -source-path SVM:vol_test -destination-path SVM:vol_test_dst
Operation is queued: snapmirror update of destination "SVM:vol_test_dst".

::> snapmirror update -source-path SVM:vol_test -destination-path SVM:vol_test_1_dst
Operation is queued: snapmirror update of destination "SVM:vol_test_1_dst".

# SnapMirror / SnapVaultの転送が開始されたことを確認
::> snapmirror show
                                                                       Progress
Source            Destination Mirror  Relationship   Total             Last
Path        Type  Path        State   Status         Progress  Healthy Updated
----------- ---- ------------ ------- -------------- --------- ------- --------
SVM:vol_test
            XDP  SVM:vol_test_dst
                              Snapmirrored
                                      Transferring   82.10MB   true    05/04 10:58:09
                 SVM:vol_test_1_dst
                              Snapmirrored
                                      Transferring   108.7MB   true    05/04 10:58:09
2 entries were displayed.

# incomingのグローバルスロットルを unlimited に設定
::> options -option-name replication.throttle.incoming.max_kbs unlimited
1 entry was modified.

incomingのグローバルスロットルが unlimited に設定されたことを確認
::> options

FsxId05f72eb8f8d03c709
    replication.throttle.incoming.max_kbs
                                      unlimited            -
    replication.throttle.outgoing.max_kbs
                                      -                    -
2 entries were displayed.

# SnapMirror / SnapVaultで転送したサイズと転送時間を確認
::> snapmirror show -source-path SVM:vol_test -fields last-transfer-size, last-transfer-duration, last-transfer-end-timestamp
source-path  destination-path last-transfer-size last-transfer-duration last-transfer-end-timestamp
------------ ---------------- ------------------ ---------------------- ---------------------------
SVM:vol_test SVM:vol_test_dst 524.9MB            0:2:58                 05/04 11:00:20
SVM:vol_test SVM:vol_test_1_dst
                              524.9MB            0:1:17                 05/04 10:58:39
2 entries were displayed.

明らかに転送速度が改善されていますね。転送中に帯域制御を変更したい場合はグローバルスロットリングを変更することになりますね。

SnapMirror relationship毎の帯域制御とグローバルスロットリングによる帯域制御を使い分けよう

Amazon FSx for NetApp ONTAPにおけるSnapMirrorの帯域制御をやってみました。

移行などでVPNを介して転送する場合は帯域の使用率が気になるものです。事前にどのぐらい帯域に余裕があるのか確認して、それに合わせた帯域制御を行うことが重要だと考えます。

複数のSnapMirror relationshipがある場合、帯域の空きから逆算してSnapMirror relation毎にスロットリングの設定値を考えるのも大変なので、まずはグローバルスロットリングを設定するのが良いかと思います。

SnapMirror relationship間で転送速度の優先度を変えたい場合は、グローバルスロットリングの設定値を下回る値でSnapMirror relationship単位で帯域制御をかけることになると思います。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!