ISUCON9 参加記
研究室の同期たちとISUCON9 予選に出場したのでその記録
結果
全体177位
最終スコア4,300イスコイン
https://gyazo.com/b5c21bd0cbe2176ceb3cc7c939fc6d3d
参加までにやったこと
プロファイリングツールの使い方を覚える
当日ググらなくてもいいぐらいが目標
htop
そのまま実行
alp
netdata
CPUの様子はわかる
重い
メモリ60MB
メモリカツカツ環境だとこれでも苦しい
監視には使えそうだけど,ボトルネックを探すには微妙っぽい
code:sh
$ sudo firewall-cmd --zone=public --add-port=19999/tcp --permanent
$ sudo firewall-cmd --reload
dstat
iostat
mysqlのスロークエリを見つける方法
pt-query-digest
slow_query_log
pythonのプロファイラ
APIのエンドポイント
関数の実行
当日最初にやることをまとめる
飲食物の確保
間食や飲み物を予め準備しておく
問題把握
Developer Toolで構成を推し量る
code:Responce Header
HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)
Date: Thu, 05 Sep 2019 04:26:32 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Cookie
Content-Encoding: gzip
ここからわかること
リバースプロキシにnginxを使ってる
keep-aliveはやってる
gzipを使ってる
レギュレーションをちゃんと読む
スコアの算出方法(なにが得点になるか)
失格条件(どこまで変えていいか)
最初のベンチを回す
計測もする
当日やったこと
当日書いていた作業ログをほぼそのまま記載
10:10ぐらい
立てるサーバーは3台まで
initializeのcampaignをいじることで負荷を変えられるらしい
10:30ぐらい
サーバー1台目が立つ
11:13
Python実装にしたら静的ファイルが配信されない問題が発生
discordでもPyhton実装ハマりがいくつか報告されているが関係ない?
→app.pyのシンボリックリンクが原因だった
アプリケーションとか設定ファイル諸々をgit管理したかったのでこういう構成
アプリ内のパス参照でコケてる
11:17
2台目3台目が立つ
11:43
Python初期実装でベンチが通った
1,410イスコイン
取引が完了した商品(椅子)の価格の合計(イスコイン) - 減点 = スコア(イスコイン)
成功と減点の内訳を知りたい
12:11
2台目, 3台目の初期設定を終える
alpのログ集約の正規表現に苦戦中?
12:17
今の所わかった問題
transactions.jsonのGETが遅い
作るのにもたついてそう
ページングのSQL文が遅い?
staticなファイルをlocalhostでなくnginxから配信するように設定を変える
SELECT * FROM categories WHERE id = Nが17万回も呼ばれてる
N+1問題っぽい
そもそもcategoriesは小さいのでDBを経由する必要はあるのか
categoryの構成要素
id
parent_id
category_name
読んでるところ
/settings
/new_items
/items
13:19
categoriesをDBを参照しないようにしてみる
dict型
get_category_by_idは必ずparentを返すようになっている
settingsはcategoriesを素で返す
14:55
categoriesいじりが完成
とりあえずグローバル変数にベタ書き
→あまり早くなってない
campaignをいじればなんとかなる?
15:14
campaign > 3で2,600 イスコインに上昇
複数台構成も考慮に入れる?
15:23
ベンチ中のhtopを見てみる
CPUが100%
メモリは0.8G/4Gでかなり余裕あり
スワップも0
プロセスを10個→20個ぐらいにしてみる?
サービスのinitファイルの引数?をいじるらしい
2,900イスコイン
さらにプロセスを20個→40個に
5,510イスコイン
さらにプロセスを40個→80個に
ここでメモリ2GBを使いきる
4,410イスコインに落ちる
GET /users/transactions.json リクエストに失敗しました (user_id: 1221)(タイムアウトしました)
MySQLも潤沢にメモリを使わせるようにしてみる?
オンメモリにすると再起動テスト通るか怪しい
CREATEでどうせ初期化するなら関係ない?
「データの永続化」チェックに引っかかりそう
16:01
改めてログ(alpで取ったもの)を見てみる
POST /buy が遅い
SQLのUPDATE関係でロックがかかっている?
GET /users/transactions.json も相変わらず遅い
すでに多少チューンしているが今の所お手上げ
POST /login
16:20
buyが動かない
Failed to fetchが出る
ちょっと待ったら治った
運営側のサーバーが逝ってた?
ちょっと前ポータルを再起動してた
その直前にshipmentの調子が悪かった?
16:37
gzipを導入したら4,410イスコイン に
CPUを食っている?
17:22
dbh()の接続形式をTCPからUnixSocket?に変えてみる
17:50
いろいろいじったり戻したり
failしなければもういいやぐらいの気持ちになる
スコアが4,410 イスコイン
18:13
4,300イスコインでフィニッシュ
感想
よかったこと
チーム
計測→仮説→検証のループが回っていた
マニュアル・レギュレーションはちゃんと理解できた
メンバーそれぞれがやることをやっていた
宙ぶらりんになる状況はあまりなかったと思う
個人
泥臭いけど効果がある系の改善をちゃんとやれた
メンバーが良い働きをしたときにナイスなどの声がけを無意識的にできた
思うところ
個人
ログ取りのやり方がちゃんとドキュメント化されてたのに気づかず丸投げしてた
よく分からないままスコアが下がっていって最後ヤケになってたところ
その他
「推測するな,計測せよ」は金言だと思う
ISUCONに限らずいろんなことに言える話だと思う
discordのわいわい感がよかった
感想部屋で所属とか世代の壁を超えて盛り上がってる感じがいい
いい意味でゲームコミュニティ的なものを感じた