BASEプロダクトチームブログ

ネットショップ作成サービス「BASE ( https://thebase.in )」、ショッピングアプリ「BASE ( https://thebase.in/sp )」のプロダクトチームによるブログです。

ISUCON 12予選に8名(6チーム)が参加しました

2022/07/23(土)に開催された ISUCON 12 *1 予選に BASE から8名のエンジニアが6チームに分かれて参加しました。
参加者の感想をお届けします!

isucon.net

チーム「Speed of Sound」

最終スコア 4,711点

およそ210位でした。当日の作業リポジトリは以下です。

github.com

清水(@budougumi0617 )

BASE BANK Section テックリードの@budougumi0617です。
ISUCON11に引き続き2回目の参加でした。前回同様環境構築、ミドルウェアの設定変更、監視用のツールの導入などを主に対応しました。
構成管理をしたい欲を出しすぎてかなり足を引っ張ってしまいました。

  • /etc ディレクトリ以下の設定ファイルのパーミッションを変更、シンボリックリンク化した副作用で PAM まわりの挙動をおかしくした
    • sudo コマンドも動かなくなってCloudFormationをやり直すはめに
  • MySQLの my.conf 周りのファイルをシンボリックリンク化したためスロークエリ設定の有効化に時間を溶かす
    • AppArmorも切っていたはずなので謎

スロークエリログを確認してMySQLのPREPAREを抑制する お決まりの変更 をしたあとはほとんど有効な一手を打てませんでした。alpコマンドや netdata の導入もしていたのにスロークエリ結果からしかアプローチを考えない狭窄的な行動になっていました。
また、最近のISUCONで多用されていた env.sh やsqlファイルにALTERINDEXを追記すれば initialize で毎回テーブルが初期化されるような構成に馴れていたため手間取っていたところも多かったです。

終盤ではベンチマークの検証が通らなくなってしまい復旧に手間取りました。シードデータファイルが見当たらなかったので安易にDB上のデータを消したのが原因でした。他のインスタンスからデータをダンプして復旧しましたが、競技とはいえ安易にデータベースのデータをふっ飛ばしてはいけないということを再確認しました。
sqliteを意識するところまでボトルネックの解消ができず非常に悔しい結果になったので来年はリベンジしたいです。

永野(@glassmonekey)

こんにちは@glassmonekeyです。今回初参加です。同僚に誘われたのでいい機会と思い参加してみました。
特に分担する予定はなかったのですが、MySQLだけとりあえず剥がすといった若干インフラ寄りの作業をしたりしました。
サーバーにsshして/etc以下を触る経験は久しくしてなかったので懐かしい気持ちになりました。
反省点としては、サーバー構成の反映漏れとかで時間が溶けるタイミングとかあったので、アプリケーションの改修にそこまで時間を取ることができなかったことがありました。インフラ構成はAnsible化するなりしていきたいなあと思ったりしました。
短期間でドメイン知識の吸収からサービス特性を読み解くところも求めれるので、楽しい時間でした。次回は予選突破を目指すぞ。

⁠吉田 ( @yopidax )

今回初参加でした。前々からISUCON自体は気になっていたのと同僚の清水さんに誘わたのがきっかけで参加してみました。
チームでの作業分担は特に無かったのですが、私はMySQLのスロークエリを見つつボトルネックを特定しindex貼ったりアプリケーション側の改善をしていました。対策として練習なしで過去問題と解説を眺めるくらいしか行わず挑んだのですが、結果あまり手を付けることが出来ず準備不足を痛感しました。
短い時間で仕様を読み解きつつ普段一緒に働く同僚とワイワイしながら進めること自体は楽しかったので、事前練習を行いつつ次回も是非参加したいと思います!

チーム「ngsw」

最終スコア 3,614点

@ngsw

  • インフラ側の問題に至る前のボトルネックをそもそもどうにもできませんでした。
  • なので以下を行なったのですが、点数的にはほぼ意味がありませんでした。
    • Dockerはがし
    • sqliteを/dev/shm 上に配置(これしたからOS再起動試験が1.5hかかった)
  • ISUCON参加(および前回予選問題を利用しての事前の社内練習会)で自身の苦手な領域が、目に見えてわかるのでそこが非常に面白かったです。
    • なので答え合わせ重要と思いました。予選通過者のエントリを読んだりしながら、ベンチマーカー公開されるのを待ちたいです。
  • dockerが起動してるEC2で、それをはがして云々みたいなのはパズル的な面白さがありました。
  • オペレーションが身体性を伴ってきたときに訪れる万能感があり、そのために素振り重要なんだろうなって感じました。

チーム「牡蠣食えば 金がなくなり リボ払い」

最終スコア 7,472点

@cureseven

今年もISUCON10で本戦に一緒に出場した社外の友人と参加しましたが、7,472点133位で敗退しました。
私は今年もアプリケーションを担当しました。今回の問題はsqliteをmysqlに置き換える作業が終わってからindexを貼り、その上でボトルネックの特定をしようと思い、N+1を潰したり早期returnさせ無駄な計算を省いていたりしていたら時間が来てしまいました。
練習の成果もあり初動は毎回上手くいき、数分は1位にいたりもしたのですが、sqliteの置き換えにおいてのinitializeが時間内に終わらない問題などにぶつかり後半は点数が伸び悩みました。
簡単に解決できないとき、別の手を考えたり一緒に方針を考えたりするなど、チームの柔軟な動き方が課題でした。個人的には去年よりも手数を打てて成長を感じました。
本戦問題として出てもおかしくないような難易度の高い問題で大変刺激になりました。運営の皆様ありがとうございました。

チーム「example.com」

最終スコア 3,119点

横山

今回で3回目の参戦です。
クエリ中心に最初は見ていきexplainなどのクエリ実行しながらindexの効果を確認していきました。
そのあとはN+1の実装部分を修正してループしたinsert処理をバルク処理に書き直したりしました。
結果としてスコアは伸びず3,119点となりました。
前回、前々回は3人で参加していましたが今回は諸事情で1人での参戦となりその面でモチベーションを保って対応するのが難しかったです。
次回はまた3人で参戦してワイワイしながらやりたいと思います。

チーム「今すぐダウンロード」

最終スコア 0点 (計測失敗前の最高スコアは1,400点台(1,466?)

田中 @tenkoma

初めてISUCONに参加しました。
まず、参考実装をPHPに変更後の初期スコアが1,000点くらいになりました。
その後、MySQLサーバをアプリケーションサーバと分けて1,400点くらいに。
SQLで複数回呼び出しているものをまとめたり、インデックスを追加してみたものの効果が出ず。
最後に、SQLiteファイルをMySQLに移行するために以下の作業をしましたが、ベンチマーク前の初期化が終わらなくなってしまい、0点で終了しました。

  • アプリケーションから tenant DBの参照先を admin DBと同じ接続に変更
  • SQLite ファイルをdump して1ファイルにし、初期化シェルスクリプトでMySQL DBに投入

また参加する機会があればチームで参加したいです。

チーム「IMS」

最終スコア 0点

炭田(@tac_tanden

今回、社外の友人と3人で初参戦でした。最終スコアは0点(0点になる前の最大スコアは4,821点でした)で非常に悔しく感じています。
競技中は主にクエリのチューニングとアプリケーションコードの変更、nginxのチューニングなどもトライしていました(が、全然スコア上がりませんでした...)。MySQLの移管に関しては試みましたが、時間内に完了させることができませんでした。
ボトルネックを冷静に見定めるためのツールを使えるようにするのを、序盤に素早く設定できるようにするのが次回の課題なので、来年出場する前に練習しようと思います!

最後に

今年も挑戦のしがいのある問題、当日の快適なコンテスト環境を準備していただいたISUCON運営の皆様に感謝いたします。
社内では #club-isucon チャンネルでISUCONに向けた情報交換や合同練習をしていました。
残念ながら今回の予選を突破できた弊社メンバーはいませんでしたが、『達人が教えるwebパフォーマンスチューニング』の勉強会などを企画して来年のリベンジに向け動き出したいと思います!

宣伝

BASEでは購入者やショップオーナーの皆様のことを第一に考え、パフォーマンスチューニングにも興味があるサーバーサイドエンジニアの仲間を募集しております。
カジュアル面談も実施しておりますので、ぜひお気軽にお問い合わせください。

herp.careers

herp.careers

*1:「ISUCON」は、LINE株式会社の商標または登録商標です。