2

対処できない奇妙な問題があります。どうすればよいかわかりません。すでにphp.iniを次のように設定しています。

max_execution_time = 120
memory_limit = 1024M
output_buffering = on
compression is turned off

Webサーバーは約95%でアイドリングしており、6GBの空きメモリがあります。

また、apacheMPMを調整しました。

mpm_prefork_module:
StartServers          500
MinSpareServers       500
MaxSpareServers      1000
MaxClients          5500
MaxRequestsPerChild   0

しかし、これはまったく役に立ちません(私も別の値を試しました)。

1分あたり約3000の着信APIリクエストを処理する必要があります。それぞれ約50KBを返却する必要があります。

サーバーは、その量の着信要求を処理できます。私はそれをテストしました。すべてのデータを破棄することはできません。一種のスロットルがあります。しかし、bandwithをテストすると、100MBのフルビットが得られます。

これが私の問題です:

apache2を介して静的バイナリファイルをダウンロードすると、速度は12000キロバイト/秒になるため、100MBit接続のほぼ全体になります。

すべてのAPIを実行するphpファイルを作成しましたが、結果は返されません。特定のサイズのランダムデータを返すだけです。今、私はこのファイル/データを別のサーバーから多くのスレッド(一度に1000)でロードしています。

ここで、サーバーが1分間に処理するリクエストの数を確認しました。1秒あたりの転送速度を計算しました。

      0 byte = about 5000
   1000 byte = about 3000 =  50 Kilobyte/sec
  10000 byte = about 1600 = 266 Kilobyte/sec
  50000 byte = about  430 = 358 Kilobyte/sec
 100000 byte = about  337 = 561 Kilobyte/sec
 500000 byte = about   69 = 567 Kilobyte/sec

これは、サーバーがデータを返さない場合に、要求された量の要求を処理できることを示しています(必要な3000ではなく、1分あたり5000を処理できます)。必要な50KBを返すと、1分あたり430リクエストしか取得できません。ランダムなデータと実際のデータのどちらを返すかは関係ありません。実際のPHPファイルを使用するか、ダミーを使用してランダムな50KBのデータを返します。これは何の違いもありません。

PHPスロットリングの問題を解決するにはどうすればよいですか?

同じスロットリングの問題につながるソースコードを次に示します。

<?
$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

for ($i = 0; $i < 50000; $i++) 
{
  echo $chars[rand(0, strlen($chars))];
}
?>
4

1 に答える 1

0

ここでは、いくつかの要因が関係している可能性があります。

PHPのオーバーヘッド

ファイルをスプラットアウトするだけの基本的なスクリプトの場合でも、PHPはそれ自体を初期化する必要があります。それにはコストがかかります。

メモリオーバーヘッド

おそらく、PHPスクリプトによって、50KBのデータ全体がメモリにコピーされます(それにはコストもかかります)。結果をストリーミングするためにフープを飛び越えていない限り、これはおそらく起こっています。

バッファリング

上記と同様に、結果をストリーミング/チャンク化していない場合、PHPはデータのチャンク全体をメモリにロードしてから、リクエスターに出力する必要があります。

不明

PHPの根性には多くの可動部分があり、特定のスクリプトを分析してプロファイリングせずに、速度低下が実際にどこにあるかについて多くの仮定を立てることはおそらく安全ではありません。

それを解決する

apacheやnginxなどのWebサーバーは、静的ファイルを提供するために最適化されています。彼らにそうさせてください。それらの間に間接層を導入するよりも、常に高速になります。

私はあなたの特定の問題について十分に知りませんが、一般的なガイドライン:

  • PHPスクリプトに基本的な処理を実行させてから、Webサーバーから直接提供されるURLにリダイレクトします。
  • セキュリティレイヤーが必要な場合。リクエスターがアクセス権を持っているかどうかをすばやく確認できる使い捨てURLまたはサーバーモジュールを設定することを検討してください(ただし、ストリーミングファイルの内容を管理する必要はありません)
于 2013-01-20T23:02:29.327 に答える