エントリー
おもしろいですが、プログラマーが製品を開発するとき、彼は2000人が一度に1つのボタンを押すことができるかどうかという問題についてほとんど考えません。 しかし、無駄に。 彼らができることが判明した。 奇妙なことに、そのようなプログラマーによって書かれたエンジンのほとんどは、高負荷の下で非常にひどく動作します。 誰が考えたでしょうが、インデックスではなく、余分なINSERTや湾曲した再帰関数だけで、負荷平均をほぼ1桁上げることができます。
この記事では、プロジェクトの開発者が、同じサーバーからPentium 4 HT / 512Mb RAMを圧縮し、フォーラムで最大700人のユーザーとトラッカーで最大120,000人のユーザーを同時に保持する方法を説明します。 はい、このプロジェクトは急流トラッカーです。 著作権と権利についての会話はすぐに控えることをお勧めします。興味はありませんが、本当に面白いのはHighLoadです。
最初に、プロジェクトについて説明します。
TorrentPierエンジンの通常のトレントトラッカー(別名phpbb 2.x)
- FreeBSD 6.0上のサーバー
- Pentium 4 HT / 512Mb RAM
- Apache Webサーバー
- MySQLベース
- PHPのすべてのロジック
それは実質的にランプです
手短に言えば、私たちが連続して行ったステップにすぐに署名します。
- サーバーへのオペコードキャッシュのインストール
- Apacheをnginxに置き換える
- NOT RDBMSでのいくつかの中間サンプルのキャッシュ
- C ++でのキー部分の翻訳(トラッカーを読む)
- FreeBSDネットワークスタックの最適化、および最新の-STABLEへの更新
- MySQLの最適化
- BBコードキャッシング
- SphinxSearchを使用するための対応するコード
- コードプロファイリングと監視ツールのインストール
- MySQLスロークエリログからのクエリの解析
各項目についてさらに詳しく
サーバーへのオペコードキャッシュのインストール
彼は常に必要です! php-cacheをインストールすると 、300%+パフォーマンスが得られ、15分かかります。
キャッシュは異なります: eAccelerator 、 xCache 、 APCなど。...良い速度とその中にユーザーデータを保存する機能により、後者に落ち着きました。
Apacheをnginxに置き換える
Apacheは重くて遅いため、最初はメインWebサーバーとして動作し、その後nginxがその前に置かれ、静的になり、応答をgzipで圧縮しました。 さらに、apginはnginx + php-fpmバンドルを優先して完全に放棄されました(正確には当時spawn_fcgiでしたが、現在はこのオプションの方が優れています)。 当時の束は生産で最も人気があったわけではありませんでしたが、私たちにとってはうまくいきました!
NOT RDBMSでのいくつかの中間サンプルのキャッシュ
RDBMSは悪です。 それは便利ですが、利便性のために支払う必要があります。 この場合、速度。 そしてそれが必要です。 そのため、最も一般的で重要ではないマッスルクエリの結果の一部をAPCにキャッシュしました。 すぐに多くの質問を予測します。なぜmemcachedにないのですか...どのように答えますか... 下痢を除いて最近提供されていません。 私たちのケースでは、APCはTCP接続を使用しないため、APCを選択したため、 何倍も速く動作します。 当分の間、すべてが1つのサーバーで正常に回転し、分散ストレージはそれほど必要ではありません。
RAMにデータを保存する必要のない他のキー/値ストレージを選択できます 。
しかし、あなたの場合、 memcached / memcachedb / memcacheQが最適なオプションである可能性が非常に高いです。
一般に、phpがグローバル変数、APC、memcachedの値を検索するマルチレベルキャッシュレイヤーを作成するというアイデアがあり、それが初めてSELECTデータベースに入ります。 しかし、私たちは学校/仕事/家族からの自由時間にプロジェクトに携わっているので、まだこれに至っていません。
C ++でのキー部分の翻訳(トラッカーを読む)
120000 nginx, , php, . ? . XBTT TorrentPier'. , 2710 , , , . . . +100000% .
, — 1
input (rl0) output
packets errs bytes packets errs bytes colls drops
20K 0 2.5M 16K 0 1.5M 0 0
PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
10 root 1 171 52 0K 8K RUN 1 538.6H 47.12% idle: cpu1
6994 root 1 108 0 98140K 96292K CPU0 0 3:57 33.98% xbt_tracker
11 root 1 171 52 0K 8K RUN 0 595.0H 31.20% idle: cpu0
35 root 1 -68 -187 0K 8K WAIT 0 17.1H 21.14% irq21: rl0
12 root 1 -44 -163 0K 8K WAIT 0 482:57 9.96% swi1: net
[root@****] /usr/ports/devel/google-perftools/> netstat -an | wc -l
24147
100 30% . , 8
FreeBSD, -STABLE
FreeBSD 6 4BSD, 7 ULE, SMP
FreeBSD sysctl,
MySQL
, , .
myisam
- -
- FULLTEXT
. tuning-primer.sh
Xtradb. — =)
BB-
phpbb « » bbcod' html. . html /. 2 , .
SphinxSearch
- , . innodb Master-MultipleSlaves myisam, . , , . , , SphinxSearch. . .
-- rss , .
, . . bottleneck . php hook' , munin.
MySQL slow query log
! 20% 80% . . , FORCE INDEX php , 10(!!) .
- . mysqlsla.
LAMP . Core2Duo 2 3 , «», , 1.5 200000 ~500 . LAMP ?
.
, . , !
UPD: