my cognition

書きたいことを書きます。

ISUCON 11予選に1人参加して楽しかった話。

かたやまです。

色々あって1人参加となりました。担当はサーバ構成周りの整備とデプロイ周りの作業者だったので、元々予定していた工程は十分できたのと、準備した部分の検証でスコアが出たので満足でした。 最初のスコアは 1798 、最終スコアは 8785 でした。

isucon.net

※予選結果発表の明日14時以降にしか下記のリンクは動作しません。 (CFnのスタックが消せない関係で、IPを含むコードの公開するとアクセスできちゃって負荷かけられたりするので、結果発表以降にGitHubリポジトリをprivateからpublicへ変更します。)

タイムライン

  • 10:05 CFn待ちの時間でインスタンスのこととか調べる
  • 10:19 手元のマシンでユーザ設定とかし忘れてたのでする(練習で作ってたマシンを削除してた)
  • 10:30 イニシャルコミット完了
  • 11:09 go の Makefile を作る
  • 11:28 preスクリプトを仕込む
  • 12:20 conf周りを追加したりシンボリックリンクにしたり
  • 12:31 bind-address変えたりgrant変えて isucon@% で繋げるように
  • 12:33 完全に間違った構成の変更
  • 12:55 preスクリプトがサービスをdisableしててしんでたのでstopに。あとサーバごとに処理を分けた
  • 12:59 proxy+app - DBの2台構成へ切り替えた(3台構成にしたつもりだった)
  • 13:16 MariaDBを10.3.x -> 10.6.3へ
  • 多分この辺でgoを1.17.0に変更完了
  • 13:27 13:29ltsvにしてalpで見れるように
  • 14:11 14:16 あやしい drop率を0.9から1.0にしてスコアがしんだんで0.9に戻したり
  • 14:40 15:01 15:03 直接mysqlでselect分を limit 5 とかで見るとimageが入ってることに気づいたので、 image を明示的に分離していったり
  • 15:12 2台構成になっていることに気づき3台構成にするがスコアが落ちる
  • 15:22 GitいじってるUbuntuくんのVSCodeがしぬ
  • 16:49
  • 17:14 17:52 重そうなとこをキャッシュ変えようとするが、サーバの思う時間とベンチマーカーの思う時間が違うらしいことにマニュアルで気づいたので戻す
  • 18:19 ログを止めたり2台構成に戻す
  • ウ”ィ”エ”聞きながら再起動試験とかして、goのソースコードselect * とか for とかで見ながらN+1になっている部分とかを見つめて、振り返られるようにする

所感

  • 「初期状態では明らかにDBが重く、アプリを2台構成にしても変わらないことはすぐに分かる」とか、というところまですんなりいけた。
  • ので、ある程度環境整備終わったところから go のソースコードと向き合うことができた。
    • goを選んだ理由は、コンパイルさえ通れば信頼できることと、エンドポイントごとにいい感じにソースコードがまとめられているので見やすかった
      • すぐにやれることは sql による問い合わせの最適化とプログラムのデータとの連携の部分が大きいので、go はそういうところでわかりやすくできている気がする
  • 参加者が一人なことは分かっていたので、できることは限られていて、top でプロセス見られれば十分だろうということで NewRelic などのツールの導入まではしませんでした。

これから、様々な人が実装の公開や感想の投稿をされると思うので非常に楽しみです。 今も matsuuさんの実装 などちょこちょこ見ているんですが、重い箇所と改善内容を読んで何を話しているかわかるので、初めての参加としては上々なのではないかと自分でも自信になりました。

それでは、本日はISUCON 11予選お疲れさまでした!!