お首が長いのよお首が長いのよ

チラシの裏よりお届けするソフトウェアエンジニアとして成長したい人のためのブログ

2021-08-21

ISUCON 11 予選に出場した

ISUCON 11 予選お疲れ様でした

運営、参加者の皆さん、お疲れ様でした。 予選前にチームで予習した感じ、いい感じのムーブができたので今年こそは活躍したいな、と思ったがなかなかうまくいかなかった。

最終スコア

23000点弱で110位前後だった気がします。

サマリ

  • 参考実装は Node.js で挑戦
    • チームメンバー全員、現在のスキルセットで一番できる言語がこれで一致していた為
  • New Relic, Splunkは今年は全く使わず。手出しておけばよかった
  • 色々試したけどスコアに現れず、最終的に参考実装をGoの初期実装に戻したらなぜかスコアが3,000 > 2,3000点に

やったことメモ

序盤から終盤までチームで活用する系の下準備

最初はマニュアルを一通り読んでから構成と注意点はどこかなーとMiroに付箋貼ってました。 今年はテンプレがしっかりされていて、インスタンスへログインしてコード読むのがだいぶスムーズに行けた気がする。

  • 初回ベンチ実行
  • 参考実装をGo > Node.jsに切り替え
  • alp仕込み
  • Node.jsでの初回ベンチ実行。 3000点からなぜか1000点に下がっていた
  • log4js仕込み(あとからMorgan入っているのに気づいた)
  • デプロイ一発コマンド仕込み(コンパイルしてサービス再起動するだけなのでそんな大したものじゃなかった)

trendのN+1眺める

alpのログとベンチの結果をみていると、「評判が悪いのでこれ以上ユーザーは増えません」的なログが出て、あとは減点スコアしか出ていないことに気が付き、なんとなく直感で /api/trendを眺める。

DBのクエリ部分が気持ち悪かったのでどうしたもんかなと考えていたら @nakadengが助っ人に入ってくれそうだったのでそこは任せることに。

DBから画像を剥がす

DBのスキーマをチェックしていると画像をblobでそのままテーブルに突っ込んでるのを発見。 「これ、進研ゼミ(予習)で出てきたところだ!」と引き剥がそうにも、無事画像ファイル化して とりあえずAppから返すようにしたところ、ベンチが通らなくなる。

アクセス認証が必要なところで躓き、一部のリクエストに正常なレスポンスを返せずにかなりの時間を溶かす。 途中で諦めて元の構成に戻した。

そのままGoに戻したら大幅にスコアが伸びた

チーム全体での動きではこんなことを試みたが、結局どれもスコアに直結せ。960点台で苦しんでいた。

  • インデックスを張る、
  • Redisにぶん回す
  • MariaDBのキャッシュサイズ上げる

(やってくれてたのは主に @RaimuErt@nakadeng)

基礎ポイントの1,000すら下回ってしまう状態で残り1時間になってしまい、焦っていたところ「Goに戻してみるか」という話になる。

どうにでもなれの精神で戻したところ、スコアが2万点以上伸びて乾いた笑いが止まらない。

恐らくDB周りの変更がかなり効いたんだと思うが、Nodeの時に効果がでなかったのが謎でしかたない。

良かった点

  • 去年よりもコードが読めるようになった
  • 素振りでやったところが息を吐くようにできるようになった
    • 画像剥がす周りとか途中コケたけど、認証系の問題さえ乗り越えればなんとかなったはず
      • 結局リクエストが多くないので大した成果にはならなかったっぽいけど <感想戦にて
  • 初回出場時に比べたら「何も出来ない」は減った
    • が、あれこれ手を付けすぎて、後半気持ちが燃え尽きた。

反省点

  • SQLはある程度読めるけどテーブル設定、設定ファイル周りは相変わらず弱いので、面倒臭がらずに基本的なチューンナップも素振りで心がける
  • jwtは恥ずかしながら正直あまり触ってなかったのでわからなかった
  • チーム全体でそれぞれ動いていたタスクの着眼点そのものは悪くなかったので、「ここだろうなー」という直感じゃなくて、もう少し具体的に計測して判断する術を身に着けたい。「推測するな計測せよ」は大事にしたかったが、Nodeでやってたときは計測結果に反映されないので困った

/以上

よかったらシェアしてください!