ISUCON9本選を11位でフィニッシュしました
ISUCON9本選に「いんふらえんじにあー as Code」として参加し、11位でフィニッシュしました。悔しい。 最高スコアは9107、運営確認の最終スコアは8995でした。
メンバー紹介
チーム名 いんふらえんじにあー as Code
あいこん | なまえ | やくわり |
---|---|---|
matsuu | バリバリ実装する前衛 | |
netmarkjp | 司令塔 | |
ishikawa84g | レギュレーションやコードやログやDiscordを見る情報官 |
構成
初期はこんな感じですが
1台目 nginx --- go(docker) --- mysql(docker) 2台目 同上 3台目 同上
最終構成はこうなりました。
1台目 nginx --- go --- mysql(docker) 2台目 利用せず 3台目 利用せず
goをdockerから剥がしただけ、中途半端にmysqlをdockerに残したままとなりました。 このような構成になったのは以下が理由です。
- docker-composeでgoのアプリ更新がうまくいかず手っ取り早く更新ができるようにgoを引きはがした
- mysqlはバージョン8が利用されておりインストールの手間を避けた
- mysqlのcpu負荷が支配的でmysqlレプリケーション構成に変更する時間もなくサーバを分けるところまで至らなかった
ただ、この構成にしたためにsystemdの起動用service unitで考慮が必要となり、再起動対策で終盤時間を取られてヒヤヒヤものでした。
スコアの遷移
序盤足踏み状態が続いたものの後半からスコアが倍々に増えていったものの、入賞するところまでスコアを上げきれませんでした。残念。
ざっくりまとめ
ネタバレを含みますのでご了承ください。
安易にPRIMARY KEYを張ってはいけない
今回、初見でDBのCPU負荷が高く、PRIMARY KEYが設定されていないテーブルでスロークエリーが発生していたこともあり安易にPRIMARY KEYを追加したのですが、これが 大きな罠 でした。
後から分かったことではあるのですが、PRIMARY KEYがないテーブルはINSERTされた順番に意味がある上に ORDER BY
が使われておらず、むやみにPRIMARY KEYやINDEXを追加すると出力結果がかわってしまってFailになるのです。さらに質が悪いのがPRIMARY KEYを張って直後のベンチマークでは即座にエラーにならず、またPRIMARY KEYやINDEXを外しても出力結果が変わってしまい、最初からデータを作り直す以外はどう頑張っても復旧できなくなってしまった(と思い込んだ)ことです。
おそらくそれについては勘違いではないかと思いたいのですが、問題が公開されたらしっかり追試するつもりです。
goplsはメモリを食うので気を付ける
我々のチームはサーバ上でvim(vim-go)の環境を構築してプログラムの修正を行っていたのですが、goplsが思いのほかメモリーを食ってました。今回の環境はメモリーが1GBと少なくページイン/ページアウトが発生しまくって極端に体感速度が遅くなる事態が発生しました。一時は killコマンドすらメモリ不足で実行(fork)できない 最悪の事態になって無駄に時間を浪費しました。あの時間ロスがなければ…。
Docker構成は中途半端にはがすことなかれ
Docker構成のまま、Docker構成をやめる、のいずれの対応でもよかったのですが、剥がすなら中途半端にせず全部剥がすべきでした。再起動した場合の起動制御がややこしくなるためです。
docker-composeはログ出力によるメモリ消費に注意
今回webappは意図的にデバッグログの出力が多く残されているためかdocker-composeのメモリ消費がもりもり増える現象に悩まされました。今回の本選マニュアルにもメモリ消費に気をつける旨の記述があったので気をつけたいところですね。現実にもあるあるなのかも。
Alibaba Cloudのサーバはタイムゾーンが中国標準時(CST)
今回OSはUbuntu 18.04だったんですが、Alibaba CloudのUbuntuサーバはデフォルトのタイムゾーン設定が中国標準時になっているのでログを見るときは要注意です。Alibabaらしさを感じますね。ちなみに予選の環境はUTCに設定されていました。
運営のシークレットメッセージを見つけよう
運営はscreen/tmuxをつかった場合にメッセージを残していました。
# ~/.bash_profile case "${TERM}" in screen*) export PROMPT_COMMAND='printf "\033k\U1F004 %s:\033\\" "${HOSTNAME%%.*}"' ;; esac
どうなるかはぜひ手元で試してみてください。
おわりに
ありがとう運営。そしてしっかり復習しようと思います。来年も頑張るぞ!