圧倒亭グランパのブログ

30年後の自分にもわかるように書くブログ

ISUCON7の予選に落ちて悔しいので、徹底的に復習するためのDocker環境を構築しました

俺のISUCONはこれからだ...!(予選は敗退しています)

 

ISUCON7お疲れ様でした!「楽しい・勉強になる・交流が深まる」の三拍子揃ったイベントを開催していてだき、運営の方々、関係者の方々、本当にありがとうございました。

 

毎年思うのは、「普段やってないことはできないなー」ということです。「仕事だけでは技術力の幅は広がらない」と毎年のように思わされます。そういう気付きを得られるだけでもISUCONは素晴らしいですし、そういう機会に巡り会えたこそ、このチャンスを無駄にはしたくはないなと思いました。

 

そこで、以下の思惑があり、ISUCON7の予選問題のDocker環境を作成しました。

  • 例年以上に悔しかったので徹底的に復習したい
  • そろそろ皆さんのブログも出尽くして、良い情報が固まりつつありそう
  • それらを試すためにも「何度でも壊して何度でも蘇る環境」が欲しい
  • お金は節約したい(切実
  • ローカルでサクッとできたら便利そう
  • いい機会だしDockerの勉強にもなるだろう

リポジトリは下記です。

github.com

これを作っている時に matsuu さんの docker-isucon/isucon7-qualifier が準備されて「あれー!w」と思っていましたが、自分で作り始めてしまったんだから公開しよう!ということで、今回ブログに書いています。

 

 

使い方

READMEに詳しく書いてありますが、簡単にここにも記載します。

構成

複数台構成です。以下のコンテナが立ち上がります。

service名 役割
app01 webサーバー
app02 webサーバー
app03 dbサーバー
bench benchサーバー

app01, app02からapp03のmysqlに接続しています。

app0X系は、メモリ1GB、CPU1コアという制限をしています。

ベンチマークを動かすまで

適当にcloneしてください。

$ git clone https://github.com/at-grandpa/isucon7-qualify-docker.git
$ cd isucon7-qualify-docker.git

そして、

$ make up

で、各コンテナが立ち上がります。通常、buildには30分くらい掛かるのですが、Docker Hubにimageをpushしておいたので、数分で終わると思います。次に、goのwebサーバーを立ち上げます。

$ make app/start/go

立ち上がったら、ブラウザで確認してください。

アプリケーションの動作確認ができたらベンチマークをかけます。

$ make bench/start BENCH_TARGET_HOSTS=app01,app02

BENCH_TARGET_HOSTS=app01とすれば、app01だけベンチマークをかけられます。

ベンチマーク結果は下記で確認できます。

$ make bench/result

スコアのみ見たい場合は、以下を実行してください。

$ make bench/score

 

その他

メモリをCPUの制限

予選ではサーバースペックが少し貧弱でした。確かメモリ1G/CPU1コアだったと思います。これをdocker-compose.ymlで実現したかったのですが、version 3 では swarm mode でしか制限をかけられないらしく、今回のdocker-compose.ymlでは version 2 を使用しています。そのおかげで、メモリ制限とCPUコア数の制限をかけることができました。

$ make attach/app01
/usr/local/bin/docker exec -it isucon7-app01 /bin/bash
isucon@1c408cc20d0c:~/isubata$ nproc
1
$ docker stats isucon7-app01
CONTAINER           CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
isucon7-app01       0.03%               39.89MiB / 1GiB     3.90%               613MB / 68.2MB      33.4MB / 12.3kB     17

makeタスクから他の言語のアプリケーションを起動

現在、make app/start/pythonmake app/start/go しか作成していません。他の言語でも作成しようかなと思いましたが、自分は直近ではgoを使って復習するので、今は別にいらないかなと思って実装していません。余力のある方はぜひPRをお願いします。

また、基本このあたりはmakeから起動するのではなく、コンテナに入っていろいろ操作したほうが何かと融通が効くかなと思います。

TODO

  • 帯域制限のかけ方をまだググっていないので、そちらも追々実装できたらなと思ってます
  • 全言語の動作確認はまだできていません

 

俺のISUCONはこれからだ

ISUCONは「復習してナンボ」だと思います。復習時が一番勉強になると思いますし、「復習するために予選に参加したんだ!」と言っても過言ではないと思います。参加しないと悔しさからのこのモチベーションは発生しませんよね。あと、参考実装を超高速で公開してくださった運営の方々、本当にありがとうございます。「復習したくても環境構築までが。。。」というハードルは結構高いので、本当に助かりました。

今回作成したこのDocker環境で、骨の髄までISUCON7をしゃぶりつくそうと思います。それもまたブログに書こうと思います。

まだ実際にチューニングを行っていないので、もし粗が見つかったらPRやISSUEをお待ちしておりますmm