Blog

ニフティ株式会社 社内ISUCONを実施しました!

はじめに

こんにちは。会員システムグループの上原です。 8月末に社内でISUCONを開催・運営したので、レポーティングしていこうと思っています。

ISUCONとは?

ISUCON(Iikanjini Speed Up Contest)は、限られたリソース・時間の中でWebサービスをどれだけ高速にできたかを競うコンテストです。
ISUCONで参加者は動作が遅いWebアプリケーションを与えられ、アプリケーションを高速化していくために設定を最適化したり、コードを改善したりする必要があります。
チーム間でスコアを競い合いながら、高速化していけるところがISUCONの醍醐味です。
ISUCONを通じて、モニタリングやデータベースのチューニングなどのスキルを向上させることができます。
ちなみに、優勝すると賞金100万円をゲットできます!
(※「ISUCON」は、LINE株式会社の商標または登録商標です。https://isucon.net)

今回のイベント

本家ISUCONと同じく、webアプリケーションをどれくらいチューニングできるかチームで競っていくぜ…と行きたかったのですが、パフォーマンスチューニングって何?という人も多い状況でいきなり競技形式で行うのは負担が大きいと思われたので、座学とハンズオン形式を組み合わせたワークショップを行いました。
また、より多くのエンジニアに参加してもらうため、デフォルトでエンジニア全員を参加対象とし、欠席者は個別に連絡してもらうオプトアウト形式を取ることにしました。
そのおかげからか94名の社内のエンジニアの皆さんに参加いただくことができました!

タイムスケジュール

以下のように前半1時間は座学、後半3時間はハンズオン形式とし、講師と一緒にパフォーマンスチューニングを学べるようにしました。
  • 座学(1時間)
    • 高速なWebサービスの意義
    • チューニングの基礎
    • モニタリングの基礎
  • ハンズオン(3時間)
    • ワークロードの分析&ボトルネックの発見
      • WEBサーバのログからレイテンシを調べる
      • スロークエリを探す
    • データベースのチューニング
      • SQLの実行計画の分析
      • N+1問題の解決
    • Webサーバのチューニング
なお、内容は以下の書籍を参考にさせていただきました。著者の方々に感謝申し上げます。 達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践

座学

高速なwebサービスとは何か?ハンズオンをやる上であらかじめ知っておくべき解説をやっていきました。 (内容紹介は省略…)

ハンズオン

題材

今回使用する題材はpixiv株式会社の社内ISUCONで使用されたprivate-isuを使用しました。
https://github.com/catatsuy/private-isu
このアプリケーションはisucogramという仮想の写真共有SNSで、写真投稿機能やコメント機能など簡単な機能が実装されています。
今回は、参加者全員にアプリケーションサーバー1台とベンチマークサーバー1台を提供しました。
本家ISUCONでは序盤はチューニングをいきなり行うのではなく、必要なツールの導入・設定などを行う必要がありますが、時間が限られていることもありサーバー設定、ツール導入、サーバー立ち上げなど必要な準備は運営側で全て行いました。
ということで、参加者がサーバーにsshできればすぐにパフォーマンスチューニングを楽しめる状態にしました。
また、sshでサーバー接続がうまくできないことも見越して、AWSのセッションマネージャー経由でサーバーにログインできるよう設定を仕込んだり、言語が障壁とならないように、社内でもっとも読み書きできる人間の多い python に実装を変更したりしました。
その際以下のレポジトリを参考にしました。作者の方には感謝申し上げます。
https://github.com/methane/pixiv-isucon2016-python

負荷試験を行う

早速、ベンチマークを走らせ負荷試験を行っていきます。アプリケーションに残ったログにalpコマンドやpt-query-digestコマンドを噛ませて、ボトルネックをどのように見つけていくか体験してもらいました。
この段階ではまだ0点です。

初めてのチューニング

htopでCPUコアが一つしか使われていないことがわかったので、設定を変更してCPUコアをフルで使えるようにしました。
1000点くらいまで伸びました。

データベースチューニング

pt-query-digestでスロークエリを特定、EXPLAINで実行計画を分析したのち、適切なインデックスを貼っていってもらいました。これだけでもスコアは15000点くらいまで伸びます。
スコアがいきなり1万点台に到達したので驚いた人もいたようです。
ほかにもN+1問題の解消などにも取り組んでもらいました。

リバースプロキシ

データベースに画像が保存されている問題があるため、アプリケーションコードとリバースプロキシの設定をいじって、ファイルから画像を参照するような修正を行いました。 また、gzip配信やブラウザキャッシュなどにも取り組み、最終的には7万点くらいになりました。

ボトルネックに集中して消化することは大事

パフォーマンスチューニングはボトルネックに集中して解消しなければならないと言われます。
インデックスを消すだけで、スコアは一気に1000点台まで下がるため、ボトルネックを解消することの大切さを認識できたのではないかなと思います。

感想

イベント中、slackチャンネルも盛り上がりわいわいとした雰囲気でできたので良かったです。
参加者からのアンケートの結果、ほとんどの方から好意的な感想をいただくことができました。
理由としては、パフォーマンスチューニングの結果がスコアとして数字に出てくるのが良かったようです。
具体的な数値としてスコア改善が見られるのは面白かった。
クエリチューニングでどれくらい性能差が出るのか実感できて面白かった。
一方で4時間という短い時間に内容を詰め込んでしまったため、内容についていけないという方もいたようです。
業務に影響がないように短い時間内に収めるのはなかなか難しいですが、1日目は座学、2日目はハンズオンなど日程を分けて行うのもいいのかなと思いました。
ただ運営としては、半年間準備を行いオプトアウト形式で実施したため絶対に失敗できない…!というプレッシャーがあったのですが、参加者から学びが多かったという声が多く、苦労が報われて良かったです。

最後に

今回はワークショップ形式で行いましたが、次回は本家ISUCONと同じくチーム競技でやっていきたいと思っています。 本家ISUCONの方には今回の運営メンバーでチームを組み挑んでいきたいと思いますので、ISUCONに参加される方はよろしくお願いいたします!

We are hiring!

ニフティでは、さまざまなプロダクトへ挑戦するエンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトよりお気軽にご連絡ください! カジュアル面談も受け付けています! Tech TalkやMeetUpも開催しております!
こちらもお気軽にご応募ください!