一つの壁を超えて次の壁へ立ち向かう
ちょっと思っていたのと現象が違ったので、少し書き留めておこうと思う。
ボトルネックはネットワークの速度とリクエストしてからのレスポンスが遅いことなので、単純に並列で走らせればいいと思えてきた。
— 岩崎和正 (@KazumasaIwazaki) 2019年12月5日
AmazonのサービスであるS3とのやりとりに関することです。今までも速度は出ていなかったけど、リクエストのやりとりに時間がかかっていることが原因だった。例えばLSコマンドでファイルリストの一覧を表示させることにも時間がかかっていたので「ファイルリストを表示するだけで時間がかかる」ということは、ネットワークでリクエストを投げるまでが遅いか、リクエストの処理そのものに時間がかかっているかのどちらか。自分の立ち位置ではネットワークに関して手を出せないので、リクエストに関するところで対策をしようと考えました。
やり方としては処理を並列にして一回の通信では多くなくても、並列化させることで高速化させようというもの。 このあたりの記事を参考にして実装してみました。
.net framework4.5以降であれば、制御に関してほとんど気にすることなく組み込むことができるので、インフラまわりでなんとかなるのであれば.net frameworkのバージョンをあげてしまうのがいいでしょう。
実際に組み込んでみたところ、パフォーマンスは上がったけど期待していた速度にはならなかったので残念だなぁと思ってみていました。とりあえずCPU使用率、メモリ使用率を見たところ、CPU使用率が100%に張りついている。今まではネットワークとかリクエストのやりとりだったのが、今度はPCの性能による速度の限界になってきたらしい。単なるファイルコピーではなく、ファイルストリームを使用してファイrを生成しているようなイメージなのだろうか。
今はCLIを使用して実装していいて、他にSDKを使用した実装、lambdaを使用して外部からの実装を試すところ。SDKによる実装はインフラの影響により検証できておらず、lambdaの使用に関しても環境整備ができていなくて手を付けれない状況。環境が整うまでは他の作業をして待つことにしようと思う。
他に簡単で速度が出る方法はないだろうか。ローカルしてサクッと動いてくれるとかしてくれたらいいんだけどなぁ... 時間を見つけてさがしてみようと思います。