2016-05-02 31 views
2

boto3を使用してS3に書き込む場合(場合によってはすべての操作)、EC2インスタンス上のわずかな量のデータでも約300msかかります。S3への書き込み時間

プロファイリングでは、セキュリティで保護された接続を確立したときや単純にサーバーが応答するときに、時間が読み取りによって支配されることがわかります(例:_SSLSocket.read())。

動作時間を短縮する方法はありますか?おそらく、使用できる低レベルのAPI呼び出しがありますか?

%prun -s time client.put_object(Bucket='MDtemp', Key='temporary2', Body=b'Hello') 



    2197 function calls (2188 primitive calls) in 0.094 seconds 

    Ordered by: internal time 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     1 0.045 0.045 0.045 0.045 {built-in method select} 
     26 0.045 0.002 0.045 0.002 {method 'read' of '_ssl._SSLSocket' objects} 
     2 0.000 0.000 0.000 0.000 {method 'write' of '_ssl._SSLSocket' objects} 
     26 0.000 0.000 0.045 0.002 socket.py:364(readinto) 
     2 0.000 0.000 0.000 0.000 socket.py:200(makefile) 
     26 0.000 0.000 0.045 0.002 ssl.py:737(recv_into) 
     27 0.000 0.000 0.000 0.000 message.py:463(get) 
     1 0.000 0.000 0.001 0.001 awsrequest.py:195(_handle_expect_response) 
     2 0.000 0.000 0.000 0.000 {method 'readline' of '_io._IOBase' objects} 
     8/6 0.000 0.000 0.001 0.000 hooks.py:175(_emit) 
     2 0.000 0.000 0.000 0.000 socket.py:352(__init__) 
     245 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects} 
     1 0.000 0.000 0.092 0.092 connectionpool.py:317(_make_request) 
     1 0.000 0.000 0.093 0.093 sessions.py:539(send) 
     26 0.000 0.000 0.045 0.002 ssl.py:611(read) 
     3 0.000 0.000 0.000 0.000 _collections_abc.py:575(update) 
     8 0.000 0.000 0.045 0.006 {method 'readline' of '_io.BufferedReader' objects} 
     2 0.000 0.000 0.000 0.000 feedparser.py:217(_parsegen) 
     150 0.000 0.000 0.000 0.000 {built-in method isinstance} 
     1 0.000 0.000 0.000 0.000 parsers.py:639(_parse_non_payload_attrs) 
     8 0.000 0.000 0.000 0.000 client.py:1092(putheader) 
     1 0.000 0.000 0.000 0.000 feedparser.py:470(_parse_headers) 
     1 0.000 0.000 0.000 0.000 client.py:284(parse_headers) 
     7 0.000 0.000 0.000 0.000 parse.py:286(urlparse) 
     23 0.000 0.000 0.000 0.000 parse.py:98(_coerce_args) 
     27 0.000 0.000 0.000 0.000 socket.py:405(readable) 
     1 0.000 0.000 0.094 0.094 {built-in method exec} 
     40 0.000 0.000 0.000 0.000 _policybase.py:269(_sanitize_header) 
     1 0.000 0.000 0.046 0.046 awsrequest.py:146(_send_output) 
     1 0.000 0.000 0.000 0.000 auth.py:532(canonical_standard_headers) 
     1 0.000 0.000 0.045 0.045 client.py:347(_read_status) 
     ... 
+1

大きな時間を掛けている人は、SSLハンドシェイクになります。他の環境(ここではPythonの人ではない)では、HTTPキープアライブを使用すると、接続を再利用することで複数の要求に渡ってこの設定コストを償却することができました...しかしS3 300msと同じ領域内のEC2内部からはやや遅くなります。私が比較するものがあるかどうかがわかります。これは、S3自身を重要な貢献者として出入りさせるのに役立ちます。私はasync I/Oを使って書いたツールの1つで約2秒で1000個のHEAD要求を送受信できますが、今はHTTPSかどうか覚えていません。 –

+0

インスタンスはバケットと同じ地域にありますか?往復時間が非常に短いため、SSLハンドシェークが領域内で無視できる時間になります(ピング時間は弾性IPで0.2ms以下)。私たちは、SSL-VPNのネゴシエーションに起因するもので、最初のリクエストで約380ミリ秒、2回目のリクエストで90ミリ秒を得ました。生きている接続。 –

+0

毎回新しい接続を確立する必要があります。キープアライブ接続を確立するにはどうすればいいですか? – mdurant

答えて

0

あなたはこの使用BASHを達成することができます、あなたはコールアウトするためにこのようなAWSコマンドラインインターフェイス(CLI)などの外部アプリを持っています。

訪問:http://docs.aws.amazon.com/cli/latest/reference/s3/

+1

また、何百msもかかります – mdurant

0

あなたはs3cmdを使用して考えがありますか?それは非常に効果的ですが、私はその性能を測定したことはありません、Linux用のコマンドラインツールです。

+1

また、〜300msかかります(暗号化はオフになっています) – mdurant

+0

高い冗長性に関心がない場合は、手動でs3cmdを設定して単一のリージョン(最も近いもの)を使用するように設定できます。多分それはその時に数ミリ秒を削るでしょう。 –

+0

boto3では、aws cliと同様に、リージョンを指定することもできます。 – mdurant

関連する問題