3

私は最近高負荷に苦しんでいるウェブアプリケーションを持っています。このアプリケーションは、 8コアのIntelCPUと4GBのRAMを搭載した単一サーバーで実行されます。ソフトウェア:Debianで実行されているDrupal 5(Apache 2、PHP5、MySQL5)

500人の認証済みユーザーと200人の匿名ユーザー(同時)に到達した後、アプリケーションはパフォーマンスを大幅に低下させ、完全に失敗します。最大の負荷は、アクティビティを実行する認証済みユーザーから発生し、データベースで挿入/更新/削除を引き起こします。mysqlがボトルネックだと思います。そのような数のユーザーの速度を落とすのは正常ですか?

編集:私はある種のプロファイリングを行ったことに言及するのを忘れました。コマンドtop, htopを実行すると、すべてのメモリがMySQLによって使用されていることがわかりました。しばらくすると、MySQLのパフォーマンスが非常に遅くなり、サイトがダウンします。負荷を減らすために、Apacheを再起動/停止する必要があります。管理者は、その時点で約200のアクティブなmysql接続があったと言いました。

最悪のポイントは、これをできるだけ早く解決する必要があることです。詳細なプロファイリング分析/コードリファクタリングを実行できないため、2つの方法を検討しています。

  • 私のテーブルはMyIsamですが、非常に遅いテーブルレベルのロックを使用していると聞きましたが、そうですか?心配せずにInnodbに変更できますか?
  • MySQLを使用して、RAMを大量に搭載した専用マシンに移動するとどうなりますか?
4

3 に答える 3

2

ランダムなアプリケーションでスローダウンを引き起こす特定の数のユーザーを指定することは不可能です。アプリケーションの機能と実行方法に完全に依存します。見なければならないことがたくさんあります。

  1. プロフィール。 プロファイラーを使用してアプリケーションを実行し、実際の使用状況をできるだけ多くします。最善の方法は、自動化されたテストまたはすべてのレイヤーを実行する一連の単体テストを使用して、プロファイリング セッションを可能な限り繰り返し可能にすることです。低負荷でアプリケーションをプロファイリングした場合でも、ボトルネックを特定して改善できます。アプリケーション コードと SQL コードの両方をプロファイリングする必要があります。

  2. ボトルネック。プロファイリングは、どのコードやクエリが最も多くの時間を費やしているかを示し、それらを修正することは大いに役立ちますが、回避できるアーキテクチャ上のボトルネックも探す必要があります。実際には待機する必要のない書き込みを待機しているユーザーがいますか? プロデューサー/コンシューマー キューを使用して、特定の重要でない書き込みをキューに入れ、アプリがユーザーにより速く応答し、このデータを遅延してデータベースにフラッシュできるようにできますか。非同期処理の恩恵を受けることができる他の外部リソースを待機している実行時間の長い要求はありますか?

  3. キャッシング。キャッシュできるリクエストまたはデータはありますか? これがボトルネックではない場合でも、サーバーの負荷をできる限り減らすことは役に立ちます。特に、データベースの競合が多く、一般的に使用されるデータをアプリケーションでキャッシュできる場合は、データベースのラウンドトリップを回避できます。

  4. メモリーデータ。アプリケーションがデータベースをどのように使用しているかを調べて、実際にはデータベースに存在する必要のないものがあるかどうかを確認してください。もしそうなら、このデータをインメモリ データ構造 (またはインメモリ データベース) に移動すると、パフォーマンスが大幅に向上します。これは一般的には可能ではありませんが、可能になった場合、大きなメリットとなります。

于 2010-12-20T04:15:27.390 に答える
0

問題を解決する方法に関するクイックノート

提案

  • 統計モジュールを無効にする

  • 重要でないモジュールを削除します

前提条件

  • APCをインストールする-または同様のもの

  • Drupalキャッシングを有効にしますが、積極的なキャッシングは有効にしません

オプション1

  • Memcache + MemcacheAPI - MemcacheAPIをインストールします。これにより、許可されたユーザーのセッションを処理することにより、dbの負荷が軽減されます。

オプション2

  • Cacheroutercacherouterをインストールします。これにより、キャッシュの取得/設定がdbから目的のオプションに置き換えられます(Memcacheまたはメモリが不足している場合-ファイルシステム)

  • 許可されたユーザー用のキャッシュAuthcacheをインストールします。cacherouterで完全に機能しますが、6倍のみです。さらに、再設計が必要です(ただし、EasyAuthCacheというプロジェクトがありました。これは便利かもしれません)

  • 6.xへのアップグレード基本的に6.xバージョンには、キャッシュによってdbをオフロードするための便利なモジュールがいくつかあります(この場合、それらは非常に役立ちます)。私はあなたの遅い選択がビューから来ているのではないかと思います。

于 2010-12-28T08:40:09.807 に答える
0

私の頭に浮かぶ 2 つの重要な数字があります。

  1. 劣化ポイント: アプリケーションが遅くなったときのユーザー数。
  2. 限界点: アプリケーションがクラッシュする原因となったユーザーの数。

これらの値を決定するには、ユーザー数を増やしながらアプリケーションをテストする必要があります。たとえば、1 人のユーザーから始めて、アプリケーションが応答しなくなるまで、1 分ごとに別のユーザーを追加します。メモリと CPU の使用量を測定して、これらをテストのアクティブ ユーザー数と関連付けることが重要です。

あなたのコメントは、あなたが劣化ポイントを見つけたことを示しており、データベースが競合ポイントであると考えています。仮定を検証するのに役立つ 2 つの MySQL 起動パラメーターがあり
ます

「ps」を使用してプロセスを監視し、どのプロセスがより多くのメモリを消費しているかを特定し、CPU を消費してアーキテクチャのどの部分がより多くのリソースを消費しているかを特定します。分析をサポートするもう 1 つの優れたデータは、おそらく 60 秒ごとの vmstat 出力です。

つまり、ps と vmstat でモニターを開始し、ユーザー数を増やしながらアプリケーションに負荷をかけます。アプリケーションの速度が低下したら、モニターを停止し、プロセスの CPU とメモリをその時点でアクティブなユーザー数と共にグラフにします。その時点から、問題が CPU なのかメモリなのかを判断できます。特定のリソースの上位 10 個のプロセスを選択すると、これらが競合の候補になります。MySQL ログを確認して、新しいインデックスを追加できる場所を特定し、低速クエリの一部を書き直せるかどうかを判断します。

于 2010-12-20T04:42:43.637 に答える