2012-02-22 6 views
2

私はアプリケーション用の適切なGeoIPデータベースを見つけようとしていましたが、私がMaxMind Cityがおそらく最高だと言うことができる限り(私が間違っていれば知っている!)。 私は現在、英国では正確ではない無料版を試していますが、テスト目的で行っています。MaxMindの都市バインダリデータベースをRAM +サーバのパフォーマンスに変換する

だから、戻って話題になって:

私たちのアプリはPHPで書かれており、最終的に我々は、着信トラフィックの多くを持つことになります。 GeoIPデータベースを使用する理由は、特定の訪問者のデータをmysqlデータベースに保存するだけでなく、すべてのページロード時に都市、地域、国を表示する必要があるためです。だから私は、すべてのページリクエストでバイナリデータを読み込むと、サーバが多くのRAMを消費し、処理速度が向上すると考え始めました。その理由はRAM内にキャッシュすることが可能で、PHPでそれをキャッシュすることができるのだろうかと思うのですが、それは26Mbです(私はたくさんあるとは思わないかもしれませんが)。これはパフォーマンスの低下を招き、明らかに避けたいものです。

サーバ:

プロセッサ:16 GHzの(8×2ギガヘルツ)

RAM:16384メガバイト

HDD:400ギガバイト

アパッチ+ nginxの+ワニス、PHP5 .3、MySQL5.1

私たちは大規模なアプリケーション開発には全く新しいので、改善の方法があれば一般的なパフォーマンス、または私たちのケースのパフォーマンスを向上させるためのヒントがあれば教えてください。

ありがとうございます!

答えて

3

私たちは、広告サーバーアプリケーション用のMaxMinds GeoIP Cityを使用しています(実際にはトラフィックが多いため)。データベースをメモリに格納するMaxMindのテストスクリプトに基づくいくつかのテストでは、十分に効率的ではありませんでした。単一のPHPプロセスごとにデータがキャッシュされていたためです。そこで私たちは2つのテーブル(ip2locationとcity)をMySQLに入れました(あなたはCSVファイルをダウンロードしなければなりません)。 ip2locationのクラスタード・インデックスでは、loc_idに約10msのIPを問い合わせることができるので、このloc_idに基づいて都市データを取得するだけで済みますが、これも非常に高速です。

+0

ニース!いくつかのテストを行いますが、mysqlにキャッシュさせるのは良い考えです。ありがとう!なぜ私たちはそれを試してみることに気付かなかったのか分かりません:) – Ignas

+1

パフォーマンスの向上のために、 'ip2location'テーブルの操作を行っています。 「問題」は、1つのクラスAネットよりも大きいいくつかのIPブロックがあることです。そこで、これらのブロック(このテーブルでは5または6エントリ)を複数のブロックに分割し、IPの最初のオクテットを含むこのテーブルに新しいカラムを追加しました(この 'unsigned tinyint'カラムの値は0〜255 )。この追加の列には索引があり、この列は 'WHERE'節で参照されます。それは非常に効率的です。 – rabudde

関連する問題