3

今日、私たちの Web サーバーからリクエストを行うと、かなり遅いことに気付きました。調査を開始したところ、ルート所有の apache プロセスが大量にあることがわかりました。

これが実際に動作が遅くなる原因なのかどうかはわかりませんが、それでも見た目は良くありません。

問題は、ここから何をすべきかわからないということですか?ルート プロセスが非常に多い理由を調べるにはどうすればよいですか? 一連のテストを推奨できますか? 私はそれらのいくつかを追跡しようとしましたが、それらは何かをしているように見えますが、strace の出力は私を超えています。

root     30918  1.8  1.3  84284 52296 ?        Ss   14:11   0:01 /usr/sbin/apache2 -k restart
root     30919  0.0  1.1  84420 45612 ?        S    14:11   0:00 /usr/sbin/apache2 -k restart
root     30920  0.0  1.1  84420 45604 ?        S    14:11   0:00 /usr/sbin/apache2 -k restart
root     30921  0.0  1.1  84420 45612 ?        S    14:11   0:00 /usr/sbin/apache2 -k restart
root     30922  0.1  1.1  84420 45612 ?        S    14:11   0:00 /usr/sbin/apache2 -k restart
root     30923  0.0  1.1  84420 45612 ?        S    14:11   0:00 /usr/sbin/apache2 -k restart
www-data 30926  6.6  1.5 104964 61336 ?        S    14:12   0:03 /usr/sbin/apache2 -k restart
root     30930  0.1  1.1  84420 45616 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
root     30933  0.0  1.1  84420 45616 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
root     30935  0.0  1.1  84420 45616 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
root     30936  0.0  1.1  84420 45616 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
root     30937  0.0  1.1  84420 45616 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
root     30938  0.0  1.1  84420 45616 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
root     30961  0.0  1.1  84420 45612 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
root     30989  0.0  1.1  84420 45612 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
root     30990  0.0  1.1  84420 45612 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
root     31011  0.1  1.1  84420 45612 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
root     31013  0.1  1.1  84420 45612 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
root     31014  0.0  1.1  84420 45612 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
www-data 31175  2.5  1.5 104168 60524 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
www-data 31189  2.3  1.4 102360 58920 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
www-data 31190  1.5  1.4 101904 58356 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
www-data 31191  0.3  1.1  84556 46760 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
www-data 31192  1.4  1.4 101916 58384 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
www-data 31193  1.5  1.4 101916 58376 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart
root     31240  0.1  1.1  84420 45612 ?        S    14:12   0:00 /usr/sbin/apache2 -k restart

これは、プロセスの 1 つからの strace からの出力の例です。

--- SIGCHLD (Child exited) @ 0 (0) ---
read(6, 0xff87f6ef, 1)                  = -1 EAGAIN (Resource temporarily unavailable)
getuid32()                              = 0
close(17)                               = 0
gettimeofday({1354109303, 670988}, NULL) = 0
semop(5668864, {{0, -1, SEM_UNDO}}, 1)  = 0
accept(4, {sa_family=AF_INET, sin_port=htons(48107), sin_addr=inet_addr("192.168.16.12")}, [16]) = 17
fcntl64(17, F_GETFD)                    = 0
fcntl64(17, F_SETFD, FD_CLOEXEC)        = 0
semop(5668864, {{0, 1, SEM_UNDO}}, 1)   = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xf74a2768) = 1949
waitpid(1949, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0) = 1949
--- SIGCHLD (Child exited) @ 0 (0) ---
read(6, 0xff87f6ef, 1)                  = -1 EAGAIN (Resource temporarily unavailable)
getuid32()                              = 0
close(17)                               = 0
gettimeofday({1354109305, 724358}, NULL) = 0
semop(5668864, {{0, -1, SEM_UNDO}}, 1)  = 0
accept(4, {sa_family=AF_INET, sin_port=htons(48132), sin_addr=inet_addr("192.168.16.12")}, [16]) = 17
fcntl64(17, F_GETFD)                    = 0
fcntl64(17, F_SETFD, FD_CLOEXEC)        = 0
semop(5668864, {{0, 1, SEM_UNDO}}, 1)   = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xf74a2768) = 1974
waitpid(1974, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0) = 1974
--- SIGCHLD (Child exited) @ 0 (0) ---

auth、env、siteenv、alias などの必須モジュールを除いて、mods-enabled のすべてのモジュールを無効にし、サーバーを起動しました。この場合でも、6 つのルート Apache プロセスと 1 つの www データ所有の Apache プロセスが得られます。

すべてのモジュールがup2dateであることを確認しました。

ログに明らかなエラーはありません。

設定に従ってください。

ServerRoot "/etc/apache2"

LockFile /var/lock/apache2/accept.lock

PidFile ${APACHE_PID_FILE}

Timeout 300

KeepAlive On

MaxKeepAliveRequests 100

KeepAliveTimeout 15

<IfModule mpm_worker_module>
StartServers          2
MaxClients          150
MinSpareThreads      25
MaxSpareThreads      75 
ThreadsPerChild      25
MaxRequestsPerChild   0
</IfModule>

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

AccessFileName .htaccess

<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>

DefaultType text/plain


HostnameLookups Off

ErrorLog /var/log/apache2/error.log

LogLevel warn

Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

Include /etc/apache2/httpd.conf

Include /etc/apache2/ports.conf

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined

Include /etc/apache2/conf.d/

Include /etc/apache2/sites-enabled/

コンパイルされたモジュール: コンパイルされたモジュール: core.c mod_log_config.c mod_logio.c itk.c http_core.c mod_so.c

そのため、現在 mpm_worker 構成のみを実行しています。

DEBUG UPDATER
When I restart apache, and ps, I get something like this;
    root     26921  0.5  1.3  80008 52452 ?        Ss   21:27   0:02 /usr/sbin/apache2 -k start
    root     27114  0.0  1.1  80144 44804 ?        S    21:34   0:00 /usr/sbin/apache2 -k start
    root     27115  0.0  1.1  80144 44820 ?        S    21:34   0:00 /usr/sbin/apache2 -k start
    root     27116  0.0  1.1  80144 44804 ?        S    21:34   0:00 /usr/sbin/apache2 -k start
    root     27117  0.0  1.1  80144 44804 ?        S    21:34   0:00 /usr/sbin/apache2 -k start
    root     27119  0.0  1.1  80144 44804 ?        S    21:34   0:00 /usr/sbin/apache2 -k start

LogLevel をデバッグして再起動すると、mod_proxy からこれらのメッセージが表示されます

[Thu Nov 29 21:34:01 2012] [info] Server built: Sep  9 2012 21:17:36
[Thu Nov 29 21:34:01 2012] [debug] itk.c(1100): AcceptMutex: sysvsem (default: sysvsem)
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1818): proxy: grabbed scoreboard slot 0 in child 27115 for worker proxy:reverse
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1818): proxy: grabbed scoreboard slot 0 in child 27114 for worker proxy:reverse
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1934): proxy: initialized single connection worker 0 in child 27115 for (*)
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1837): proxy: worker proxy:reverse already initialized
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1934): proxy: initialized single connection worker 0 in child 27114 for (*)
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1818): proxy: grabbed scoreboard slot 0 in child 27117 for worker proxy:reverse
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1837): proxy: worker proxy:reverse already initialized
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1934): proxy: initialized single connection worker 0 in child 27117 for (*)
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1818): proxy: grabbed scoreboard slot 0 in child 27119 for worker proxy:reverse
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1837): proxy: worker proxy:reverse already initialized
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1934): proxy: initialized single connection worker 0 in child 27119 for (*)
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1818): proxy: grabbed scoreboard slot 0 in child 27116 for worker proxy:reverse
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1837): proxy: worker proxy:reverse already initialized
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1934): proxy: initialized single connection worker 0 in child 27116 for (*)
[Thu Nov 29 21:36:20 2012] [notice] SIGHUP received.  Attempting to restart

pid が一致していることに注意してください。ただし、mod_proxy を無効にすると、これらのメッセージは消えますが、それでも同じ数のルート プロセスが開始されるため、これは原因ではなく症状であると思います。

4

2 に答える 2

2

これは、Apache ではまったく正常です。各プロセスは、一度に 1 つの要求を処理します。そのため、プロセス (ワーカーと呼ばれる) が 1 つしかない場合、多数のユーザーがいると非常に遅くなります。

私が見る問題は、これらがルート所有のプロセスであってはならないということです。プラットフォームによっては、独自のユーザーが必要です。Debian ユーザーの場合と同様に、www-data になります。その場合、1 つのプロセスのみが root によって所有され、残りはそのユーザーによって所有されます。

ただし、速度は、ハードウェア、Web サーバー、および Web アプリケーションなどのいくつかの要因によって決まります。

実行しているハードウェアが要件に適合していることを確認してください (十分な RAM と CPU)。

ハードウェアの能力が低い場合はワーカーの数を減らし、非常に優れている場合はワーカーを増やします。

Web アプリケーション (存在する場合、多くの場合は php アプリ) がパフォーマンスのボトルネックになっていないことを確認してください。

PS: 携帯電話からぎこちなく入力したため、書式設定が不十分で申し訳ありません。

于 2012-11-29T17:39:46.350 に答える
0

私はゲームに少し遅れていることを知っていますが、同じ問題に遭遇し、何が起こっているのかを理解しようとしていました. 私はApache 2.4.7を使用しているので、あなたより少し新しいですが、一般的な前提は同じです。

/etc/apache2/mods-enabled/mpm_prefork.conf を調べて mpm 構成を見つける必要がありましたが、ここにあります。

<IfModule mpm_worker_module>
 StartServers          2
 MaxClients          150
 MinSpareThreads      25
 MaxSpareThreads      75 
 ThreadsPerChild      25
 MaxRequestsPerChild   0
</IfModule>

有効な構成のように見えます。ただし、MaxRequestsPerChild は、私の場合と同様に 0 に設定されています。約 10 に調整しました (おそらく高くなる可能性がありますが、現在テスト中です)。これで問題は解決したと思います。お役に立てれば!

于 2014-10-03T17:05:21.463 に答える