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をしておかないと起動途中で止まる可能性がある。 複数台で共有するもっといい方法はないものか・・・
静的ファイルにexpiresを設定。 これで帯域問題が軽減されたのか、僕は確認してない。
キャッシュを増やしたり、slow query logを見ながらテーブルにインデックスを貼ったり。 今回の問題はイジる箇所が少なかった。
それと、MySQLのrootユーザでログインできない問題が解決できなかった。 何故だろう・・・
N+1の解消を試みたがベンチマークがfailする。
さんざん悩んだ挙句、fmt.Sprintf()
とstring.Join()
でこんな感じのクエリを組み立てることで誤魔化した…
orz
SELECT ... UNION SELECT ... UNION ... (チャンネルの数だけUNIONする)
これ、CASE句を使うと簡単に解決できるようだ。 こんなところでかなり時間を食ってしまったので、いい解決方法が思いつかないなら早めに方針転換するなどするべきだった。
GET /fetchがロングポートリング用のAPIであることに気づかなかった。 そのため、sleepを取り除いてしまった。この影響でスコアを落としていた可能性あり。
jsonifyMessage()でN+1クエリが発生していたのに気づかなかった。
ベンチを走らせていると徐々にメモリを食っていく問題は、結局最後まで解決できなかった。 追試中にクラッシュしないように祈るしか出来なかったデス。
この記事に詳しく書かれている。
斜め読みしたときのメモです。詳細は元記事を見て下さい。
repo: https://gitlab.com/pgmot/isucon7q
http://abcang.hatenablog.com/entry/2017/10/25/005837
http://programmermot.hatenablog.com/entry/2017/10/23/230523
http://ainame.hateblo.jp/entry/2017/10/24/100543
http://amaya382.hatenablog.jp/entry/2017/10/23/131038
repo: https://github.com/ara-ta3/isucon7-qualifier
http://arata.hatenadiary.com/entry/2017/10/24/193112
http://blog.hotolab.net/entry/isucon7q
http://azihsoyn.hatenablog.com/entry/2017/10/23/233855
http://blog.hidekiy.com/2017/10/isucon-isucon7.html
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
http://chy72.hatenablog.com/entry/2017/10/24/191549
http://d.hatena.ne.jp/tmatsuu/20171022/1508673763
https://netmark.jp/2017/10/post-1411.html
http://diary.hatenablog.jp/entry/2017/10/23/030209
http://osyoyu.hatenablog.com/entry/2017/10/23/014843
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
http://igatea.hatenablog.com/entry/2017/10/22/213819
repo: https://github.com/krtx/isucon2017-production
http://krtx.hatenablog.com/entry/2017/10/24/002744
http://mizkei.hatenablog.com/entry/2017/10/23/182820
http://sfujiwara.hatenablog.com/entry/2017/10/23/123240
https://beatsync.net/main/log20171023.html
https://diary.sorah.jp/2017/10/23/isucon7q
https://qiita.com/najeira/items/2898f6cb26b4a01ec870