ボトルネックを解消せよ
DESCRIPTION
社内勉強会での発表資料TRANSCRIPT
ボトルネックを解消せよ!2014/07/02
サーバサイド技術統括部&インフラ部
林正紀
自己紹介
•林正紀 (HAYASHI Masanori)
• 1974年9月12日生(39歳)独身
•埼玉生まれ、埼玉育ち(ふじみ野市在住)
•埼玉大学/大学院・数学専攻
• @m_norii
• http://norii.hatenablog.com/
• https://www.facebook.com/m.norii
ボトルネックとは?
ココ
ボトルネックとはボトルネック (bottleneck) とは、システム設計上の制約の概念。英語の「瓶の首」の意。物事がスムーズに進行しない場合、遅延の原因は全体から見れば小さな部分が要因となり、他所をいくら向上させても状況改善が認められない場合が多い。このような部分を、ボトルネックという。瓶のサイズがどれほど大きくても、中身の流出量・速度(スループット)は、狭まった首のみに制約を受けることからの連想である。
Wikipedia「ボトルネック」
http://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%88%E3%83%AB%E3%83%8D%E3%83%83%E3%82%AF
ここを改善する必要がある
日常生活におけるボトルネック
業務におけるボトルネック
関連ワード:クリティカルパス
A:3日
B:1日
C:2日
D:5日 E:3日
F:3日G:4日
関連ワード:クリティカルパス
A:3日
B:1日
C:2日
D:5日 E:3日
F:3日G:4日
データセンター
Webサービスにおけるボトルネック要因
Internet
データセンター
Webサービスにおけるボトルネック要因
Internet
ネット回線 ルータ性能
Webサーバ処理
DB/Cacheサーバとの通信
DB/Cacheサーバ処理
DC内通信帯域
DC外との通信帯域
クライアント側処理
事例:Webサーバ処理
•所持カードを攻撃力でソート、みたいな処理function card_sort($arr){
$length=count($arr);
for($j=0; $j<$length-1; $j++){for($i=0; $i<$length-1; $i++){
if($arr[$i]>$arr[$i+1]){$tmp = $arr[$i];$arr[$i] = $arr[$i+1];$arr[$i+1] = $tmp;
}}
}}
それ、標準関数でできるよ!
事例:Webサーバ処理
function card_sort($arr){$length=count($arr);
for($j=0; $j<$length-1; $j++){for($i=0; $i<$length-1; $i++){
if($arr[$i]>$arr[$i+1]){$tmp = $arr[$i];$arr[$i] = $arr[$i+1];$arr[$i+1] = $tmp;
}}
}}
function card_sort($arr){sort($arr);return $arr;
}
Before After
事例:Webサーバ処理
• PHP標準関数はかなり多彩知っていれば1行で終わってしまうことも多い
• (PHPに限らず)標準で提供している機能を極力使いこなそう
• PHPが苦手な処理は、system()関数使って、OSコマンドで処理する手もあり
ツール:Xhprof(プロファイラ)
事例:WebサーバとDB/Cacheサーバの通信
Webサーバ DBサーバ
レスポンスデータサイズが大きすぎ
事例:WebサーバとDB/Cacheサーバの通信
Webサーバ DBサーバ
1回の処理に対し何回も問い合わせしすぎ
事例:WebサーバとDB/Cacheサーバの通信•できるだけ必要なデータだけを返すようにする
•問い合わせ回数を減らす• DB → 子テーブルは IN句を使ってまとめて取得
• Memcache → getMulti()
• Redis → mget()
Before
事例:WebサーバとDB/Cacheサーバの通信•通信経路を最短に
After
Webサーバ Cacheサーバ
Webサーバ
Web(PHP)
Cache
物理的に別サーバWebサーバにCacheサーバも内蔵→サーバ間通信コストを削減
ところで
レスポンスを小さく
Webサーバ DBサーバ
レスポンスデータサイズが大きすぎ
問い合わせ回数減らす
Webサーバ DBサーバ
1回の処理に対し何回も問い合わせしすぎ
Before
通信経路を最短に
After
Webサーバ Cacheサーバ
Webサーバ
Web(PHP)
Cache
物理的に別サーバWebサーバにCacheサーバも内蔵→サーバ間通信コストを削減
は、サーバサイド/インフラに限った話では無い!
レスポンスを小さく
─ ─ ─ ── ─ ─ ── ─ ─ ─
画像ファイル
テキストファイル
レスポンスを小さく
•画像/音声/動画など、各種メディアファイルは適切なサイズを模索• 表現を豊かにすれば、ファイルサイズは一般に大きくなる許容できる範囲を決めておくことが大事
•テキストデータはgzipで圧縮して転送• gzip圧縮を利用することで、送信するサーバでの圧縮/受信するクライアントでの展開処理にはコストかかるようになるが、一般にはそれよりもネットワークコストの削減の方が大きい
問い合わせ回数減らす
問い合わせ回数減らす
•フロントエンドのテクニックとして有名なのが「CSSスプライト」
•細かい画像を逐一Webサーバに問い合わせる処理を削減
•ただし、運用はしにくくなるので使いどころをよく検討する必要あり• 頻繁に変更が入りそうなものはスプライト化しないほうがいい
ツール:Google Chrome検証ツール
ツール:Fiddler
After
Before
通信経路を最短にDataCenter
DataCenter
Internet
Internet
CDN Cache
通信経路を最短に
• Akamaiなど、CDN(Contents Delivery Network)を利用
•エンドユーザに最も近いサーバ(エッジサーバ)からデータを返す
・・・というわけでボトルネックとなる箇所の「パターン」はシステム全体のどの部分であれ、類似性がある
職種別:パフォーマンス向上のために意識して欲しいことディレクター/プランナー 仕様の軽量化
デザイナー ファイルサイズの軽量化
マークアップ CSSスプライト、CSS/JSのminify、JavaScript DOM操作の最適化
ネイティブ 効率良いアルゴリズムの選択
サーバサイド 効率よいアルゴリズムの選択DB/Cacheの効率的な使用
インフラ ボトルネックを発見するために必要な指標を記録しておく
まとめ
•ボトルネックとは、システムのパフォーマンスを決定づける場所
•ボトルネックではない場所を改善しても(直近では)意味が無い
•1つのボトルネックを解消すると、別の箇所がボトルネックになる• パフォーマンス改善はボトルネック解消との終わりなき戦い
ご清聴ありがとうございました