SlideShare a Scribd company logo
1 of 62
Download to read offline
ISUCON5 予選を
PHPで戦った話
2015/10/28
#phpstudy
株式会社サイバーエージェント
⽩白井  英
2
お前、誰よ
• 株式会社 サイバーエージェント
• SGE統括本部技術統括室 CTO
• 白井 英
• エンジニア
• Twitter
@goodoo
• Blog
http://ameblo.jp/goodoo
• DQ10
すぐちむ (FB392-435) プクリポ(旅芸人)
• ISUCONとは?
• 準備
• 何をしたか
• 何が足らなかったか
• まとめ
Agenda
ISUCONとは
・Webアプリケーションの
 高速化コンテスト
・1日かけてWebアプリケーションを
 チューニング
・レギュレーション内であれば何でも可
・複数言語用意されていた
(今回は、Ruby,Perl,Python,PHP)
・ベンチマークツールのスコアで競う
・1チーム3名以内
(2名はいないとつらい・・・)
準備
前日までにしたこと・・
http://www.slideshare.net/kazeburo/isucon-yapcasia-tokyo-2015
スライドを
熟読
チームで分担して
準備する事を4つ決めた
1. コミュニケーションツール
2. レポジトリ
3. Wiki
4. GCPのプロジェクトの設定
そして当日・・
何をしたか
ルールの確認
予選通過
予選は以下のルールで通過者が決定します。
1日目、2日目、それぞれで3000点に最も早く到達したチーム
(ただし予選終了後の追試の対象には含まれます)
それぞれの日で最後に提出した有効なスコアの上位4チーム
上記10チームを除き、1日目と2日目を通した上位10チーム
またこれとは別枠で、1日目と2日目を通した学生枠の上位5チーム
開始して
最初の1時間
初期状態でベンチマークツールを
走らせる・・・
SCORE 100ぐらい(Ruby)
次に
Ruby -> PHP
DBのバックアップ(dump)
を実行
SCORE 800ぐらい
チーム内での一言
「PHP優秀じゃん」
ちなみに後から考えてわかったことですが
最初にDBのdumpをとったため
DBのデータがキャッシュにのった関係で
スコアが8倍のびました
決してRuby->PHPが効いた訳では
ありません
DBまわりの
チューニング
をはじめる
pt-query-digestをいれてもらう
(そのあとNewRelicもいれてもらった)
my.cnfどこ
問題
/etc/my.cnfを変更しても反映されない
・・・
とりあえず
mysql> set global XXX=xxx
で逃げる
でもslow-queryのファイルが
吐き出せない・・・
/etcの下を
さがす・・
あった!
/etc/mysql/mysql.conf.d/mysqld.cnf
・クエリーキャッシュをON
・とりあえずメモリまわりチューニング
- innodb_buffer_pool
- xxxx_buffer_size
・php-fpmのプロセス数を1->10へ
あれ・・・
3,000スコア
越えてる!
しかし・・・
10分差で
3,000スコア
1番乗りならず
もっと早く
やっておけば・・
気を取り直して
pt-query-digestの
結果を愚直に直す
・INDEXをはる -> スロークエリチェック
 のループ
 (カラム数が4つのテーブルに
  カラム数3つの複合インデックス
  read命みたいなものも作る・・)
結果、0.1sec以上のスロークエリーは0
遅いページは
・・・・
/ HTTP/1.1" 200 17331 "-" "Isucon5q bench" 1.614
/
TOPページが
おもい!
ここまでで
開始して
3時間くらい
プログラムを
修正する
決意!
PHPは
Slimという
マイクロフレームワーク
でかかれていた
直した場所!
$stmt = db_execute('SELECT * FROM entries ORDER BY created_at DESC LIMIT 1000');
while ($entry = $stmt->fetch()) {
if (!is_friend($entry['user_id'])) continue;
list($title) = preg_split('/n/', $entry['body']);
$entry['title'] = $title;
$entries_of_friends[] = $entry;
if (sizeof($entries_of_friends) >= 10) break;
}
この処理でis_friendをよんでますが(loop中に)
中身は
$user_id = $_SESSION['user_id'];
$query = 'SELECT COUNT(1) AS cnt FROM relations WHERE (one = ? AND another
= ?) OR (one = ? AND another = ?)';
$cnt = db_execute($query, array($user_id, $another_id, $another_id, $user_id))-
>fetch()['cnt'];
return $cnt > 0 ? true : false;
です。
loop中にSQLを
なげるのをやめた
もう1カ所
loop中に
クエリーを投げている
場所があったが直せず
※問題の詳細が知りたい方はこちら(http://isucon.net/)
一旦今の
ベストスコアを
作ってみる
※他のメンバーも諸々チューニングしてくれましたが
自分のわかる範囲のみ書いてます
各種ログを止める
・slowlog
・NewRelic
・xdebug
結果
何が足らなかったか
いろいろ足らないのは
承知の上ですが
1つだけやっておけば
よかったこと
こたえは
最初にやったこと
DBのdump
=(データの
キャッシュのせ)
正しくは次のパラメータ
innodb_buffer_pool_dump_at_shutdown=ON
innodb_buffer_pool_load_at_startup=ON
バッファプールのダンプ、リストアを実施を行う設定
まとめ
オンライン予選 利用言語比率
Ruby   43.2% 67組
Python  15.5% 24組
Golang  14.2% 22組
Perl    14.2% 22組
PHP    12.9% 20組
Java    2.6%  4組
Common Lisp 0.6% 1組
本選出場が決まった27チーム
Ruby   37.0% 10組
Perl   25.9%  7組
Golang  22.2%  6組
Python  11.1%  3組
PHP    3.7%  1組
未回答   7.4%  2組
頑張れPHP

More Related Content

What's hot

Spring starterによるSpring Boot Starter
Spring starterによるSpring Boot StarterSpring starterによるSpring Boot Starter
Spring starterによるSpring Boot StarterRyosuke Uchitate
 
Bottle使ってPython学習一緒にはじめませんか?
Bottle使ってPython学習一緒にはじめませんか?Bottle使ってPython学習一緒にはじめませんか?
Bottle使ってPython学習一緒にはじめませんか?Tatsuya Shinozuka
 
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルbottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルSatoshi Yamada
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようKenji NAKAGAKI
 
本気でPythonで宛名書きした話
本気でPythonで宛名書きした話本気でPythonで宛名書きした話
本気でPythonで宛名書きした話Satoshi Yamada
 
Motivationware
MotivationwareMotivationware
MotivationwareKoichi ITO
 
bottleで始めるWEBアプリの最初の一歩
bottleで始めるWEBアプリの最初の一歩bottleで始めるWEBアプリの最初の一歩
bottleで始めるWEBアプリの最初の一歩Satoshi Yamada
 
ASP.NETで お手軽Ajax実装
ASP.NETで お手軽Ajax実装ASP.NETで お手軽Ajax実装
ASP.NETで お手軽Ajax実装echigoya-jp
 
Djangoフレームワークの紹介 OSC2015北海道
Djangoフレームワークの紹介 OSC2015北海道Djangoフレームワークの紹介 OSC2015北海道
Djangoフレームワークの紹介 OSC2015北海道Shinya Okano
 
システム開発は何故揉めるのか
システム開発は何故揉めるのかシステム開発は何故揉めるのか
システム開発は何故揉めるのかechigoya-jp
 
スクレイピングとPython
スクレイピングとPythonスクレイピングとPython
スクレイピングとPythonHironori Sekine
 
Requestsで始める5分前帰社
Requestsで始める5分前帰社Requestsで始める5分前帰社
Requestsで始める5分前帰社Satoshi Yamada
 
UiPathロボットをわたしのアシスタントに
UiPathロボットをわたしのアシスタントにUiPathロボットをわたしのアシスタントに
UiPathロボットをわたしのアシスタントにYoichi Suetake
 
著者が語るUiPath書籍執筆の裏話
著者が語るUiPath書籍執筆の裏話著者が語るUiPath書籍執筆の裏話
著者が語るUiPath書籍執筆の裏話Masaaki Yoshida
 
Pythonにおけるデバッガツールpdbについて
PythonにおけるデバッガツールpdbについてPythonにおけるデバッガツールpdbについて
PythonにおけるデバッガツールpdbについてRyota Sakamoto
 
DroidKaigi 2018 - Dialogflow for Android
DroidKaigi 2018 - Dialogflow for AndroidDroidKaigi 2018 - Dialogflow for Android
DroidKaigi 2018 - Dialogflow for AndroidSENSY Inc
 

What's hot (20)

Spring starterによるSpring Boot Starter
Spring starterによるSpring Boot StarterSpring starterによるSpring Boot Starter
Spring starterによるSpring Boot Starter
 
C# で QnA Bot
C# で QnA BotC# で QnA Bot
C# で QnA Bot
 
Bottle使ってPython学習一緒にはじめませんか?
Bottle使ってPython学習一緒にはじめませんか?Bottle使ってPython学習一緒にはじめませんか?
Bottle使ってPython学習一緒にはじめませんか?
 
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルbottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアル
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
Windowsにpythonをインストールしてみよう
 
本気でPythonで宛名書きした話
本気でPythonで宛名書きした話本気でPythonで宛名書きした話
本気でPythonで宛名書きした話
 
Motivationware
MotivationwareMotivationware
Motivationware
 
bottleで始めるWEBアプリの最初の一歩
bottleで始めるWEBアプリの最初の一歩bottleで始めるWEBアプリの最初の一歩
bottleで始めるWEBアプリの最初の一歩
 
ASP.NETで お手軽Ajax実装
ASP.NETで お手軽Ajax実装ASP.NETで お手軽Ajax実装
ASP.NETで お手軽Ajax実装
 
Go言語オーバービュー201507
Go言語オーバービュー201507Go言語オーバービュー201507
Go言語オーバービュー201507
 
Djangoフレームワークの紹介 OSC2015北海道
Djangoフレームワークの紹介 OSC2015北海道Djangoフレームワークの紹介 OSC2015北海道
Djangoフレームワークの紹介 OSC2015北海道
 
Bot Framework で会話のログを取る
Bot Framework で会話のログを取るBot Framework で会話のログを取る
Bot Framework で会話のログを取る
 
システム開発は何故揉めるのか
システム開発は何故揉めるのかシステム開発は何故揉めるのか
システム開発は何故揉めるのか
 
スクレイピングとPython
スクレイピングとPythonスクレイピングとPython
スクレイピングとPython
 
Requestsで始める5分前帰社
Requestsで始める5分前帰社Requestsで始める5分前帰社
Requestsで始める5分前帰社
 
Goをえらんだ理由
Goをえらんだ理由Goをえらんだ理由
Goをえらんだ理由
 
UiPathロボットをわたしのアシスタントに
UiPathロボットをわたしのアシスタントにUiPathロボットをわたしのアシスタントに
UiPathロボットをわたしのアシスタントに
 
著者が語るUiPath書籍執筆の裏話
著者が語るUiPath書籍執筆の裏話著者が語るUiPath書籍執筆の裏話
著者が語るUiPath書籍執筆の裏話
 
Pythonにおけるデバッガツールpdbについて
PythonにおけるデバッガツールpdbについてPythonにおけるデバッガツールpdbについて
Pythonにおけるデバッガツールpdbについて
 
DroidKaigi 2018 - Dialogflow for Android
DroidKaigi 2018 - Dialogflow for AndroidDroidKaigi 2018 - Dialogflow for Android
DroidKaigi 2018 - Dialogflow for Android
 

Similar to ISUCON5 予選をPHPで戦った話

JIT for PHP を試した
JIT for PHP を試したJIT for PHP を試した
JIT for PHP を試したy-uti
 
phpstudy_php_to_node
phpstudy_php_to_nodephpstudy_php_to_node
phpstudy_php_to_nodeSuguru Shirai
 
やって分かった自動テスト
やって分かった自動テストやって分かった自動テスト
やって分かった自動テストHirokazu Tokuno
 
皆さん!ふくてんが来ましたよ!!
皆さん!ふくてんが来ましたよ!!皆さん!ふくてんが来ましたよ!!
皆さん!ふくてんが来ましたよ!!ru pic
 
Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfkSpring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk学 松崎
 
UEFIベアメタルプログラミング
UEFIベアメタルプログラミングUEFIベアメタルプログラミング
UEFIベアメタルプログラミングYuma Ohgami
 
How to develop a huge Single Page Application
How to develop a huge Single Page ApplicationHow to develop a huge Single Page Application
How to develop a huge Single Page ApplicationNaoki Yamada
 
「仙台ミラソン」行って来た
「仙台ミラソン」行って来た「仙台ミラソン」行って来た
「仙台ミラソン」行って来たHirokazu Tokuno
 
Webシステム脆弱性LT資料
Webシステム脆弱性LT資料Webシステム脆弱性LT資料
Webシステム脆弱性LT資料Tomohito Adachi
 
今日から始めるPython
今日から始めるPython今日から始めるPython
今日から始めるPythonKeisuke Imura
 
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12学 松崎
 
Cakephp plugin for_facebook
Cakephp plugin for_facebookCakephp plugin for_facebook
Cakephp plugin for_facebookEiji Yokota
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱Koichi ITO
 
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyoShuyo Nakatani
 
Shinogi meetup online_20200729
Shinogi meetup online_20200729Shinogi meetup online_20200729
Shinogi meetup online_20200729Naotaka Shinogi
 
IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出
IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出
IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出VOYAGE GROUP
 
Spring Boot + Doma + AngularJSで作るERP (LINE Fukuoka Meetup版)
Spring Boot + Doma + AngularJSで作るERP (LINE Fukuoka Meetup版)Spring Boot + Doma + AngularJSで作るERP (LINE Fukuoka Meetup版)
Spring Boot + Doma + AngularJSで作るERP (LINE Fukuoka Meetup版)学 松崎
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードy-uti
 

Similar to ISUCON5 予選をPHPで戦った話 (20)

JIT for PHP を試した
JIT for PHP を試したJIT for PHP を試した
JIT for PHP を試した
 
phpstudy_php_to_node
phpstudy_php_to_nodephpstudy_php_to_node
phpstudy_php_to_node
 
やって分かった自動テスト
やって分かった自動テストやって分かった自動テスト
やって分かった自動テスト
 
皆さん!ふくてんが来ましたよ!!
皆さん!ふくてんが来ましたよ!!皆さん!ふくてんが来ましたよ!!
皆さん!ふくてんが来ましたよ!!
 
Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfkSpring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
 
UEFIベアメタルプログラミング
UEFIベアメタルプログラミングUEFIベアメタルプログラミング
UEFIベアメタルプログラミング
 
How to develop a huge Single Page Application
How to develop a huge Single Page ApplicationHow to develop a huge Single Page Application
How to develop a huge Single Page Application
 
「仙台ミラソン」行って来た
「仙台ミラソン」行って来た「仙台ミラソン」行って来た
「仙台ミラソン」行って来た
 
Webシステム脆弱性LT資料
Webシステム脆弱性LT資料Webシステム脆弱性LT資料
Webシステム脆弱性LT資料
 
今日から始めるPython
今日から始めるPython今日から始めるPython
今日から始めるPython
 
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
 
YAPC::Asia2015
YAPC::Asia2015YAPC::Asia2015
YAPC::Asia2015
 
Cakephp plugin for_facebook
Cakephp plugin for_facebookCakephp plugin for_facebook
Cakephp plugin for_facebook
 
.Netlab202107
.Netlab202107.Netlab202107
.Netlab202107
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱
 
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
 
Shinogi meetup online_20200729
Shinogi meetup online_20200729Shinogi meetup online_20200729
Shinogi meetup online_20200729
 
IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出
IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出
IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出
 
Spring Boot + Doma + AngularJSで作るERP (LINE Fukuoka Meetup版)
Spring Boot + Doma + AngularJSで作るERP (LINE Fukuoka Meetup版)Spring Boot + Doma + AngularJSで作るERP (LINE Fukuoka Meetup版)
Spring Boot + Doma + AngularJSで作るERP (LINE Fukuoka Meetup版)
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロード
 

ISUCON5 予選をPHPで戦った話