0

proc_nice() を実行すると、実際に Apache のスレッドがナイスされますか?

もしそうなら、そして現在のユーザー (非スーパーユーザー) が元の優先度を放棄できない場合、Apache 2.0x サーバーで適切な Apache スレッド (apache_child_terminate) を強制終了しますか?

問題は、ユーザーが Ad-Hack クエリを実行できるようにするアプリの影響を制限しようとしていることです。クエリは大規模になる可能性があり、結果として得られるデータの変換には多くのメモリと CPU が必要です。

私はすでにプロセスをよりストリームベースになるように書き直しました - メモリ消費を助けますが、プロセスをより低い優先度で実行したいと思います。ただし、この同じボックスで多数の優先度の高い Web サービスが実行されているため、Apache スレッドを低い優先度のままにしておくことはできません。

ティア

4

1 に答える 1

2

そのような状況では、多くの場合、Apache プロセス内でそのような重い作業を行うのではなく、次のいずれかを行うことが解決策となります。

  • たとえば、次のようなものを使用して、外部 PHP プロセスを実行しshell_execます。これは、同期モードで作業する必要がある場合です (つまり、数分後にタスクを実行できない場合)。
  • タスクをFIFOシステムにプッシュし、すぐに「あなたのタスクはすぐに処理されます」というメッセージをユーザーに返します
    • そして、他のプロセス(たとえば、毎分crontabを介して起動される)にFIFOキューをチェックさせます
    • キューに何かがある場合に処理を行います
    • そのプロセス自体は、優先度の低いモードで実行できます。


できるだけ頻繁に、特に重い計算に時間がかかる場合は、2 番目のソリューションを使用します。

  • これにより、ユーザーはすぐにフィードバックを得ることができます。「サーバーはリクエストを受信しました。すぐに処理します」
  • Apache のプロセスを長時間「機能」させ続けることはできません。重い処理は他のプロセスによって行われます。
  • ある日、1 台のサーバーでは不十分なほどの処理能力が必要になった場合、この種のシステムは拡張が容易になります。同じ FIFO キューから選択する 2 台目のサーバーを追加するだけです。
  • サーバーの負荷が非常に高い場合は、少なくともしばらくの間、キューからの処理を停止することができます。これにより、負荷が改善される可能性があります。時間枠。


別の(見栄えは良いですが、まだ試していません)解決策は、たとえばGearmanのようなツールを使用することです。

Gearman は、作業を実行するのにより適した他のマシンまたはプロセスに作業を委託するための汎用アプリケーション フレームワークを提供します。
並行して作業を行い、処理の負荷を分散し、言語間で関数を呼び出すことができます。
高可用性 Web サイトからデータベース複製イベントのトランスポートまで、さまざまなアプリケーションで使用できます。
つまり、分散処理が通信する神経系です。

于 2009-12-04T20:27:51.017 に答える