SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【apache】ap_thread_create: unable to create worker thread

問題

メモリには余裕があるので、Apacheの最大接続数を増やそうとしたのですが、再起動してしばらくするとApacheから応答がなくなります。

以下のエラーが出ていました。

error.log

[mpm_event:alert] [pid 16452:tid 139943910909696] (11)Resource temporarily unavailable: AH03104: ap_thread_create: unable to create worker thread
[mpm_event:alert] [pid 16707:tid 139944456719680] (11)Resource temporarily unavailable: AH00480: ap_thread_create: unable to create worker thread

/var/log/messages

kernel: [ 4555.509583] cgroup: fork rejected by pids controller in /system.slice/apache2.service

答え

Apacheが作成できるスレッドの数の上限に抵触したようです。

元の値はこちら?

# cat /sys/fs/cgroup/system.slice/apache2.service/pids.max
1133

無制限にしてよかったら以下で

systemctl set-property apache2.service TasksMax=infinity

値が変わった。

# cat /sys/fs/cgroup/system.slice/apache2.service/pids.max
max

こちらも影響するかも?(十分高い値なので今回のエラーとは無関係か)

# sysctl kernel.pid_max
kernel.pid_max = 4194304
# cat /proc/sys/kernel/threads-max
7555

やっていたことメモ

ApacheのMPM event の設定を変えていたら発生した。

デフォルト(debian /etc/apache2/mods-enabled/mpm_event.conf)

<IfModule mpm_event_module>
        StartServers                    2
        MinSpareThreads                 25
        MaxSpareThreads                 75
        ThreadLimit                     64
        ThreadsPerChild                 25
        MaxRequestWorkers        150
        MaxConnectionsPerChild   0
</IfModule>

ServerLimit は書いてなくてデフォルトは16。

デフォルトの設定で以下のエラーが出ていた。

[mpm_event:error] [pid 2265:tid 140293240388928] AH00484: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting

変更後

<IfModule mpm_event_module>
        StartServers                    4  # 特に根拠なし。どうせ増える。
        MinSpareThreads                 75 # MaxSpareThreads と同じでいい気がする
        MaxSpareThreads                 75
        ThreadLimit                     64 # どうしよう?
        ThreadsPerChild                 64 # ThreadLimit 以下にしかならない
        MaxRequestWorkers        800 # ここを大きく増やした
        MaxConnectionsPerChild   0
</IfModule>

単純に MaxRequestWorkers を増やすと表題の「unable to create worker thread」が発生した。

TasksMax を変更するとエラーは発生しなくなった。

server-status のスコアボードはこんな感じになった。

                          total accepting busy idle writing keep-alive closing
0    17455 no             138   yes       12   52   122     3          3
6    16768 no             136   yes       13   51   124     3          2
7    16769 no             153   yes       5    59   127     18         3
8    14495 no (old gen)   0     yes       0    0    0       0          0
10   14260 yes (old gen)  8     no        0    0    0       0          0
12   16707 no (old gen)   0     yes       0    0    0       0          0
13   16770 no             145   yes       8    56   114     21         3
14   16771 no             135   yes       4    60   123     5          6
15   17292 no             157   yes       4    60   143     7          2
Sum  9     1              872             46   338  753     57         19

関連するメモ

コメント