Gマイナー志向

とくに意味はありません

ISUCON9本選を11位でフィニッシュしました

ISUCON9本選に「いんふらえんじにあー as Code」として参加し、11位でフィニッシュしました。悔しい。 最高スコアは9107、運営確認の最終スコアは8995でした。

メンバー紹介

チーム名 いんふらえんじにあー as Code

あいこん なまえ やくわり
f:id:tmatsuu:20190909215748j:plain:w100 matsuu バリバリ実装する前衛
f:id:tmatsuu:20190909215614p:plain:w100 netmarkjp 司令塔
f:id:tmatsuu:20190909215620j:plain:w100 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で考慮が必要となり、再起動対策で終盤時間を取られてヒヤヒヤものでした。

スコアの遷移

f:id:tmatsuu:20191006144309p:plain
ISUCON9本選スコア遷移@いんふらえんじにあー as Code

序盤足踏み状態が続いたものの後半からスコアが倍々に増えていったものの、入賞するところまでスコアを上げきれませんでした。残念。

ざっくりまとめ

ネタバレを含みますのでご了承ください。

安易に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

どうなるかはぜひ手元で試してみてください。

おわりに

ありがとう運営。そしてしっかり復習しようと思います。来年も頑張るぞ!