Upload
hiraku-nakano
View
20.555
Download
0
Embed Size (px)
Citation preview
自己紹介
• 中野 拓 (@Hiraku)
• 口癖「composerが遅い」packagistのミラー作った http://packagist.jp
• 2015/12からメルカリで働いています。
composerを速くする活動やってます• ミラーサイト http://packagist.jp
• 並列化プラグイン hirak/prestissimo
• https://packagist.org/packages/hirak/prestissimo
どちらもコマンド1行で使える
# (ミラーサイトの有効化)$ composer config -g repositories.packagist composer http://packagist.jp
# (並列化プラグインのインストール)$ composer global require hirak/prestissimo
# フィードバック募集中!!
サーバーの場所
• packagist.org ← たぶんフランスにある
• github.com ← たぶんサンフランシスコにある
• 日本からの通信で必ず通るもの=海底ケーブル
=光ファイバー
「40msって速くね?」
• 物理限界が40msであって、実際は(ry
• これにgithub.comの事情が加わる
• https://api.github.com からhttps://codeload.github.com へ毎回リダイレクトしている
HTTPSの往復
• ゼロからHTTPS通信すると、パケットの往復が4回発生する
• TCPのハンドシェイクで1往復
• TLSのハンドシェイクで2往復
• HTTP本体で1往復
• 1回リダイレクトすると更に倍
curlで雑に測ってみる
# (githubから適当なzipをダウンロードする)$ curl --head \ --location \ --output prestissimo.zip \ https://github.com/hirak/prestissimo/archive/0.1.4.zip \ --write-out " time_namelookup: %{time_namelookup}\n time_connect: %{time_connect}\n time_appconnect: %{time_appconnect}\n time_redirect: %{time_redirect}\n time_total: %{time_total}"
...time_namelookup: 0.013time_connect: 0.201time_appconnect: 0.884time_redirect: 1.270time_total: 2.400
項目の意味
time_namelookup(0.013) 開始からDNS解決まで(秒)
time_connect(0.201) 開始からTCPハンドシェイク完了まで(秒)
time_appconnect(0.884) 開始からTLSハンドシェイク完了まで(秒)
time_redirect(1.270) リダイレクトで費やした時間(秒)
time_total(2.400) かかった時間全て(秒)
フェーズ毎の値に修正
名前解決 0.013
TCPハンドシェイク 0.201 - 0.013 = 0.188
TLSハンドシェイク 0.884 - 0.201 = 0.683
リダイレクト一回分 1.270
HTTPの本体 2.400 - 1.270 - 0.884 = 0.246
2. 往復を減らす(1)
• zipあたり8往復するのは無駄
• api.github.com→codeload.github.comリダイレクトをやめる最初からcodeloadに取りに行く
• これでzipあたり4往復減らせる
PHPでKeep-Aliveなリクエスト
<?php$ch = curl_init();curl_setopt($ch, CURLOPT_URL, 'http://example.com/1.txt');curl_exec($ch);
// 同じ$chを使い回して2回目
curl_setopt($ch, CURLOPT_URL, 'http://example.com/2.txt');curl_exec($ch);
curl_close($ch);
3. 並列化
• 待ち時間に別のダウンロードを行う
• 通信路の暇をなくせる
• 帯域を100%使いきったら、並列化の効果は薄い (prestissimoは6並列にした)
• PHPの場合、curl_multiを使えばできる
解決方法の現状packagistが近くにあれば packagist.jpで実装した
リダイレクトを減らす hirak/prestissimoで実装した
Keep-Aliveを使う hirak/prestissimoで実装した
並列化する hirak/prestissimoで実装した
光が速くなれば 未解決
我々が知るべきこと
• 地球規模だと光の遅さが体感できる
• 物理限界を意識して実装しよう
• composerの実装・file_get_contents()はHTTP/1.0で、連続ダウンロードに向いていない (curl使おうぜ)