ISUCON7 予選通過 (2017/10/22)

Created on 2017-10-22
Modified on 2017-11-09


チーム名「ひでおとゆかいななかま」としてISUCON7予選2日目に参加。 65k点くらい出せたので、学生枠で本戦出場出来ることになった。

環境構築

DBのconfigとデータのバックアップ、configの配置、ツールのインストールなど、開始時に必要だと思われる作業をスクリプト化しておいた。 これのお陰で、5分程度でセットアップすることが出来た。 便利なので、これは本戦でも使いたい。

改善が必要なところ

構成

主催者から与えられたサーバはCPU:1コア, RAM:1GiBのサーバ3台。

app0931: web1, redis1, nfs-client
app0932: web2, redis2, nfs-client
app0933: web3, redis3, mysql, nfs-server

帯域不足の問題があったため、3台使って帯域確保。 redisを使ってuserをキャッシュするなど。 画像にCache-Controlなどを設定していれば、帯域問題は軽減できたかも?

画像

画像をNFSマウントで共有し、nginxで直接返すようにした。 ただ、hardモードでマウントしてしまったため、20:20頃の再起動テストで2台からの応答が無くなる。 終了5分前くらいにサーバから復活したので、softモードに変更して競技終了。 終了間際に大急ぎで作業するのは、もうやりたくない。

NFSはsoftでマウント、それ以外も可能な限りnoerrorをしておかないと起動途中で止まる可能性がある。 複数台で共有するもっといい方法はないものか・・・

Nginx

静的ファイルにexpiresを設定。 これで帯域問題が軽減されたのか、僕は確認してない。

MySQL

キャッシュを増やしたり、slow query logを見ながらテーブルにインデックスを貼ったり。 今回の問題はイジる箇所が少なかった。

それと、MySQLのrootユーザでログインできない問題が解決できなかった。 何故だろう・・・

GET /fetch

N+1の解消を試みたがベンチマークがfailする。 さんざん悩んだ挙句、fmt.Sprintf()string.Join()でこんな感じのクエリを組み立てることで誤魔化した… orz

SELECT ... UNION SELECT ... UNION ... (チャンネルの数だけUNIONする)

これ、CASE句を使うと簡単に解決できるようだ。 こんなところでかなり時間を食ってしまったので、いい解決方法が思いつかないなら早めに方針転換するなどするべきだった。

GET /fetchがロングポートリング用のAPIであることに気づかなかった。 そのため、sleepを取り除いてしまった。この影響でスコアを落としていた可能性あり。

GET /message

jsonifyMessage()でN+1クエリが発生していたのに気づかなかった。

リソースリーク

ベンチを走らせていると徐々にメモリを食っていく問題は、結局最後まで解決できなかった。 追試中にクラッシュしないように祈るしか出来なかったデス。

その他

他のチームの構成

この記事に詳しく書かれている。

ISUCON7予選の上位陣の戦略まとめ

他のチームが行ったこと

斜め読みしたときのメモです。詳細は元記事を見て下さい。

チーム新卒 (ruby)

repo: https://gitlab.com/pgmot/isucon7q

http://abcang.hatenablog.com/entry/2017/10/25/005837

http://programmermot.hatenablog.com/entry/2017/10/23/230523

海南鶏飯 (ruby, 予選落ち)

http://ainame.hateblo.jp/entry/2017/10/24/100543

チーム名を考えるのが苦手すぎる (javascript)

http://amaya382.hatenablog.jp/entry/2017/10/23/131038

Dark (php, 予選落ち)

repo: https://github.com/ara-ta3/isucon7-qualifier

http://arata.hatenadiary.com/entry/2017/10/24/193112

http://blog.hotolab.net/entry/isucon7q

rehash.fm (ruby, 予選落ち)

http://azihsoyn.hatenablog.com/entry/2017/10/23/233855

円山町 (go)

http://blog.hidekiy.com/2017/10/isucon-isucon7.html

なにもしちょらんのに壊れた (ruby, 学生枠)

repo: https://github.com/k5342/isucon7-qualification

http://blog.ksswre.net/2017/10/isucon-7-qualification.html
http://chigichan24.hatenablog.com/entry/2017/10/23/000703
http://chigichan24.hatenablog.com/entry/2017/10/23/204726

http://euglena1215.hatenablog.jp/entry/2017/10/23/030354

百万円ドリブン (go, 学生枠)

http://chy72.hatenablog.com/entry/2017/10/24/191549

ババウ (python)

http://d.hatena.ne.jp/tmatsuu/20171022/1508673763
https://netmark.jp/2017/10/post-1411.html

学生気分 (ruby, 予選落ち)

http://diary.hatenablog.jp/entry/2017/10/23/030209
http://osyoyu.hatenablog.com/entry/2017/10/23/014843

スギャブロエックス (nodejs)

repo: https://github.com/gfx/isucon7-qualify

http://memo.sugyan.com/entry/2017/10/22/232703

http://kazeburo.hatenablog.com/entry/2017/10/23/181843

FEAR FOR FIGHT 駆け込んだ戦士たち (予選落ち)

http://igatea.hatenablog.com/entry/2017/10/22/213819

焼肉ジャンボチキン (go)

repo: https://github.com/krtx/isucon2017-production

http://krtx.hatenablog.com/entry/2017/10/24/002744

MSA (go)

http://mizkei.hatenablog.com/entry/2017/10/23/182820

きっちんゴリラ (ruby, 予選落ち)

fujiwara組 (go)

http://sfujiwara.hatenablog.com/entry/2017/10/23/123240

https://beatsync.net/main/log20171023.html

白金動物園 (ruby)

https://diary.sorah.jp/2017/10/23/isucon7q

にるぽ (go)

https://qiita.com/najeira/items/2898f6cb26b4a01ec870