質問: ### Apacheのスレッドが増加する原因を特定するには何を調査すれば良いでしょうか? Plesk環境にて某サイトを運営しています。Google Analytics上ではコンスタントに400~500の接続があり、月間PVは約400万のサイトです。 およそ定期的にApacheが落ちてしまいwatch_dogによりApacheの再起動がかかります。 server reached MaxRequestWorkers settingとなってしまうのが直接的な原因かと思いますが、 アクセスが集中していない深夜帯の午前4時頃にも起こっている原因がわかりません。 (稀にアクセスが集中して同様のエラーで落ちることがあります) また、おおよそではありますが4時間毎に同じエラーで落ちています。 一回のタイミングで複数回落ちることもあります。 0時台、4時台、8時台、12時台・・・が大まかな流れです。以下が実際の時刻です。 (AH00484: server reached MaxRequestWorkers settingが起きた時刻です) Sun Jul 21 20:22:08.382531 2019 Sun Jul 21 20:37:36.175939 2019 Sun Jul 21 20:53:58.803470 2019 Mon Jul 22 00:22:48.132260 2019 Mon Jul 22 00:56:57.981250 2019 Mon Jul 22 01:16:41.314307 2019 Mon Jul 22 04:41:06.600084 2019 Mon Jul 22 08:21:54.423372 2019 Mon Jul 22 08:39:16.064287 2019 Mon Jul 22 09:00:13.023712 2019 スペックを上げてmpm_event等のApache調整をすれば問題は起きなくなるかもしれませんが、 約4時間毎に何かが悪さをしていると考えていて根本的な解決をしたいと思います。 これらが発生する原因はどこを調べれば良いでしょうか。ご教示お願い致します。 ### 発生している問題・エラーメッセージ ``` ・ ・ ・ [Tue Jul 23 08:57:31.400193 2019] [mpm_event:error] [pid 1692:tid 140709346474112] AH00485: scoreboard is full, not at MaxRequestWorkers [Tue Jul 23 08:57:32.403187 2019] [mpm_event:error] [pid 1692:tid 140709346474112] AH00485: scoreboard is full, not at MaxRequestWorkers [Tue Jul 23 08:57:33.405190 2019] [mpm_event:error] [pid 1692:tid 140709346474112] AH00485: scoreboard is full, not at MaxRequestWorkers [Tue Jul 23 08:57:35.409495 2019] [mpm_event:error] [pid 1692:tid 140709346474112] AH00484: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting [Tue Jul 23 09:00:27.668690 2019] [mpm_event:notice] [pid 1692:tid 140709346474112] AH00492: caught SIGWINCH, shutting down gracefully [Tue Jul 23 09:00:33.762839 2019] [core:warn] [pid 1692:tid 140709346474112] AH00045: child process 1749 still did not exit, sending a SIGTERM [Tue Jul 23 09:00:33.762936 2019] [core:warn] [pid 1692:tid 140709346474112] AH00045: child process 1751 still did not exit, sending a SIGTERM [Tue Jul 23 09:00:33.762946 2019] [core:warn] [pid 1692:tid 140709346474112] AH00045: child process 1753 still did not exit, sending a SIGTERM ・ ・ ・ ``` ### 試したこと ・error_logの確認をしたが、上記の通りでした ・crontabで4時間毎のcronがあるかどうか確認したが、なかった ・mpm_eventの設定を「MaxRequestWorkers 500」「ServerLimit 20」に変えてみたが同様のエラー ・mpm_eventをmpm_preforkに変えてみたが同様のエラーが起きた ``` netstat -an | egrep ':80|:443' | grep ESTABLISHED | awk '{print $5}' | grep -o -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sort -n | uniq -c | sort -nr ``` 上記でアクセス回数を調べても30回を超えるIPはいなかった(攻撃されているとは考えにくい?) 更に追加で試したこと(20190724時点) ---------------------- ・mpm_eventの設定を「MaxRequestWorkers 750」「ServerLimit 30」に変えてみたが同様のエラー mpm_eventの設定は/etc/httpd/conf.modules.d/01-cgi.conf に記述しています。 ``` # This configuration file loads a CGI module appropriate to the MPM # which has been configured in 00-mpm.conf. mod_cgid should be used # with a threaded MPM; mod_cgi with the prefork MPM. LoadModule cgid_module modules/mod_cgid.so LoadModule cgid_module modules/mod_cgid.so MaxRequestWorkers 750 ServerLimit 30 LoadModule cgi_module modules/mod_cgi.so ``` httpd.confには`Include conf.modules.d/*.conf`とあります。 mpmのモジュールは`LoadModule mpm_event_module modules/mod_mpm_event.so`よりmpm_eventです 念の為`httpd -V`にて得られた結果に以下が記載されています ``` Server MPM: event threaded: yes (fixed thread count) forked: yes (variable process count) ``` 上記の設定は以下のURLを参考にしています。 設定を変更したあとは`systemctl restart httpd.service`にてApacheの再起動をおこなっています。 ・20190723の16:00頃にサーバの再起動も試してみました。がダメでした。 何れにせよ4時間毎にApacheのスレッドが増えてしまう原因を潰さなければ根本的な解決にはならないと考えています・・・ 更に追加で試したこと(20190724 16:35時点) ---------------------------- ・mpm_eventの設定を「MaxRequestWorkers 1000」「ServerLimit 40」に変えてみたが同様のエラー 落ちる直前に`ps aux | grep httpd`にて立ち上がっていた個数は44くらいありましたが、 直前になって急激に増えました。平常時は13~17程度の間になります。 Apacheのスレッドが立ちまくってメモリ使用率が80%くらいまでなったので、 その後設定を「MaxRequestWorkers 750」「ServerLimit 30」にもどしました。 約4時間毎に急激にApacheのスレッドが増える原因は何でしょうか。。。 些細なヒントでもいいので皆様のご意見をお待ちしております。 更に追加で試したこと(20190725 11:00時点) ---------------------------- 参考URL ・mpm_preforkに変更 ・`/etc/logrotate.d/httpd`にあるApacheの読み込み方法を`reload`から`restart`に変更 ``` KeepAlive Off StartServers 10 MinSpareServers 20 MaxSpareServers 60 ServerLimit 200 MaxClients 200 MaxRequestsPerChild 1000 ``` ・mpm_preforkの設定を上記にする。 (KeepAliveをOFFにしています) 設定を一気に変えて様子を見るのは悪手だとわかっていますが、実害がでてしまっているので藁にもすがる思いです。 更に追加で試したこと(20190725 14:00時点) ---------------------------- ・上記の11時時点で試したことを行っても約4時間毎のエラーでおちてしましました。 エラーメッセージは以下です。 スコアボードの記述はなくいきなりserver reached MaxRequestWorkers となっています。 ``` [Thu Jul 25 13:23:02.328449 2019] [jk:warn] [pid 27849] No JkLogFile defined in httpd.conf. Using default /etc/httpd/logs/mod_jk.log [Thu Jul 25 13:23:02.328633 2019] [jk:warn] [pid 27849] No JkShmFile defined in httpd.conf. Using default /etc/httpd/logs/jk-runtime-status [ N 2019-07-25 13:23:02.3521 27881/T1 age/Wat/WatchdogMain.cpp:1307 ]: Starting Passenger watchdog... [ N 2019-07-25 13:23:02.3681 27884/T1 age/Cor/CoreMain.cpp:1311 ]: Starting Passenger core... [ N 2019-07-25 13:23:02.3682 27884/T1 age/Cor/CoreMain.cpp:256 ]: Passenger core running in multi-application mode. [ N 2019-07-25 13:23:02.3773 27884/T1 age/Cor/CoreMain.cpp:986 ]: Passenger core online, PID 27884 [Thu Jul 25 13:23:02.387400 2019] [mpm_prefork:notice] [pid 27849] AH00163: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips Apache mod_fcgid/2.3.9 mod_jk/1.2.40 Phusion_Passenger/5.3.5 mod_perl/2.0.9-dev Perl/v5.16.3 configured -- resuming normal operations [Thu Jul 25 13:23:02.387440 2019] [core:notice] [pid 27849] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND' [ N 2019-07-25 13:23:05.5255 27884/T5 age/Cor/SecurityUpdateChecker.h:517 ]: Security update check: no update found (next check in 24 hours) [Thu Jul 25 13:34:37.767338 2019] [mpm_prefork:error] [pid 27849] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting [Thu Jul 25 13:36:33.927238 2019] [mpm_prefork:notice] [pid 27849] AH00170: caught SIGWINCH, shutting down gracefully [ N 2019-07-25 13:36:37.1196 27884/T8 age/Cor/CoreMain.cpp:641 ]: Signal received. Gracefully shutting down... (send signal 2 more time(s) to force shutdown) [ N 2019-07-25 13:36:37.1196 27884/T1 age/Cor/CoreMain.cpp:1217 ]: Received command to shutdown gracefully. Waiting until all clients have disconnected... [ N 2019-07-25 13:36:37.1197 27884/Ta Ser/Server.h:903 ]: [ServerThr.2] Freed 0 spare client objects [ N 2019-07-25 13:36:37.1197 27884/Ta Ser/Server.h:559 ]: [ServerThr.2] Shutdown finished ``` mpm_preforkの設定を以下に変更しました。 ``` KeepAlive Off StartServers 10 MinSpareServers 20 MaxSpareServers 80 ServerLimit 200 MaxRequestWorkers 200 MaxConnectionsPerChild 0 ``` 更に追加で試したこと(20190725 17:45時点) ---------------------------- 4時間毎のタイミングでサイトはタイムアウトで表示されません。 しかしエラーログにはなにも残らなくなりました。 watch_dogが反応せず、Apacheの再起動がかかりません。 サイトが表示されないタイミングでのPSコマンドでのHTTPDのスレッド数は200でしたので、マックスな気がします。 ただし、メモリの使用率が95%を超えていました。 Apacheリスタートが自動がかからないのはまずいのでmpm_eventの時代にもどしました。 ### サーバーの環境 | 項目 | 内容 | | --- | --- | | CPU | Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz (4 core(s)) | | memory | 8G | | Plesk | Plesk Onyx v17.8.11_build1708180301.19 os_CentOS 7 | | OS | CentOS Linux 7.6.1810 (Core) | | PHP | 5.6.40 | | httpd | 2.4.6-89.el7.centos | ### 補足情報 Apache の CPU 使用率は普段は20%前後、アクセス集中しているときでも40%に到達することは稀です。 Apache のメモリ使用率は普段は7.55 GB 中 1.50 GB程度です、負荷時も2.50 GB程度です。
回答: 下記 URL のバグに該当するのではないでしょうか。 Bug#53555 Comment 39 で原因についての記述があります。 下記のような状況で graceful で子プロセスがすぐには終了しないため、scoreboard slot を使い切ってしまうとのこと。 * a) graceful restart の場合 (logrotate も) * b) 負荷状況によってプロセスが増→減する場合 (MaxConnectionsPerChild で終了する場合も?) Comment 55 に Patch があり、Comment 66 で **Fixed in 2.4.25** で議論が終了しています。 CentOS 7 は httpd-2.4.6 のバージョンのままパッチを当てていますので、最新リリースで修正されている可能性はあります。 ダメなら、SCL リポジトリ の httpd24 パッケージ(2.4.34)を使うか、ソースからインストールするか。