こんにちは、コミュニケーションIT事業部の瀧川です。
本記事は 電通国際情報サービス Advent Calendar 2023 の12/13(水)の投稿です。
同期の石田とチームきなことしてISUCON13に参加しました。(初参加)
https://isucon.net/archives/58001272.html
競技終盤でアプリケーションを壊してしまい、記録なしという悔しい結果に終わってしまいました。(T_T)
きなこさん(石田の愛犬)、名前を借りておきながらかたじけない。。
ISUCONとは
ISUCONはWebアプリのパフォーマンスチューニングのコンテストです。
年によって差異があるかもしれませんが、おおよそこんな感じかと思います。
- 当日チューニング対象のサーバーが複数台提供される。
- アプリは複数言語で実装が用意されているため選択可能。(今年はGo, Perl, PHP, Python, Ruby, Rust, Node.js)
- 当日提供される、性能計測ツール(ベンチマーカー)を実行し、性能値 (スコア)を採点する。
- 競技時間中に記録された最後のスコアで順位を競う。
今年のお題はISUPipeという動画配信サービスでした。
https://www.youtube.com/watch?v=OOyInZbM85k
事前準備
休日に何度か集まって準備しました。
過去問は数年分解きました。
初期セットアップ、デプロイ、ログ集計についてはなるべく自動化できるようシェルスクリプトを用意しました。
https://github.com/Akihiro1001/isucon
集計シェルを実行するとGitHub issueにNginxのアクセスログとMySQLのスロークエリの集計結果が出力されます。
また、ChatGPTとGitHub Copilotに課金して、前日は早く寝ました。💤
当日の流れ
9:00-10:00
平日よりも早起きをして、恵比寿駅に待ち合わせ。
コンビニでランチを買い、予約しておいたレンタルオフィスに無事到着。
作業環境を整え、眠気覚ましのコーヒーを大量に用意。
10:00-12:00
競技が開始し、まずは予定通りの分担で作業しました。
瀧川
- 事前に用意した各種シェルスクリプトの微調整と各サーバーへの配置
- アプリケーションのソースやミドルウェアの設定ファイルをGitHub管理
- 各種集計ツール(pt-query-digest, alp)のインストール
- Nginx, MySQLのログ設定やパラメータ調整
- デプロイ → 計測 → 集計 の一連の処理を流す
石田
構成としては、以下がオールインワンになったサーバーが3台配られました。
NginxとMySQLはヤマが的中して助かりました。
ApacheとPostgreSQLだったら心が折れるところでした。
特徴的だったのは、DNSもチューニング対象だったことです。
12:00-17:00
ボトルネックが見えてきたのでチューニングに着手。
以下の改善を入れました。
- インデックスの追加
- N+1の改善
- キャッシュできそうな箇所はオンメモリにキャッシュ
- インサートをループしている箇所をバルクインサートに変更
- PREPARED STATEMENTを無効化
- アプリケーションのDBを別サーバーに移行
20位くらいに躍り出る瞬間もあり、盛り上がりました。😆
17:00-18:00
改善が進むと、DNSへの水責め攻撃が激しくなり、ボトルネックがアプリからDNSへと移りました。
DNSレコードのTTLやcache-ttlが0に設定されていたため、設定を変更しキャッシュを有効化しました。
ですが、水責め攻撃にはそれほど効果が見られず。。
とりあえずDNSを別サーバーに移行して負荷分散しようとしたあたりでDNS機能がクラッシュ😱
最後までDNSを復旧できず、記録なしに終わってしまいました。。
感想
来年に向けて反省点を残しておきます。
- 変更点は必ず残しておき、いつでも戻せるようにしておくべきでした。サーバーを直接いじる時は、とりあえず
git init
しておくのが良さそうです。 - 今回利用したGo言語は、普段業務で触っていないため、時間を作って慣れておくべきでした。
- 集計シェルはベンチマーカーが完了するのを待ってから手動で実行していました。今考えると、/initializeのエンドポイントでキックして、一定時間スリープ後に自動で集計するようにすれば手間を減らせました。
悔しい結果となってしまいましたが、とても良い経験になりました。
爆速なWebアプリを開発できるよう今後も精進します💪
一緒に参加した石田が明日のアドベントカレンダーを担当します。
執筆:@takigawa.akihiro、レビュー:寺山 輝 (@terayama.akira)
(Shodoで執筆されました)