はてなダイアリーの高速化の裏側

先週、ダイアリーがリニューアルされました。今回のリニューアルはダイアリーの応答時間の改善が目玉の一つとなっており、そのために1週間リリースを延ばし、改善の時間を確保していました。今回は、この改善について記しておきます。


はてなでは「推測するな、計測せよ」の原則にしたがって、ダイアリーのユーザーページの全アクセスの応答時間を解析し、ヒストグラムを作っています。また、特定の閾値(1秒、2秒とか)以内に何%のリクエストを返却できている割合をグラフ化しています。

このグラフを見ると、応答時間時間は時間とともに劣化することが一目瞭然です。実際に今年初めの値と比較すると10%〜20%程度の悪化が確認されました。あとは、これをひたすら改善していくのみです。今回実施した主な対策は、以下の通りです。

  • ネットワーク
    • パケットロスが発生しているようなトラフィック経路上のボトルネックの解消(L2スイッチの置換、物理的な線の交換・増設など)
    • ネットワーク的に特性の悪い経路を通過しないようにサーバの配置を調整(特にmemcachedなど問合せが多いサーバを重視)
  • データベース
    • 古くから存在するMySQLのアップデート&InnoDB
  • アプリケーション
    • 徹底的なプロファイリングの実施(個々の記法の展開時間までを計測)
    • SQLの改善(過剰・重複なSQL、非効率なSQLの改善など)
    • その他、過剰な外部APIへの問い合わせの削減

これらの項目について、実施→計測→考察のサイクルを連日まわすことで、体感できるレベルの改善が得られました。グラフ上も急激に立ち上がっていることが確認できます。

今回得られた教訓は、平均を上げることを意識するよりは、時々発生する引っ掛かるように遅い場合を潰していく、ということが効果が高かったです。特に、ネットワーク上の位置が性能に影響しているとか、一部の遅いホストが、体感的な応答速度を数字以上に悪化させているということを意識して、同じリクエストに対する速度のばらつきを収束させていくことが大事です。

個々の改善は地味なものなのですが、現状と目標を可視化し、可能性のある対策を全方位的に徹底し、日々改善と検証を繰り返すことで大きな改善が得られました。Appbankさんにもべた褒めされている速度とiPhoneビュー、他でもご好評頂いているTwitter連携機能など、今後はこのレベルの使い勝手を維持していきたいものです。