ボトルネックを解消せよ

Post on 07-Jul-2015

941 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

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つのボトルネックを解消すると、別の箇所がボトルネックになる• パフォーマンス改善はボトルネック解消との終わりなき戦い

ご清聴ありがとうございました

top related