対処できない奇妙な問題があります。どうすればよいかわかりません。すでに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))];
}
?>