私はPHP-FPMをUnixドメインソケットでリッスンしていて、www
プール(存在する唯一のもの)を次の値で構成しました。
_slowlog = /$pool.log.slow
request_slowlog_timeout = 10s
_
テストのために、_php.ini
_のmax_execution_timeを20秒に設定しました。次に、テストスクリプトを作成しました。
_<?php
while(1){
$i++;
}
?>
_
次に、Webブラウザを介してアクセスしました。スクリプトは_max_execution_time
_が原因で最終的にタイムアウトしますが、ログは空のままです。
_root@b7e4a919c988:/var/www/html# ll /www.log.slow
-rw-rw-rw-. 1 www-data root 0 Jan 4 21:31 /www.log.slow
_
PHP-FPMログは、スローランをログに記録することを期待していたことを示しているようです。
_[04-Jan-2018 21:37:28] WARNING: [pool www] child 9382, script '/var/www/html/test.php' (request: "GET /test.php") executing too slow (13.061999 sec), logging
_
sleep(10000)
を使用したり、関数にwhile
ループを配置したりするなど、さまざまなことを試しましたが(スタックトレースを作成できなかった場合に備えて)、何も得られないようです。バックトレースをログに出力します。ログファイル自体の存在も、FPMが遅い要求を書き込むことを期待していることを示しているようです。
この時点で、他に何を確認すればよいかわかりません。
それで、たくさんのやることの後で、私はついに問題を理解しました。問題は、Linuxでは、PHP-FPMがSYS_PTRACE
を使用してワーカープロセスをトレースすることです(これがトレースデータを取得する方法だと思います)が、docker
コンテナーはこの機能を許可しません。デフォルト。
--cap-add=SYS_PTRACE
オプションを指定してDockerコンテナーを実行し、OPに記載されている2つのwww.conf
設定(slowlog
とrequest_slowlog_timeout
)を構成したら。
私が投稿した他のSO回答とは異なり、それを機能させるためにcatch_workers_output
を有効にする必要はありませんでした。
上記のスクリプトは、slowlogにこの出力を生成します。
[09-Jan-2018 17:30:39] [pool www] pid 9382
script_filename = /var/www/html/work.php
しかし、より現実的な関数トレースを生成するために、私はこの小さな数字を書きました:
<?php
function callsSlowFunc(){
for ($i=0; $i<=10; $i++){
slowFunc();
}
}
function slowFunc(){
for ($j=0; $j <= 50000000; $j++){
$hey="there";
}
}
callsSlowFunc();
これにより、この関数トレースが生成されます。
[09-Jan-2018 17:40:49] [pool www] pid 9382
script_filename = /var/www/html/work.php
[0x00007fee53613150] slowFunc() /var/www/html/work.php:6
[0x00007fee536130a0] callsSlowFunc() /var/www/html/work.php:19