「ネギ振りカウンタ」から学ぶmixiアプリ運用

2010年10月13日(水)
井上 恭輔

基本に立ち戻り、負荷対策

まずは基本に立ち戻り、原因の切り分けから始めました。RRDtoolで出力している自宅サーバーの負荷グラフを見てみたところ、まだ若干の余裕がありました。内部ネットワークにも問題ありません。しかし、外部ネットワークへのパケットが大量に遅延していました。自宅サーバーでの運営で大量のリクエストを裁く上で問題だったのは、サーバー負荷よりもルータ性能の限界だったのです。モバツイの作者として有名なえふしんさんのエントリーでも述べられていますが、この規模のアクセスに対しては、1万円程度の民生用ルータでは全く歯が立ちません。

Webサービスで最初にボトルネックになってくるのは大量のリクエストです。ネギ振りはmixiアプリの表示ビューの中でもっともPV数が多いhome.plに表示されるという特性上、大量のリクエストが発生していました。

Webサービスの負荷対策といえばYahoo Inc.が公開しているHigh Performance Web Sitesです。手法自体は負荷対策としては一般的なものばかりですが、それぞれの手法による効果を実際に計測して効果のあるものに集約し、負荷対策の余地があるかどうかを計測できるYSlowというソフトウェアまで公開したため、公開されるやいなや多くのWebサービスに影響を与えました。日本語にも訳され、「ハイパフォーマンスWebサイト」「続・ハイパフォーマンスWebサイト」という書籍にもなっているので一度読んでみるといいでしょう。

ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール

続・ハイパフォーマンスWebサイト ―ウェブ高速化のベストプラクティス

ハイパフォーマンスWebサイトの実現に向けて

ハイパフォーマンスWebサイトのルールには以下の14個があります(注:2010年8月現在、追加されたものを含め全35ルールが公開されている→参照ページ)。

  1. HTTPリクエストを減らす
  2. CDN(Content Delivery Network)を使う
  3. Expiresヘッダーを設定する
  4. コンポーネントをgzip化する
  5. スタイルシートは先頭に置く
  6. スクリプトは最後に置く
  7. CSS expressionの使用を控える
  8. JavaScriptとCSSは外部ファイル化する
  9. DNSルックアップを減らす
  10. JavaScriptを縮小化する
  11. リダイレクトを避ける
  12. スクリプトを重複させない
  13. ETagの設定を変更する
  14. Ajaxをキャッシュ可能にする

第1章でリクエスト数が多すぎてルータが限界に達していることが分かってたので、まずはリクエストを減らすことを考えます。「ルール1:HTTPリクエストを減らす」です。

ネギ振りはmixiにログインして最初にアクセスされるページであり、mixiアプリの表示ビューの中でももっともPV数が多いhome.plに表示されるので、ネギ振りを使おうとしていないユーザーからもリクエストが飛んできていることになります。これを軽減させるためには、ネギ振りを使わないユーザーにはコンテンツを表示しないで、実際に必要になってからローディングするような設定が一番です。いわゆる遅延ローディングです。

ネギ振りは現在のカウント数の取得に遅延ローディングを使うことにしました。試しにonloadイベントが発行されてから数秒後に現在のカウント数を取得するリクエストを発行するようにして、ネギ振りの連打を検知して数秒待ってからリクエストを送るようにしたところ、リクエスト数が 1/20以下に激減しました。もちろんユーザーエクスペリエンスを損なっては意味が無いので、ローディング中でもネギを振れるようにしてネギを振ればすぐに最新のカウントに更新されるようにしました。homeガジェットは1画面内に入らないため、ユーザーが待たされていることを意識されない作りになっています。

もちろん、この方法はrun_appli.plではあまり効果的とは言えません。遅延ローディングが効いてくるのは、遷移しないで1ページにたくさんの機能を持たせる場合や、ページの主なコンテンツ以外の部分(サイドバー、フッターなど)に使う場合だけです。

HTTPリクエストを減らすというのは、一回の表示で読み込まれるファイル数を減らすのと同じ意味です。JSファイルやCSSファイルを結合したり、画像ファイルを結合してCSS Spriteで表示する方法もあります。細かい大量の画像を配信しているサイトになるとかなり効果がありますが、ネギ振りは一回に読み込まれるコンテンツがもともと少ないので結合はしませんでした。

また、第3回でも解説したPersistence APIというアプリのデータを永続化させるAPIを使うことで、自分のサーバーを使わずにmixi側で保存もできます。

詳細情報:mixi Developer Center「情報を共有してみよう

今回はPersistenceAPIを使っていませんが、ユーザーの設定などサーバーに問い合わせる必要のないデータは、できるだけmixi側に永続化させることでサーバーへのリクエスト自体を減らせます。

株式会社ミクシィ

コアサービス部開発グループ コミュニケーション開発チーム
1985年生まれ。2008年に新卒でエンジニアとして入社。mixiでは主にフォトを始めとしたコミュニケーション機能全般の開発を担当しながら、バックエンドの画像配信&ストレージシステム「ImageCluster」の開発を行っている。
趣味は電子工作。mixiにつながるコーヒーポット「オンラインコーヒーメーカー萌香たん」などの作品をmixiエンジニアブログで発表している。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています