爆速でGo!スマートフォン用の表示で見る爆速でGo!GoGo!2018-10-21isucon8本戦で惨敗したからせめて良いブログを書くISUCON8の本戦に、メルカリで一緒だった@zaq1tomoと@inatonixとzin-gonicというチーム名で出場しました。結果は学生9位、全体で19位だったので、やったこととかまとめます。予選エントリはこちらです↓nakawatch.hatenablog.comやったことチューニング対象は、isucoinという取引所アプリでした。言語は予選と同じGoです。github.com担当も予選と同じです。序盤@nakabonne序盤は主にプロファイリングの準備です。ssh公開鍵登録dotfileをcloneベンチ走らせてhtopでリソース確認デプロイスクリプトの準備スロークエリログを仕込むアクセスログのプロファイルングツールalpを仕込むログローテートスクリプトを仕込むnginxのアクセスログをLTSV形式に今回はdockerでデーモン化されていたため、パフォーマンスが少し気になる上にプロファイリングが少し面倒でした。当初はdockerを剥がしてsystemdに乗せ換えようとしましたが、工数に対するインパクトが見込めず一旦後回しにしました。logsに流しており、アクセスログがうまく拾えず若干詰まりました。@zaq1tomoマニュアルとコード読んで仕様把握pprofでプロファイリング方針決め各プロファイリング結果毎に見ていきます。リソース実行時にCPU使用率は100%に張り付き、半分以上はmysqlが食っていました。メモリもギリギリで、こちらも同じく大半はmysqlのキャッシュによるものでした。この時点で早いうちにDBを外に切り出すことは決めました。スロークエリ全tradeをソートしてから取得するクエリがまず第一関門っぽかったので、初動は決まりました。二つ目もクエリ数減らせないか調査の必要がありそうだと話した気がします。見ていく必要があるのは一目瞭然で、エンドポイントが少ないことから一筋縄ではいかない匂いがプンプンでした。中盤@nakabonnemysqlを別サーバーに移行nginx基本チューニングこのクエリやばそうとかつぶやくmysqlを切り出し、サーバー1をapp+nginxのみの構成にしたためCPUに半分くらい空きが出来ました。CPUがボトルになるまではしばらくappは一台で動かそうとなりました。tradeから取得するフィールドをidのみにする修正この@zaq1tomoの修正で500点→3200点に伸びました。trade取得時にLIMITかける修正つかの間の1位この修正で5136点まで伸びました。この瞬間、我々zin-gonicは1位に躍り出ました。この時を最後に我々が笑顔になることはありませんでした。終盤@nakabonneshareボタンを有効に、、CPUに余裕が出来たところで、リソースを使い切りたいと思っていたところ、@inatonixが怪しいものを見つけました。falseどうやらシェアボタンを有効にすると取引成立時にシェアされてユーザーが流れ込み、一気に負荷があがるそうで、これだ!と有効にしました。DBサーバーを見てみるとCPUが使い切られていたので、ロックされてるのかな?と思いつつとりあえずこれはまだ早いと判断して、そっとブランチを切り替えました。講評を聞く限りここで負荷を上げても耐えられるようにすることが鍵だったらしいです。悪あがきこのブランチ量を見れば悪あがきをしていたことが分かります。何も意味をなしていません。問題作成していただいたDeNAさん、カヤックさん、主催のLINEさん、サーバー提供していただいたConoHaさん、本当にありがとうございました。今回の優勝者は学生であり、それを讃えている皆さんを見て、改めて最高の業界に来てしまったと感じました。isucon9があるならば、来年も学生枠使えるので(もはやそんな枠があるかは不明)出場したいと思います。(2)月別アーカイブはてなブログをはじめよう!NakaWatchさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。