つか何回目かわからぬ( ´ω`)
以下の状況でab実施すると無反応になるのに気がついたのでやったことメモ。
- Apache2.4.23(ビルド)
- nghttp2 1.15.0(ビルド)
- mod_http2 1.7.1(ビルド)
- mod_brotli 0.3.0(ビルド)
- PHP7.0.11(ビルド)
- Mariadb 5.5.50(RPM版)
- WordPress 4.6.1(素)
mod_proxy_fcgi で php-fpm につないでいます。
socketでもTCPでも無反応になります。
[proxy_fcgi:error] [pid 9645:tid 140231782143744] (70007)The timeout specified has expired
です。
- ab -c1 -n1 でもダメ
- http でも https でもダメ
- h2 でも HTTP1.1 でもダメ
- nghttp2を色々入れ替えてもダメ
- mod_http2を色々入れ替えてもダメ
- ApacheHTTPDを色々入れ替えてもダメ
まあひどい(´・ω・`)
だんだん面倒になってきたのでバージョンの入れ替えは途中でやめました。
ちなみに、比較した動く環境は
- CentOS7
- Apache2.4.6(RPM版)
- PHP7.0.11(ビルド)/5.6.14(RPM版)
です。http2はありません。
色々試したところ、必要条件は
- Apache2.4がhttp2 enableである
ではなかろうかと言うところまで来ました。
- Apache2.4.23 –disable-http2付き
で、症状出なくなりました。
mod_http2を外せばよかろうと思って外したのですがそれではダメで
–disable-http2をつけてビルドしたものは大丈夫でした。
勿論、http2は使えなくなり、結果動く環境と似た感じになりました。
・・・が。
しばらくするとまた無反応(´・ω・`)ぐぬぬ
モジュール外してもダメな状況と合いますし、やっぱ原因は違うねと。
ソケットでつなぐ方をやりたかったので
netstat でソケット状況を見ていますとなぜか減らない。
pm = static pm.max_children = 2 pm.start_servers = 2 pm.min_spare_servers = 2 pm.max_spare_servers = 2 pm.max_requests = 10000
なので、あっても2個なのではなかろうかと(実際はプロセスが2個、ソケットはLISNINGが1個になる)。
12個ぐらいから減らないのですね。状態は CONNECTED。
この状態でab実行しても無反応なわけです。
CONNECTEDってことはつながりっぱなしってことですから、
<Proxy "fcgi://localhost/" disablereuse=off max=2>
ここかなあと。接続使い回し設定です。
disablereuse=on に(検証用に古い書き方しています)して使い回さないようにします。
果たして上手くいきましたヽ(´▽`)ノ
HTTP2も関係無かったので使えるように戻しました。
さて、この設定は動いているものからコピってきたものです。
では動いているものはなぜ動いていたのでしょうか。
動いている方でソケットの数をwatchしていくと、負荷終了後はしっかり減っていっています。
どうも設定を無視しているようです(´・ω・`)がふ
とまれPHP-FPMには使ったらあかんてことですね。