Help us understand the problem. What is going on with this article?

ApacheのMaxRequestWorkersエラーについて

More than 1 year has passed since last update.

ApacheでMaxRequestWorkersエラーが出ていて調べた時の備忘です。

MaxRequestWorkersエラー

Apacheの再起動後にMaxRequestWorkersのエラーメッセージが出ていました。
ちなみに、エラーメッセージを日本語に直すと、「設定したMaxRequestWorkersの値に達したので、MaxRequestWorkersの設定値を上げるよう検討してみてください」というような感じです。
「MaxRequestWorkers=同時接続数」の認識だったので、そんなに接続あるはずないのになぁ、と思ったのが、調べるに至ったきっかけです。

[root@WEB ~]# cat /var/log/httpd/error_log
[Sun Dec 02 02:02:12.975916 2018] [mpm_prefork:notice] [pid 27352] AH00170: caught SIGWINCH, shutting down gracefully
[Sun Dec 02 02:02:14.048264 2018] [mpm_prefork:notice] [pid 27461] AH00163: Apache/2.4.6 (CentOS) configured -- resuming normal operations
[Sun Dec 02 02:02:14.048289 2018] [core:notice] [pid 27461] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
[Sun Dec 02 02:02:30.065369 2018] [mpm_prefork:error] [pid 27461] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting

エラー時の設定値

エラー発生時のmpm_preforkの設定値は下記です。

[root@WEB ~]# cat /etc/httpd/conf.d/mpm.conf 
<IfModule mpm_prefork_module>
  StartServers             10
  MinSpareServers          10
  MaxSpareServers          10
  ServerLimit              10
  MaxRequestWorkers        10
  MaxConnectionsPerChild   100
</IfModule>

エラー原因

とりあえず、原因が分からなかったので、mpm_preforkの各パラメータについて調べてみました。

パラメータ 説明
StartServers Apache起動時に生成する子プロセスの数
MinSpareServers アイドル状態(リクエストを待っている状態)の子プロセスの最小数
MaxSpareServers アイドル状態(リクエストを待っている状態)の子プロセスの最大数
ServerLimit 設定値として設定可能な子プロセスの上限数
MaxRequestWorkers リクエストを処理するために起動される子プロセスの最大数
MaxConnectionsPerChild 子プロセスが稼働中に扱うリクエストの上限数

※参考URL
Apache MPM 共通ディレクティブ
Apache HTTP Server: MPMパラメータチートシート

エラー時の設定では、起動可能な子プロセスの上限数は10個(MaxRequestWorkers)です。
しかし、Apache起動時にすでに10個(StartServers)起動しており、リクエストがあってもなくても常に子プロセスを10個(MinSpareServers、MaxSpareServers)起動している状態です。
つまり、Apache起動後から常にMaxRequestWorkers分の子プロセスが起動しており、エラーメッセージが出ていたということなんですね。
この状態だと、実際に大量の同時接続が発生した場合に気づけない可能性がありますね…。

解決策

MaxRequestWorkers(起動可能な子プロセスの上限数)とServerLimit(設定値として設定可能な子プロセスの上限数)を引き上げます。

[root@WEB ~]# cat /etc/httpd/conf.d/mpm.conf 
<IfModule mpm_prefork_module>
  StartServers             10
  MinSpareServers          10
  MaxSpareServers          10
  ServerLimit              11
  MaxRequestWorkers        11
  MaxConnectionsPerChild   100
</IfModule>

Apache再起動すると、無事エラーメッセージは出なくなっていました。

[root@WEB ~]# cat /var/log/httpd/error_log
[Sun Dec 02 02:36:27.155894 2018] [mpm_prefork:notice] [pid 27662] AH00170: caught SIGWINCH, shutting down gracefully
[Sun Dec 02 02:36:28.224493 2018] [mpm_prefork:notice] [pid 27718] AH00163: Apache/2.4.6 (CentOS) configured -- resuming normal operations
[Sun Dec 02 02:36:28.224518 2018] [core:notice] [pid 27718] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'

最後に

mpm_preforkパラメータの設定に関しては、様々な意見があるようです。
StartServers、MinSpareServers、MaxSpareServers、ServerLimit、MaxRequestWorkersの値をすべて同じにしたほうが、常に一定数の子プロセスが起動している状態なのでリソースが安定するとか。
今回の投稿は一例として捉えて頂ければ幸いです。

otogiri
インフラ系SEをしています。 サーバ、ネットワーク、クラウドなど幅広くやっています。 最近はクラウド環境でLinuxがメイン。 Linux/WindowsServer/AWS/Azure/Apahe/Nginx/PostgreSQL/MySQLなど。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした