PHP-GIプロセスCPU 100%とfile_ゲットするcontensts関数の関係分析


その後、このような状況の出現を追跡して発見しました。PHPのfile_とゲットするコンテント関数は密接な関係を持っています。大・中型サイトでは、HTTPプロトコルに基づくAPIインターフェースの呼び出しが日常茶飯事です。PHPプログラマー達は簡単で便利なfile_を使います。ゲットするコンテントhttp://example.com/「)関数は、URLの返却内容を取得しますが、もしhttp://example.com/ このサイトは応答が遅いです。ゲットするcontensはずっとあそこにカードをかけます。タイムアウトはしません。私たちはphp.iniにパラメータmax_があることを知っています。execution_timeはPHPスクリプトの最大実行時間を設定できますが、php-cgi(php-fpm)ではこのパラメータは効果がありません。PHPスクリプトの最大実行時間を本当に制御できるのは、php-fpm.comプロファイルの中の以下のパラメータです。The timeout(in seconds)for serving a single request after which the worker process will be terminated Shoud be used when'maxexecution_time'ini option does not stop script execution for some reason'0 s'means'off'
<?php
$ctx = stream_context_create(array(
'http' => array(
'timeout' => 1 // ,
)
)
);
file_get_contents("http://example.com/", 0, $ctx);
?>
はもちろん、php-cgiプロセスCPU 100%の原因はこの一つだけではないです。ゲットするcontensts関数によるものは?まず、トップコマンドを使用して、CPUの使用率が高いphp-cgiプロセスを確認します。
 
top - 10:34:18 up 724 days, 21:01, 3 users, load average: 17.86, 11.16, 7.69
Tasks: 561 total, 15 running, 546 sleeping, 0 stopped, 0 zombie
Cpu(s): 5.9%us, 4.2%sy, 0.0%ni, 89.4%id, 0.2%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 8100996k total, 4320108k used, 3780888k free, 772572k buffers
Swap: 8193108k total, 50776k used, 8142332k free, 412088k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10747 www 18 0 360m 22m 12m R 100.6 0.3 0:02.60 php-cgi
10709 www 16 0 359m 28m 17m R 96.8 0.4 0:11.34 php-cgi
10745 www 18 0 360m 24m 14m R 94.8 0.3 0:39.51 php-cgi
10707 www 18 0 360m 25m 14m S 77.4 0.3 0:33.48 php-cgi
10782 www 20 0 360m 26m 15m R 75.5 0.3 0:10.93 php-cgi
10708 www 25 0 360m 22m 12m R 69.7 0.3 0:45.16 php-cgi
10683 www 25 0 362m 28m 15m R 54.2 0.4 0:32.65 php-cgi
10711 www 25 0 360m 25m 15m R 52.2 0.3 0:44.25 php-cgi
10688 www 25 0 359m 25m 15m R 38.7 0.3 0:10.44 php-cgi
10719 www 25 0 360m 26m 16m R 7.7 0.3 0:40.59 php-cgi
その中の一つのCPU 100%のphp-cgiプロセスのPIDを探して、以下のコマンドで追跡します。
 
strace -p 10747
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
なら、file_であると確定できます。ゲットするコンテントによる問題です。