Submit Search
Upload
ISUCON5 予選をPHPで戦った話
•
0 likes
•
1,297 views
S
Suguru Shirai
Follow
ISUCON5 予選をPHPで戦いました もろもろ学んだ事をはなします
Read less
Read more
Software
Report
Share
Report
Share
1 of 62
Download now
Download to read offline
Recommended
プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜
プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜
Keisuke Utsumi
チラ見せ♡ナイト@20150410 LT公開用
チラ見せ♡ナイト@20150410 LT公開用
Keisuke Utsumi
俺 と ご褒美 Bot
俺 と ご褒美 Bot
Masayuki KaToH
開発時の探し物を楽にする習慣作り
開発時の探し物を楽にする習慣作り
Koichi ITO
Java one 2013 sf 報告会lt
Java one 2013 sf 報告会lt
torutk
groceryCRUDとtank_authで簡単に管理画面と認証機能を作る
groceryCRUDとtank_authで簡単に管理画面と認証機能を作る
Akishige TAKEKOSHI
CodeIgniter3マニュアル和訳の方法と感想
CodeIgniter3マニュアル和訳の方法と感想
Akishige TAKEKOSHI
Python札幌201406
Python札幌201406
Shinya Okano
Recommended
プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜
プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜
Keisuke Utsumi
チラ見せ♡ナイト@20150410 LT公開用
チラ見せ♡ナイト@20150410 LT公開用
Keisuke Utsumi
俺 と ご褒美 Bot
俺 と ご褒美 Bot
Masayuki KaToH
開発時の探し物を楽にする習慣作り
開発時の探し物を楽にする習慣作り
Koichi ITO
Java one 2013 sf 報告会lt
Java one 2013 sf 報告会lt
torutk
groceryCRUDとtank_authで簡単に管理画面と認証機能を作る
groceryCRUDとtank_authで簡単に管理画面と認証機能を作る
Akishige TAKEKOSHI
CodeIgniter3マニュアル和訳の方法と感想
CodeIgniter3マニュアル和訳の方法と感想
Akishige TAKEKOSHI
Python札幌201406
Python札幌201406
Shinya Okano
Spring starterによるSpring Boot Starter
Spring starterによるSpring Boot Starter
Ryosuke Uchitate
C# で QnA Bot
C# で QnA Bot
Yoshitaka Seo
Bottle使ってPython学習一緒にはじめませんか?
Bottle使ってPython学習一緒にはじめませんか?
Tatsuya Shinozuka
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアル
Satoshi Yamada
Windowsにpythonをインストールしてみよう
Windowsにpythonをインストールしてみよう
Kenji NAKAGAKI
本気でPythonで宛名書きした話
本気でPythonで宛名書きした話
Satoshi Yamada
Motivationware
Motivationware
Koichi ITO
bottleで始めるWEBアプリの最初の一歩
bottleで始めるWEBアプリの最初の一歩
Satoshi Yamada
ASP.NETで お手軽Ajax実装
ASP.NETで お手軽Ajax実装
echigoya-jp
Go言語オーバービュー201507
Go言語オーバービュー201507
エンジニア勉強会 エスキュービズム
Djangoフレームワークの紹介 OSC2015北海道
Djangoフレームワークの紹介 OSC2015北海道
Shinya Okano
Bot Framework で会話のログを取る
Bot Framework で会話のログを取る
Atsushi Yokohama (BEACHSIDE)
システム開発は何故揉めるのか
システム開発は何故揉めるのか
echigoya-jp
スクレイピングとPython
スクレイピングとPython
Hironori Sekine
Requestsで始める5分前帰社
Requestsで始める5分前帰社
Satoshi Yamada
Goをえらんだ理由
Goをえらんだ理由
Tatsumi Naganuma
UiPathロボットをわたしのアシスタントに
UiPathロボットをわたしのアシスタントに
Yoichi Suetake
著者が語るUiPath書籍執筆の裏話
著者が語るUiPath書籍執筆の裏話
Masaaki Yoshida
Pythonにおけるデバッガツールpdbについて
Pythonにおけるデバッガツールpdbについて
Ryota Sakamoto
DroidKaigi 2018 - Dialogflow for Android
DroidKaigi 2018 - Dialogflow for Android
SENSY Inc
JIT for PHP を試した
JIT for PHP を試した
y-uti
phpstudy_php_to_node
phpstudy_php_to_node
Suguru Shirai
More Related Content
What's hot
Spring starterによるSpring Boot Starter
Spring starterによるSpring Boot Starter
Ryosuke Uchitate
C# で QnA Bot
C# で QnA Bot
Yoshitaka Seo
Bottle使ってPython学習一緒にはじめませんか?
Bottle使ってPython学習一緒にはじめませんか?
Tatsuya Shinozuka
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアル
Satoshi Yamada
Windowsにpythonをインストールしてみよう
Windowsにpythonをインストールしてみよう
Kenji NAKAGAKI
本気でPythonで宛名書きした話
本気でPythonで宛名書きした話
Satoshi Yamada
Motivationware
Motivationware
Koichi ITO
bottleで始めるWEBアプリの最初の一歩
bottleで始めるWEBアプリの最初の一歩
Satoshi Yamada
ASP.NETで お手軽Ajax実装
ASP.NETで お手軽Ajax実装
echigoya-jp
Go言語オーバービュー201507
Go言語オーバービュー201507
エンジニア勉強会 エスキュービズム
Djangoフレームワークの紹介 OSC2015北海道
Djangoフレームワークの紹介 OSC2015北海道
Shinya Okano
Bot Framework で会話のログを取る
Bot Framework で会話のログを取る
Atsushi Yokohama (BEACHSIDE)
システム開発は何故揉めるのか
システム開発は何故揉めるのか
echigoya-jp
スクレイピングとPython
スクレイピングとPython
Hironori Sekine
Requestsで始める5分前帰社
Requestsで始める5分前帰社
Satoshi Yamada
Goをえらんだ理由
Goをえらんだ理由
Tatsumi Naganuma
UiPathロボットをわたしのアシスタントに
UiPathロボットをわたしのアシスタントに
Yoichi Suetake
著者が語るUiPath書籍執筆の裏話
著者が語るUiPath書籍執筆の裏話
Masaaki Yoshida
Pythonにおけるデバッガツールpdbについて
Pythonにおけるデバッガツールpdbについて
Ryota Sakamoto
DroidKaigi 2018 - Dialogflow for Android
DroidKaigi 2018 - Dialogflow for Android
SENSY Inc
What's hot
(20)
Spring starterによるSpring Boot Starter
Spring starterによるSpring Boot Starter
C# で QnA Bot
C# で QnA Bot
Bottle使ってPython学習一緒にはじめませんか?
Bottle使ってPython学習一緒にはじめませんか?
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアル
Windowsにpythonをインストールしてみよう
Windowsにpythonをインストールしてみよう
本気でPythonで宛名書きした話
本気でPythonで宛名書きした話
Motivationware
Motivationware
bottleで始めるWEBアプリの最初の一歩
bottleで始めるWEBアプリの最初の一歩
ASP.NETで お手軽Ajax実装
ASP.NETで お手軽Ajax実装
Go言語オーバービュー201507
Go言語オーバービュー201507
Djangoフレームワークの紹介 OSC2015北海道
Djangoフレームワークの紹介 OSC2015北海道
Bot Framework で会話のログを取る
Bot Framework で会話のログを取る
システム開発は何故揉めるのか
システム開発は何故揉めるのか
スクレイピングとPython
スクレイピングとPython
Requestsで始める5分前帰社
Requestsで始める5分前帰社
Goをえらんだ理由
Goをえらんだ理由
UiPathロボットをわたしのアシスタントに
UiPathロボットをわたしのアシスタントに
著者が語るUiPath書籍執筆の裏話
著者が語るUiPath書籍執筆の裏話
Pythonにおけるデバッガツールpdbについて
Pythonにおけるデバッガツールpdbについて
DroidKaigi 2018 - Dialogflow for Android
DroidKaigi 2018 - Dialogflow for Android
Similar to ISUCON5 予選をPHPで戦った話
JIT for PHP を試した
JIT for PHP を試した
y-uti
phpstudy_php_to_node
phpstudy_php_to_node
Suguru Shirai
やって分かった自動テスト
やって分かった自動テスト
Hirokazu Tokuno
皆さん!ふくてんが来ましたよ!!
皆さん!ふくてんが来ましたよ!!
ru pic
Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
学 松崎
UEFIベアメタルプログラミング
UEFIベアメタルプログラミング
Yuma Ohgami
How to develop a huge Single Page Application
How to develop a huge Single Page Application
Naoki Yamada
「仙台ミラソン」行って来た
「仙台ミラソン」行って来た
Hirokazu Tokuno
Webシステム脆弱性LT資料
Webシステム脆弱性LT資料
Tomohito Adachi
今日から始めるPython
今日から始めるPython
Keisuke Imura
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
学 松崎
YAPC::Asia2015
YAPC::Asia2015
Masaru Hoshino
Cakephp plugin for_facebook
Cakephp plugin for_facebook
Eiji Yokota
.Netlab202107
.Netlab202107
TomomitsuKusaba
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱
Koichi ITO
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
Shuyo Nakatani
Shinogi meetup online_20200729
Shinogi meetup online_20200729
Naotaka Shinogi
IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出
IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出
VOYAGE GROUP
Spring Boot + Doma + AngularJSで作るERP (LINE Fukuoka Meetup版)
Spring Boot + Doma + AngularJSで作るERP (LINE Fukuoka Meetup版)
学 松崎
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロード
y-uti
Similar to ISUCON5 予選をPHPで戦った話
(20)
JIT for PHP を試した
JIT for PHP を試した
phpstudy_php_to_node
phpstudy_php_to_node
やって分かった自動テスト
やって分かった自動テスト
皆さん!ふくてんが来ましたよ!!
皆さん!ふくてんが来ましたよ!!
Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
UEFIベアメタルプログラミング
UEFIベアメタルプログラミング
How to develop a huge Single Page Application
How to develop a huge Single Page Application
「仙台ミラソン」行って来た
「仙台ミラソン」行って来た
Webシステム脆弱性LT資料
Webシステム脆弱性LT資料
今日から始めるPython
今日から始めるPython
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
YAPC::Asia2015
YAPC::Asia2015
Cakephp plugin for_facebook
Cakephp plugin for_facebook
.Netlab202107
.Netlab202107
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
Shinogi meetup online_20200729
Shinogi meetup online_20200729
IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出
IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出
Spring Boot + Doma + AngularJSで作るERP (LINE Fukuoka Meetup版)
Spring Boot + Doma + AngularJSで作るERP (LINE Fukuoka Meetup版)
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロード
ISUCON5 予選をPHPで戦った話
1.
ISUCON5 予選を PHPで戦った話 2015/10/28 #phpstudy 株式会社サイバーエージェント ⽩白井 英
2.
2 お前、誰よ • 株式会社 サイバーエージェント •
SGE統括本部技術統括室 CTO • 白井 英 • エンジニア • Twitter @goodoo • Blog http://ameblo.jp/goodoo • DQ10 すぐちむ (FB392-435) プクリポ(旅芸人)
3.
• ISUCONとは? • 準備 •
何をしたか • 何が足らなかったか • まとめ Agenda
4.
ISUCONとは
5.
・Webアプリケーションの 高速化コンテスト ・1日かけてWebアプリケーションを チューニング ・レギュレーション内であれば何でも可
6.
・複数言語用意されていた (今回は、Ruby,Perl,Python,PHP) ・ベンチマークツールのスコアで競う ・1チーム3名以内 (2名はいないとつらい・・・)
7.
準備
8.
前日までにしたこと・・
9.
http://www.slideshare.net/kazeburo/isucon-yapcasia-tokyo-2015
10.
スライドを 熟読
11.
チームで分担して 準備する事を4つ決めた
12.
1. コミュニケーションツール
13.
2. レポジトリ
14.
3. Wiki
15.
4. GCPのプロジェクトの設定
16.
そして当日・・
17.
何をしたか
18.
ルールの確認
19.
予選通過 予選は以下のルールで通過者が決定します。 1日目、2日目、それぞれで3000点に最も早く到達したチーム (ただし予選終了後の追試の対象には含まれます) それぞれの日で最後に提出した有効なスコアの上位4チーム 上記10チームを除き、1日目と2日目を通した上位10チーム またこれとは別枠で、1日目と2日目を通した学生枠の上位5チーム
20.
開始して 最初の1時間
21.
初期状態でベンチマークツールを 走らせる・・・ SCORE 100ぐらい(Ruby)
22.
次に Ruby -> PHP DBのバックアップ(dump) を実行
23.
SCORE 800ぐらい
24.
チーム内での一言 「PHP優秀じゃん」
25.
ちなみに後から考えてわかったことですが 最初にDBのdumpをとったため DBのデータがキャッシュにのった関係で スコアが8倍のびました 決してRuby->PHPが効いた訳では ありません
26.
DBまわりの チューニング をはじめる
27.
pt-query-digestをいれてもらう (そのあとNewRelicもいれてもらった)
28.
my.cnfどこ 問題
29.
/etc/my.cnfを変更しても反映されない ・・・ とりあえず mysql> set global
XXX=xxx で逃げる でもslow-queryのファイルが 吐き出せない・・・
30.
/etcの下を さがす・・
31.
あった! /etc/mysql/mysql.conf.d/mysqld.cnf
32.
・クエリーキャッシュをON ・とりあえずメモリまわりチューニング - innodb_buffer_pool - xxxx_buffer_size ・php-fpmのプロセス数を1->10へ
33.
あれ・・・
34.
3,000スコア 越えてる!
35.
しかし・・・
36.
10分差で 3,000スコア 1番乗りならず
37.
もっと早く やっておけば・・
38.
気を取り直して
39.
pt-query-digestの 結果を愚直に直す
40.
・INDEXをはる -> スロークエリチェック のループ (カラム数が4つのテーブルに カラム数3つの複合インデックス read命みたいなものも作る・・) 結果、0.1sec以上のスロークエリーは0
41.
遅いページは ・・・・
42.
/ HTTP/1.1" 200
17331 "-" "Isucon5q bench" 1.614
43.
/ TOPページが おもい!
44.
ここまでで 開始して 3時間くらい
45.
プログラムを 修正する 決意!
46.
PHPは Slimという マイクロフレームワーク でかかれていた
47.
直した場所!
48.
$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; です。
49.
loop中にSQLを なげるのをやめた
50.
もう1カ所 loop中に クエリーを投げている 場所があったが直せず ※問題の詳細が知りたい方はこちら(http://isucon.net/)
51.
一旦今の ベストスコアを 作ってみる ※他のメンバーも諸々チューニングしてくれましたが 自分のわかる範囲のみ書いてます
52.
各種ログを止める ・slowlog ・NewRelic ・xdebug
53.
結果
54.
何が足らなかったか
55.
いろいろ足らないのは 承知の上ですが 1つだけやっておけば よかったこと
56.
こたえは 最初にやったこと
57.
DBのdump =(データの キャッシュのせ)
58.
正しくは次のパラメータ innodb_buffer_pool_dump_at_shutdown=ON innodb_buffer_pool_load_at_startup=ON バッファプールのダンプ、リストアを実施を行う設定
59.
まとめ
60.
オンライン予選 利用言語比率 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組
61.
本選出場が決まった27チーム Ruby 37.0% 10組 Perl 25.9%
7組 Golang 22.2% 6組 Python 11.1% 3組 PHP 3.7% 1組 未回答 7.4% 2組
62.
頑張れPHP
Download now