読者です 読者をやめる 読者になる 読者になる

Goldstine研究所

mosuke5's tech blog

ブログ移転しました。5秒後にリダイレクトします。

ISUCON6予選で惨敗した. 足りなかったのは'Courage'

Applekeynoteで話題の'Courage'使ってみた笑

ISUCON6予選で惨敗した。(18000点くらい)
端的に言って、とても未熟だった。

とはいえ、とてもいい思い出になったのでまとめる。

メンバー

スリーエムというチーム名で、@mogulla3と@mintsu123と一緒に出場した。
ふたりともぼくよりもアプリの改善などは10倍くらい優秀なエンジニアなので、
ぼくはインフラとか総務的な立ち回りをして、2人がチューニングに集中できるようにすることを心がけていた。

準備

準備は3週間の間に土日どちらかに集まってISUCONの過去問を解いたり戦略について事前に打ち合わせしてた。

  • プライベートレポジトリの用意(Gitlab)
  • チャットルームの用意(Slack)
  • ISUCON4とISUCON5の予選の過去問解き
    • 土日集まったときには戦略や振り返りを重視
    • 実際の過去問ときは平日に各々が空いた時間などにやってた
  • 基本戦略を準備
    • なんの技術を主に使うか
    • だれが何を担当するか
    • 定形作業の手順化
    • その他ナレッジなど

採用した技術

  • PHP 7.0
  • php-fpm
  • Openresty(nginx) 1.11
  • MySQL 5.7
  • Redis 3.2

当日

出だしはとても順調だった。
Azure担当だったぼくはすぐにサーバをデプロイし、OSバージョンを確認した。
予想通りのUbuntu 16.04であったので、準備したとおり必要なミドルウェアのインストールをすませた。

ほぼ定石と言える下記(定形作業と呼んでいた)もすぐにこなすことができた。

  • 調査のための各種ログ出力化
  • Nginxでの静的ファイルの配信、キャッシュ化
  • Kataribeインストールと実行
  • MySQLのインデックスの付与と設定見直し
  • php-fpmのUnixドメインソケット化
  • デプロイの仕組みの整理
  • 不要デーモンの停止

この状態でもスコアは0のままであり、少し焦りを感じたが、
ここからが本番のチューニング開始である。
Kataribeの結果から、GET /が改善ポイントであることは明らかなのはわかっていた。

Top 20 Sort By Count
Count    Total      Mean    Stddev     Min   P50.0   P90.0   P95.0   P99.0     Max  2xx  3xx  4xx  5xx  Request
  326  366.105  1.123021  2.619395   0.000   0.000   6.188   7.418   9.827  10.207  326    0    0    0  GET / HTTP/1.0
  326  366.154  1.123172  2.618228   0.000   0.001   6.190   7.418   9.778  10.207  326    0    0    0  GET / HTTP/1.1
  240    0.000  0.000000  0.000000   0.000   0.000   0.000   0.000   0.000   0.000  240    0    0    0  GET /css/bootstrap.min.css HTTP/1.0
  240    0.737  0.003071  0.002843   0.000   0.002   0.006   0.010   0.013   0.015  240    0    0    0  GET /css/bootstrap.min.css HTTP/1.1
  120    0.101  0.000842  0.002078   0.000   0.000   0.002   0.003   0.015   0.015  120    0    0    0  GET /img/star.gif HTTP/1.1
  120    0.000  0.000000  0.000000   0.000   0.000   0.000   0.000   0.000   0.000  120    0    0    0  GET /js/jquery.min.js HTTP/1.0
  120    0.000  0.000000  0.000000   0.000   0.000   0.000   0.000   0.000   0.000  120    0    0    0  GET /img/star.gif HTTP/1.0
  120    0.152  0.001267  0.001788   0.000   0.001   0.003   0.004   0.011   0.012  120    0    0    0  GET /css/bootstrap-responsive.min.css HTTP/1.1
  120    0.000  0.000000  0.000000   0.000   0.000   0.000   0.000   0.000   0.000  120    0    0    0  GET /js/bootstrap.min.js HTTP/1.0
  120    0.148  0.001233  0.001843   0.000   0.001   0.003   0.004   0.011   0.012  120    0    0    0  GET /favicon.ico HTTP/1.1
  120    0.157  0.001308  0.001829   0.000   0.001   0.003   0.004   0.011   0.011  120    0    0    0  GET /js/bootstrap.min.js HTTP/1.1
  120    0.379  0.003158  0.002890   0.000   0.002   0.007   0.010   0.013   0.015  120    0    0    0  GET /js/jquery.min.js HTTP/1.1
  120    0.000  0.000000  0.000000   0.000   0.000   0.000   0.000   0.000   0.000  120    0    0    0  GET /favicon.ico HTTP/1.0
  120    0.000  0.000000  0.000000   0.000   0.000   0.000   0.000   0.000   0.000  120    0    0    0  GET /css/bootstrap-responsive.min.css HTTP/1.0
   67  116.697  1.741746  1.159447   0.020   1.760   2.999   3.000   3.001   3.001    0   42   25    0  POST /login HTTP/1.0
   67  116.706  1.741881  1.159099   0.020   1.760   2.999   2.999   3.001   3.001    0   42   25    0  POST /login HTTP/1.1
   35    0.857  0.024486  0.022147   0.000   0.026   0.040   0.085   0.096   0.096   35    0    0    0  GET /stars?keyword=%E5%86%85%E7%94%B0%E4%BF%AE%E5%B9%B3 HTTP/1.1
   35    0.977  0.027914  0.020538   0.000   0.031   0.049   0.062   0.077   0.077   35    0    0    0  GET /stars?keyword=%E3%82%A6%E3%83%BC%E3%82%BA HTTP/1.1
   34    0.867  0.025500  0.018035   0.000   0.028   0.044   0.059   0.071   0.071   34    0    0    0  GET /stars?keyword=%E5%8C%97%E6%B6%88%E9%98%B2%E7%BD%B2 HTTP/1.1
   32    0.731  0.022844  0.015575   0.000   0.025   0.040   0.050   0.052   0.052   32    0    0    0  GET /stars?keyword=%E8%BC%AA%E7%8A%B6%E7%94%B2%E7%8A%B6%E7%AD%8B HTTP/1.1

しかし、なかなか突破口が見いだせず、できるところからやっていく方針を取った。
アプリの改善を振り返ってみると、なにもしてねーなって感じがやばい。(何してたんだっけ…(・_・;))

  • isudaとisutarのfpmプロセスの調整
  • isudaとisutar間のhttpによるAPI呼び出しをなくし、DB接続とした
  • SQL改善
    • htmlifyのkeyword取り出しSQL
    • load_starのSQL
    • など
  • keywordのlengthを予め持つように変更
  • isudaとisutarの統合
    • 効果の検証ができず、結局マージはできなかった

反省

htmlifyの改善がなによりも効果がでることはわかっていた。
しかし、その改善についてのいい方法がすぐに思いつかなかったこともあり、
他のやれることを優先しすぎてしまったことが一番の反省点だ。

時間がない、大きな変更したら怖いという思いが強くなり、
どちらかというとやれることをきちんとやればいける、というディフェンシブな思考になってしまっていた気がする。

せっかくRedisやOpenrestyを準備していたが、
そのあたりを発揮せずにおわってしまい残念な感じではあった。
(ここは準備不足ポイントでもあった)

根本の改善に勇気を持って切り込む"Courage"を次は発揮したい。

反省会の炙りしめ鯖うまかった。

tabelog.com

最後に

反省点は多かったものの、準備期間も含めてこの1ヶ月とても楽しかったし、
また自分の未熟さを実感できてとてもよかった。

今まで、競技プログラミングなどもしたこともなく、
技術面で「競う」ということはほとんどしたことがなかった。

この敗北で、技術をきちんと理解し追求していきたいという想いが湧いてきた。
ISUCON主催者ありがとうございました。