〜第三回模擬isuconを終えて〜
こんにちは!
先週、第三回模擬isuconをやりました!
ブログには書いてないのですが、1,2回目も実はやっていました。
先輩達が書いてくれています
一回目(pixivのprivate-isucon)
・http://masa-world.hateblo.jp/entry/2017/07/06/233357
・http://matsuda-juri.hatenablog.com/entry/2017/06/27/142352
2回目(isucon5)
・http://masa-world.hateblo.jp/entry/2017/07/06/233357
・http://matsuda-juri.hatenablog.com/entry/2017/08/01/174159
さて、今回3回目模擬isuocnでは
isucon6(ややこしい)をやる予定。。。。
だったのですが、
まさかの
サーバ起動後のプロビジョン(課題のwebapp)が立ち上がらず、アレヤコレヤしたのですが
時間もないので諦めて、復習を兼ねて前回やったisucon5をやってみようということになりました。
あと、
上の先輩方の記事を見たらわかるのですが、
3人で八時間やって最終スコア0点でした。。。
(ちなみに初期スコアが300くらいww 初期スコアより低いw)
前回の反省とコーチの助言を踏まえてやろうと試みたこととして
①mysqlのmy.cnfとnginxのnginx.confをチューニング(前回、コーチがmy.cnfいじって約2万点上がった。)
②N+1問題解決する
でした。
①my.cnfとnginx.conf
そもそも、なんで設定ファイルいじるのかというと
今回のネックとして、②のN+1問題もあったのですが、
前回コーチがそこを解決してもスコアが600くらいしか伸びなかった。そのあとにhtop使って見てみると
DB側に適切にメモリが割り当てられないことがわかりmy.cnfをチューニングすると約二万点に上がった。
nginxは先輩が担当、僕がmy,cnf担当だったので
catasuyさんのmy.cnfを参考に(てか、ほぼパクリ)していじってみると
スコア:300 → 600
あれ?あんまり上がっていない。
前にコーチがいじった時、二万点くらい上がったのに。。
しかも追加した設定もほとんど変わっていないのに。。
そして、
先輩がnginx.confいじり、そしてデータにindex貼ったりするが
スコア:600→1000
あれ?
確かに前回よりもスコア上がっているし、試みたこともできたから嬉しい。
けど、なんか全然スコア上がってなさすぎて嬉しさ半減。
と、とりあえず、気を取り直して②にGO
②N + 1問題
今回、もっともボトルネックなのがこのN +1問題。
ログインユーザーのフレンドかどうかを判断する際に無駄なクエリが発行されている。
ということで、そこのクエリ文を直せば良いことにチームメンバー全員が気づいた。
お、すごく順調じゃん!
となるが
なおせねぇ
というか、誰もクエリ文の直し方とか書き方マスターしてる人がいねぇ。。
チューニングする場所がわかっているのに直せない辛さ。。。
(*うまくいけば 1200クエリ→ 16クエリくらいに減るらしい。)
ググリまくって、書き方を調べて試してみるも
うまくいかず。スコアが下がるどころかエラーが出た。
さらに、rack-mini-profilerとかrack-line-profilerを入れたり
アレヤコレヤやってるうちに時間がすぎて行き
結局、最終スコア 940点でしゅーりょー。
今回の振りかえり
・設定ファイルをいじったとしても、肝心の無駄なクエリが解決していないのでDB側が無駄な動きをしっぱなしで、あまり点数に繋がらなかった。
・ボトルネックがわかっても、改善する腕がなければ、意味ない(当たり前)
ただ、よかった点として
・自分達が詰まったところを書き込んで復習できるようにした。
・設定ファイルチューニングがある程度できるようになった。
そして
そもそものコーディング力ってまじで大事!!ってことがわかった
当たり前でしょ?って感じだけど、こうやって模擬isuconをやっての実感値は全然違うなと思いました。
あと、個人的な問題は
コードを読んでこのメソッドがどういう働きをしているのかだったりコードからサービス全体像の把握がまだできていないなと思いました。
圧倒的に読んでる量と書いてる量が足りてない問題。。
とりあえず、
次回までにクエリ文を習得しようと思います。
ではでは〜