ISUCON
2020/09/12のISUCON10予選にPHPで参加し、あと一歩(主観)届かず予選敗退しました。
その様子を記録します。
ラディカル・グッド・スピード(脚部限定)
PHPチーム、出場3回目
- @tutida : アプリケーション担当 基本アプリケーション以外しない
- @k_masatany : 司令塔、飛び道具担当 全体を見て指示出ししながら細かな作業を拾う
- @seike460 : インフラ、計測担当 インフラ全般を見ながらサーバーオペレーションを担当
ぞうさんチーム
詳細は後日公開予定のぞうさんチーム版のTechBlogをご確認ください
前日
早く寝ました、優勝の必須条件です。
準備
会社に集まって参加することにしてましたので、
ホワイトボードを配置したり、会社の大きなディスプレイをサブPCにつないで、
tmuxで分割したターミナルで全インスタンスをhtopする用意したりしてました。
始まる直前、心を落ち着けます。
冷静な判断が大事なことを感じているため、
ラディカル・グッド・スピード(脚部限定)の合言葉は「no more passion」です。
ISUCON開始
まずは予選マニュアルを読み込みます。
その後まずはスッとインスタンスへの接続設定を行い、インスタンスに接続します。
インフラ担当の僕はサブPCにも設定を行い、3台にhtopを行って全員が見えるディスプレイに表示し続けます。
アプリケーションチームは改善方針検討を行います。
計測担当の僕はひたすら計測環境を整えます。
kataribe、slow queryの準備まで行った段階でベンチをかけます。
New RelicはPHPの入れ替えを行う予定なので、後ほど行います。
初期ベンチは340でした。
初手
ここから役割を分けていきます。
tutida
サーバーにてGitHubの設定を行いソース管理
手元で開発環境を再現するなど開発するなど開発するための準備を行います。
nazotteのn+1をスッと修正出来たので反映していました。
k_masatany
方針をGitHubのISSUE化していきます。 その後DBのINDEXを貼ったり、理想のDB構造の検討を行います。
seike460
PHPを7.4に変更、DBをMySQL8に変更します。 NewRelicを入れて、ベンチを回します。
若干改善が見えたのですが、DBはクエリキャッシュを効かせた方が良さそうなので、 MySQL5.7に戻し、Ngnix、PHP、MySQLのパラメータチューニングをしていました。
ここで724までスコアが上昇してました。
改善を続ける
tutida
kataribeとNew Relicの結果を見ながら、遅い部分のAPIをひたすら改善していきます。
k_masatany
DB構造変更、CSV取り出し、NginxのBot対策、client_body_buffer_size調整を行います。
seike460
不要サービス停止、カーネルパラメータ変更、サーバー構成を変更しました。 nginxのロードバランシングを利用してサーバー構成次の通りにしました。
1:Web・APP - Nginx + PHP
2:APP - PHP
3:DB MySQL
ここらへんで、ベンチマークの結果は1486となってました。
終盤
DBに問題があるという事がわかっていたので、出来る限りDBの負荷を減らすべく動いていました。
tutida
k_masatany
の指示を元にひたすら改善を行います。
k_masatany
Queryの実行計画を取っていき、_tutida_
に指示を送ります。
seike460
DBのメモリが余ってる事がわかっていたので、限界までメモリチューニングを行います。
アプリケーションの修正とメモリチューニングの結果が出たのか、最終スコアは1868
になりました。
ISUCONを終えて
もうワンブレイクスルーを起こせれば予選突破も見えてきたのかなと思いながらも、
計測と分析、改善速度が足りてないことを悔やみながらISUCON10を終えました。
推測するな、計測せよの思想のもと改善サイクルを回せたのかと思いますが、
まだまだ自分たちの力不足を感じました。
次こそ本戦出場を果たしたいと考えていますので、
来年に向けて精進しようと思います。
運営の皆様
今回もとても楽しいISUCONになりました。
ありがとうございました!