AWS DataSyncのタスク実行中に帯域幅制限を変更してみた
ちょっと待って。帯域使い過ぎ
こんにちは、のんピ(@non____97)です。
皆さんはデータ転送をするときに「ちょっと待って。帯域使い過ぎ。ストップストップ」と思ったことはありますか? 私はあります。
使用している通信経路の帯域幅が細い場合、一気にデータ転送を行うと他のワークロードに思わぬ影響を与えることがあります。他にも、以下記事で紹介しているように一気にデータを流し込むと送信先のキャパオーバーとなってしまう可能性もあります。
みんな大好きDataSyncはデータ転送中に帯域幅制限を変更することが可能です。
そのため、「速度が出過ぎる!」や「帯域制限したけど思ったより余裕があった」など状況に合わせて帯域幅制限を調整する運用も可能です。
試してみたので紹介します。
いきなりまとめ
- DataSyncのタスク毎に帯域幅制限を指定することが可能
- DataSyncのタスク実行中に帯域幅制限を変更した場合、60 秒以内に実行中またはキューに入れられたタスクの実行に対して有効になる
やってみた
検証環境
検証環境は以下の通りです。
以下記事の検証をした際のS3バケットが残っていたので、再利用してあげます。
ロケーションの作成
まず、ロケーションの作成です。
いずれのロケーションもマネジメントコンソールから作成しました。
- 送信元ロケーション
-
送信先ロケーション
作成したロケーションをAWS CLIから確認すると以下のようになります。
# 送信元ロケーション $ aws datasync describe-location-s3 \ --location-arn arn:aws:datasync:us-east-1:<AWSアカウントID>:location/loc-0e8cbb070d0153792 { "LocationArn": "arn:aws:datasync:us-east-1:<AWSアカウントID>:location/loc-0e8cbb070d0153792", "LocationUri": "s3://bucket-tgw-flow-logs/", "S3StorageClass": "STANDARD", "S3Config": { "BucketAccessRoleArn": "arn:aws:iam::<AWSアカウントID>:role/service-role/AWSDataSyncS3BucketAccess-bucket-tgw-flow-logs" }, "CreationTime": "2022-12-03T05:22:31.179000+00:00" } # 送信先ロケーション $ aws datasync describe-location-s3 \ --location-arn arn:aws:datasync:us-east-1:<AWSアカウントID>:location/loc-09bdb386f10c97951 { "LocationArn": "arn:aws:datasync:us-east-1:<AWSアカウントID>:location/loc-09bdb386f10c97951", "LocationUri": "s3://nlb-access-log-non-97/bucket-tgw-flow-logs/", "S3StorageClass": "STANDARD", "S3Config": { "BucketAccessRoleArn": "arn:aws:iam::<AWSアカウントID>:role/service-role/AWSDataSyncS3BucketAccess-nlb-access-log-non-97" }, "CreationTime": "2022-12-03T05:23:38.262000+00:00" }
タスクの作成
次にタスクを作成します。
DataSyncタスクもマネジメントコンソールから作成します。
まず、送信元ロケーションを指定します。
続いて送信先ロケーションを指定します。
次にタスクの設定を行います。ここで帯域幅制限を指定できます。すぐに転送が終わると実行中に帯域幅制限を変更する余裕がないので、0.01 MiB/sを指定しました。
最後に作成するDataSyncタスクの設定内容を確認し、タスクを作成する
をクリックします。
作成されたDataSyncタスクの帯域幅制限を見ると指定した通り0.01 MiB/sになっていますね。
AWS CLIで作成したタスクを確認します。
$ aws datasync describe-task \ --task-arn arn:aws:datasync:us-east-1:<AWSアカウントID>:task/task-0515f47f43fba0d92 { "TaskArn": "arn:aws:datasync:us-east-1:<AWSアカウントID>:task/task-0515f47f43fba0d92", "Status": "AVAILABLE", "Name": "tgw-flow-logs-sync", "SourceLocationArn": "arn:aws:datasync:us-east-1:<AWSアカウントID>:location/loc-0e8cbb070d0153792", "DestinationLocationArn": "arn:aws:datasync:us-east-1:<AWSアカウントID>:location/loc-09bdb386f10c97951", "CloudWatchLogGroupArn": "arn:aws:logs:us-east-1:<AWSアカウントID>:log-group:/aws/datasync", "SourceNetworkInterfaceArns": [], "DestinationNetworkInterfaceArns": [], "Options": { "VerifyMode": "ONLY_FILES_TRANSFERRED", "OverwriteMode": "ALWAYS", "Atime": "BEST_EFFORT", "Mtime": "PRESERVE", "Uid": "NONE", "Gid": "NONE", "PreserveDeletedFiles": "PRESERVE", "PreserveDevices": "NONE", "PosixPermissions": "NONE", "BytesPerSecond": 10485, "TaskQueueing": "ENABLED", "LogLevel": "BASIC", "TransferMode": "CHANGED", "SecurityDescriptorCopyFlags": "NONE", "ObjectTags": "PRESERVE" }, "Excludes": [], "CreationTime": "2022-12-03T05:30:41.281000+00:00", "Includes": [] }
BytesPerSecond
が10485
になっていますね。単位がバイトでタスク作成時に0.01 MiB/sと指定したので、1024 Byetes × 1024 × 0.01 = 10,485.76 ≒ 10485
ということですね。
ちなみに、BytesPerSecond
が-1
になっていることもありますが、これは帯域幅制限をしていないときです。
BytesPerSecond
AWS DataSync が使用する帯域幅を制限する値。例えば、AWS DataSyncで最大 1 MB を使用する場合は、この値を1048576 (=1024*1024) に設定します。
Type: Long
有効範囲: 最小値は -1 です。
必須: いいえ
タスクの実行
それでは、作成したタスクを実行します。
開始
-デフォルトから開始する
をクリックします。
タスクが実行され、しばらくすると転送が始まります。データスループットが0.01 MiB/sになっていますね。
AWS CLIで実行中のタスクを確認します。
$ aws datasync describe-task-execution \ --task-execution-arn arn:aws:datasync:us-east-1:<AWSアカウントID>:task/task-0515f47f43fba0d92/execution/exec-0f993ad6e8db90043 { "TaskExecutionArn": "arn:aws:datasync:us-east-1:<AWSアカウントID>:task/task-0515f47f43fba0d92/execution/exec-0f993ad6e8db90043", "Status": "TRANSFERRING", "Options": { "VerifyMode": "ONLY_FILES_TRANSFERRED", "OverwriteMode": "ALWAYS", "Atime": "BEST_EFFORT", "Mtime": "PRESERVE", "Uid": "NONE", "Gid": "NONE", "PreserveDeletedFiles": "PRESERVE", "PreserveDevices": "NONE", "PosixPermissions": "NONE", "BytesPerSecond": 10485, "TaskQueueing": "ENABLED", "LogLevel": "BASIC", "TransferMode": "CHANGED", "SecurityDescriptorCopyFlags": "NONE", "ObjectTags": "PRESERVE" }, "Excludes": [], "Includes": [], "StartTime": "2022-12-03T06:43:17.848000+00:00", "EstimatedFilesToTransfer": 176, "EstimatedBytesToTransfer": 15461685, "FilesTransferred": 37, "BytesWritten": 925169, "BytesTransferred": 925169, "Result": { "PrepareDuration": 3488, "PrepareStatus": "PENDING", "TotalDuration": 100709, "TransferDuration": 98965, "TransferStatus": "PENDING", "VerifyDuration": 0, "VerifyStatus": "PENDING" }, "BytesCompressed": 813854 }
転送済み(BytesTransferred
)が925169 Bytes
で、転送時間(TransferDuration
)は98965 ms
です。転送速度は860113 Bytes / 102046 ms × 1000 / 1024 ≒ 9.13 KB/s
です。タスク作成時に帯域幅制限を0.01 MiB/sと指定したので、指定した帯域幅制限を超えない速度で転送をしていることが分かります。
実行中タスクの帯域幅制限の変更
本題のタスク実行中の帯域幅制限の変更を行います。
実行しているタスクの編集
をクリックします。今回は帯域幅制限を1 MiB/sに変更します。制限したい帯域幅を入力するテキストボックスに1
と入力し変更を保存
をクリックします。
数秒ほど待つとデータスループットの値が0.3 MiB/s
になりました。タスク実行中に帯域幅制限を変更した場合、適用されるまでラグがあるので注意しましょう。
タスク実行の帯域幅制限に対する変更を保存するには、[変更の保存] を選択します。新しい帯域幅制限設定は、60 秒以内に実行中またはキューに入れられたタスクの実行に対して有効になります。
AWS CLIで確認すると以下のようになります。
$ aws datasync describe-task-execution \ --task-execution-arn arn:aws:datasync:us-east-1:<AWSアカウントID>:task/task-0515f47f43fba0d92/execution/exec-0f993ad6e8db90043 { "TaskExecutionArn": "arn:aws:datasync:us-east-1:<AWSアカウントID>:task/task-0515f47f43fba0d92/execution/exec-0f993ad6e8db90043", "Status": "TRANSFERRING", "Options": { "VerifyMode": "ONLY_FILES_TRANSFERRED", "OverwriteMode": "ALWAYS", "Atime": "BEST_EFFORT", "Mtime": "PRESERVE", "Uid": "NONE", "Gid": "NONE", "PreserveDeletedFiles": "PRESERVE", "PreserveDevices": "NONE", "PosixPermissions": "NONE", "BytesPerSecond": 1048576, "TaskQueueing": "ENABLED", "LogLevel": "BASIC", "TransferMode": "CHANGED", "SecurityDescriptorCopyFlags": "NONE", "ObjectTags": "PRESERVE" }, "Excludes": [], "Includes": [], "StartTime": "2022-12-03T06:43:17.848000+00:00", "EstimatedFilesToTransfer": 176, "EstimatedBytesToTransfer": 15461685, "FilesTransferred": 95, "BytesWritten": 9824418, "BytesTransferred": 9824418, "Result": { "PrepareDuration": 3488, "PrepareStatus": "PENDING", "TotalDuration": 296380, "TransferDuration": 294636, "TransferStatus": "PENDING", "VerifyDuration": 0, "VerifyStatus": "PENDING" }, "BytesCompressed": 5691771 }
転送速度は9824418 Bytes / 294636 ms × 1000 / 1024 ≒ 32.56 KB/s
です。確かに表示されている0.03 MiB/sと近しい値ですね。
もうしばらく待つとタスクの実行が完了しました。最終的にはデータスループットの値が0.4 MiB/s
になりました。
AWS CLIで確認すると以下のようになります。
$ aws datasync describe-task-execution \ --task-execution-arn arn:aws:datasync:us-east-1:<AWSアカウントID>:task/task-0515f47f43fba0d92/execution/exec-0f993ad6e8db90043 { "TaskExecutionArn": "arn:aws:datasync:us-east-1:<AWSアカウントID>:task/task-0515f47f43fba0d92/execution/exec-0f993ad6e8db90043", "Status": "SUCCESS", "Options": { "VerifyMode": "ONLY_FILES_TRANSFERRED", "OverwriteMode": "ALWAYS", "Atime": "BEST_EFFORT", "Mtime": "PRESERVE", "Uid": "NONE", "Gid": "NONE", "PreserveDeletedFiles": "PRESERVE", "PreserveDevices": "NONE", "PosixPermissions": "NONE", "BytesPerSecond": 1048576, "TaskQueueing": "ENABLED", "LogLevel": "BASIC", "TransferMode": "CHANGED", "SecurityDescriptorCopyFlags": "NONE", "ObjectTags": "PRESERVE" }, "Excludes": [], "Includes": [], "StartTime": "2022-12-03T06:43:17.848000+00:00", "EstimatedFilesToTransfer": 176, "EstimatedBytesToTransfer": 15461685, "FilesTransferred": 176, "BytesWritten": 15461685, "BytesTransferred": 15461685, "Result": { "PrepareDuration": 1744, "PrepareStatus": "SUCCESS", "TotalDuration": 383001, "TransferDuration": 379113, "TransferStatus": "SUCCESS", "VerifyDuration": 384, "VerifyStatus": "SUCCESS" }, "BytesCompressed": 9891472 }
転送速度は15461685 Bytes / 379113 ms × 1000 / 1024 ≒ 39.83 KB/s
です。表示されている0.04 MiB/sと近しい値です。
状況に応じて帯域幅を調整しよう
AWS DataSyncのタスク実行中の帯域幅制限変更機能を紹介しました。
状況に応じて帯域幅を調整して、無理のない範囲で最速でデータ転送が終わるように調整しましょう。送信先がFSx for ONTAPの場合はCloudWatchアラームでSSD
のStorageUsed
を監視しておくと良いでしょう。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!