社内ISUCON合宿に参加してきた感想

社内で1泊2日の合宿形式で行うチューニングコンテスト(通称社内ISUCON)に参加してきた。非常に学びがありモチベーションもあがったので、色々感じたことや新しく知ったことを書き残しておく。

前提知識

アプリケーションの開発経験しかなく「チューニング」に関しては知識なし。Android→サーバーサイドの開発に移った際、開発だけではなくサーバーの運用・保守までできるような知識をつけたいと思っていたのでISUCONのことは気になっていた。

事前準備

とにかくISUCONといっても何をしていいかわからなかったので、過去問を使用してどんなことをするのかについて少しだけ予習してから行った。

github.com

こちらを使用して手元に環境構築してISUCONとはどんなものかを試した。

  • ISUCON4
  • ISUCON6

を試した。ISUCON4はこのままだと動かなかった(2017.12現在)ので注意が必要。 ISUCON4はクエリの実行計画を見てindexを貼ったり等である程度の点数が取れるが、ISUCON6では既にindexが貼ってあるのでアプリケーションのロジックでチューニングする/回によってはネットワークチューニングゲーだったらしいなど、問題によってメインのチューニングポイントが違う、ということを知って絶望したりなどしていた。

当日

金曜13:00-土曜13:00までの24時間の制限時間だった。

今回の題材は以下のものを使用した

https://linotice.tumblr.com/post/158135953789/20170308
linotice.tumblr.com

感想

あまり普段の業務では触らないところ(特にミドルウェアの設定など)を動かしながら触れるきっかけがあったのはよかった。 もちろんミドルウェア/インフラ部分は知識0だから頑張ろうな・・・というのは当然だが、アプリケーション層のチューニングはもっとできたと思う&できるべきだったと思っている。不必要なDBアクセスしている/もっと効率よい書き方がある/DBの非正規化など…。知識としては足りてるはずなのに活かせなかった部分に気づけたのは良かった。

それに普段一緒に仕事していないメンバーとチームを組めたことで、全く自分では到達できない視点に気づくことができた。非常に勉強になった。 点数ではっきり勝ち負けが決まるゲーム性も燃えるし、同じ問題を皆で解くのでチームごとにアプローチが違い、終わった後のネタバラシもかなり盛り上がった。 自分は開発合宿を今まで避けてきたが、かなり楽しかった。

やったことなど

  • mysqlのlogを吐き出すように設定
  • クエリを確認/indexを貼る
  • スロークエリのログ設定/分析
  • モニタリングツールの導入(今回はnewRelic)
  • nginxの静的ファイルの配信設定
  • nginxの静的ファイルのキャッシュ
  • DBの非正規化
  • Mysqlの接続をUnixドメインソケットに変更
  • クエリキャッシュ有効化
  • innotopの有効な使い方
  • mysql→Redis移行
  • アプリケーションロジックの変更

他のチームが行っていたことで参考にしたいこと

  • tcpエフェメラルポートの設定を変更
  • DBのインメモリ化
  • セッションをcookieで持つ
  • テンプレートエンジン捨てる
  • 計測ツールnetdataを有効的に使うとチューニングどころが効率よく見つけられそう(https://github.com/firehol/netdata)

(よくわかってない部分もある)

次回もがんばろうな