SlideShare a Scribd company logo
1 of 38
ボトルネックを解消せよ!
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つのボトルネックを解消すると、別の箇所が
ボトルネックになる
• パフォーマンス改善はボトルネック解消との終わり
なき戦い
ご清聴ありがとうございました

More Related Content

More from Masanori Hayashi

「クソコード」言い換えのご提案 - 2018-12-15 #phpcon2018
「クソコード」言い換えのご提案 - 2018-12-15 #phpcon2018「クソコード」言い換えのご提案 - 2018-12-15 #phpcon2018
「クソコード」言い換えのご提案 - 2018-12-15 #phpcon2018Masanori Hayashi
 
人のレガシーを笑うな - レガシー感謝の日
人のレガシーを笑うな  - レガシー感謝の日人のレガシーを笑うな  - レガシー感謝の日
人のレガシーを笑うな - レガシー感謝の日Masanori Hayashi
 
20180627 phpstudy 長いものに巻かれよう
20180627 phpstudy 長いものに巻かれよう20180627 phpstudy 長いものに巻かれよう
20180627 phpstudy 長いものに巻かれようMasanori Hayashi
 
20180425 phpstudy-my-first-laravel
20180425 phpstudy-my-first-laravel20180425 phpstudy-my-first-laravel
20180425 phpstudy-my-first-laravelMasanori Hayashi
 
JAWS DAYS 2017直前! AWS総復習
JAWS DAYS 2017直前! AWS総復習JAWS DAYS 2017直前! AWS総復習
JAWS DAYS 2017直前! AWS総復習Masanori Hayashi
 
俺的世界で一番暑い夏
俺的世界で一番暑い夏俺的世界で一番暑い夏
俺的世界で一番暑い夏Masanori Hayashi
 
Soft bank ssl仕様変更について
Soft bank ssl仕様変更についてSoft bank ssl仕様変更について
Soft bank ssl仕様変更についてMasanori Hayashi
 

More from Masanori Hayashi (15)

「クソコード」言い換えのご提案 - 2018-12-15 #phpcon2018
「クソコード」言い換えのご提案 - 2018-12-15 #phpcon2018「クソコード」言い換えのご提案 - 2018-12-15 #phpcon2018
「クソコード」言い換えのご提案 - 2018-12-15 #phpcon2018
 
人のレガシーを笑うな - レガシー感謝の日
人のレガシーを笑うな  - レガシー感謝の日人のレガシーを笑うな  - レガシー感謝の日
人のレガシーを笑うな - レガシー感謝の日
 
20180627 phpstudy 長いものに巻かれよう
20180627 phpstudy 長いものに巻かれよう20180627 phpstudy 長いものに巻かれよう
20180627 phpstudy 長いものに巻かれよう
 
20180425 phpstudy-my-first-laravel
20180425 phpstudy-my-first-laravel20180425 phpstudy-my-first-laravel
20180425 phpstudy-my-first-laravel
 
JAWS DAYS 2017直前! AWS総復習
JAWS DAYS 2017直前! AWS総復習JAWS DAYS 2017直前! AWS総復習
JAWS DAYS 2017直前! AWS総復習
 
Phpstudy98
Phpstudy98Phpstudy98
Phpstudy98
 
Php blt-vol2
Php blt-vol2Php blt-vol2
Php blt-vol2
 
Symfony meetup-7
Symfony meetup-7Symfony meetup-7
Symfony meetup-7
 
Glt vol49
Glt vol49Glt vol49
Glt vol49
 
Glt vol48
Glt vol48Glt vol48
Glt vol48
 
Glt vol47
Glt vol47Glt vol47
Glt vol47
 
PHP framework Phalcon
PHP framework PhalconPHP framework Phalcon
PHP framework Phalcon
 
俺的世界で一番暑い夏
俺的世界で一番暑い夏俺的世界で一番暑い夏
俺的世界で一番暑い夏
 
Soft bank ssl仕様変更について
Soft bank ssl仕様変更についてSoft bank ssl仕様変更について
Soft bank ssl仕様変更について
 
20081120 lt11th ace
20081120 lt11th ace20081120 lt11th ace
20081120 lt11th ace
 

ボトルネックを解消せよ

Editor's Notes

  1. 一般論ですが、ボトルネックの解消には、「どこがボトルネックなのか」を正確に認識する必要があります ボトルネックではない場所を一生懸命改善に取り組んでも意味がありません。 ボトルネック、という概念は、別にIT業界でなくても、日常生活のなかにも 意識しているかしていないかは別として たくさんあると思います。 以下、2つほど、実例を出します。
  2. 1つは交通渋滞です。 車を普段よく乗られる方は実感あるかなと思います。 「ここ信号みじけーから、めちゃこむんよなぁ」とか 「うわ、こんなとこ緊急工事?ありえねー」とか。 特定の箇所で車が一定時間に通れる量が制限されることにより発生するボトルネックですね
  3. 2つめは業務上のボトルネックです。 (実はシステム的なボトルネックよりも往々にして問題だったりしますよね) たとえば、この作業するのに、先行してAとBとCがそろってないといけないのにCがまだ完成してなくて そこが全体の足を引っ張っているとか。 スライドの画像は、これは架空の稟議書ですね。係長と課長と部長と取締役。。。のハンコが必要、とか。 こういう会社の正式書類ものって、いろんな人のハンコがひつようで、よく「スタンプラリー」とか揶揄されたりしますね。 ここまでのハンコが必要な会社はさすがにないと思いますが(ねえよ) 何か仕事を進めるうえで、この件は誰それさんに話をとおしとかないといけない、が 誰それさんが出張で、出社が3日後だ~とか、そういうことってありますね。 逆に言うと、そういうボトルネックになりそうな箇所を予め予測して、どのタイミングで誰に何のネゴをとる、みたいなことが重要っすね
  4. で、ボトルネックと関連したワードで「クリティカルパス」ってのをここで話します。 エンジニアの方で、IPAの基本情報処理試験とか受けた方は「あ~、あったあった」って思うかもですね で、この図の見方を説明しますと 丸印は、ある一連の仕事のある時点での「状態」を表します。 矢印、フキダシで、A~Gってふっていますが、これが、ある一連の仕事を達成するために必要な1つ1つの「タスク」です。 で、各タスクがこのくらい工数かかるよ、っていうのを記載しています。 矢印が○をはさんでつながっているのは、タスク間に前後関係があることを表しています。 たとえば、Bというタスクは、Aというタスクが終わらないと始められない、という意味です。 クリティカルパスというのは、この仕事全体を進める上で「このタスク群が遅延すると全体が遅延する」タスク群のことをいいます で、ここで皆さんにお聞きします。上の図で、クリティカルパスは上中下、どのルートだと思いますか?
  5. 正解は真ん中のルートですね。 で、この図はさらにどう分析するかというと、クリティカルパスがわかると じゃあ全体の仕事を早めたいとしたら、どこに手を入れればいいかわかる、ということです。 ここでいえば、DかEのタスクを、何らかの方法で工数削減できれば、より早く仕事を終えられます。 ただし、DEのタスクだけをずっと注意していればいいかというとそうではなく あるところで、別のルートがクリティカルパスに変わることが有ります。 上の図では、例えば、Dのタスクが5日から3日に、2日縮められたとして、じゃあ全体が2日縮まるかというと・・・ そうじゃないですね。 FGのルートが7日かかるので、今度はこちらがクリティカルパスになります。 重要なのはクリティカルパス(ボトルネック)は、1つを解消すると、別の所が必ずクリティカルパス(ボトルネック)になります なので、パフォーマンス改善という作業はこの作業のひたすら繰り返し、なわけですね。
  6. 前段長くなりましたが、では、実際のシステムにおいてのボトルネックの話に移ります。 上の図はかなり簡略化して書いています。 この図の中で、どんなところがボトルネックになるかあげてください。 (たくさんあると思います)
  7. はい、実はざっと考えられるだけでも、このくらいはボトルネックとなる要因が考えられます。 この中で一番足を引っ張るものが、システム全体の「ボトルネック」になるわけです。 次からはそれぞれについて、もう少し具体的なところに掘り下げていきます。
  8. 書いたソースコードは文法的なミスはないのですが、これ、「そもそも」おかしいところがあるんですが、わかりますか? (エンジニア向け質問)
  9. で、この他にも、効率が悪いところをあぶりだすのに、プロファイラというツールを使うこともできます。 XhprofはPHPでは比較的ゆうめいどころのツールで(Facebookの人が作った) こんな感じで、効率悪いところを、グラフィカルに表示してくれたりしています
  10. では、次のポイントです。今度はWebとDBなどの通信について。
  11. 実際の案件でも、WebとCacheサーバ間のトラフィック量が問題になったことがあり この図にあるように、WebサーバにCacheも内包することで、解決をはかりました
  12. ・・・のですが、どんなケースが他にあるか、わかりますでしょうか? ヒントとしては、今度はWebフロントエンドを担当している方に関わってくる部分です。
  13. Chrome, 他のブラウザでも同様のツールありますが こういったツールで、そもそも1ページ内にどれだけ画像があって、どれだけ通信しているか どれだけ時間がかかっているかを調べられます
  14. Webブラウザで確認できるものであれば、さきほどのChromeでいいですが ネイティブ通信ものの場合はそれも確認が難しいので たとえば、Fiddlerのようなローカルで動作するプロキシツールを間に挟んで確認するって方法もあります。 ただし、FiddlerはWindowsのツールです。
  15. この対策は、実際の案件でもUnityのアセットバンドルの転送量が問題なったことがあって そちらの対策として導入しました。