Apache调优方法(Apache2.4,prefork)

首先

当使用Apache公开Web服务器时,根据公开范围和规模的不同,需要对Apache进行配置调优。这里我们将介绍prefork调优的一种例子。

prefork是什么?

    • Apacheのプロセスの挙動の方式の一つ

 

    • スレッドを使わずに、fork(自分自身のコピー)を行う=prefork

 

    • あらかじめ(pre)Apacheの子プロセスをコピー(fork)しておき、forkの待ち時間を減らすことでパフォーマンスを上げている

 

    • forkされた子プロセス一つ一つが通信を受け持つ

 

    • 他の子プロセスがおかしな挙動をしても、他の子プロセスには影響がないため、安定した通信が可能

 

    preforkで多数のクライアントを裁くには、多数のメモリ・CPUを使用する

前提是一个假设条件或是局限,它指的是一个必须成立或被接受的基础要素。

    • CentOS7.2

 

    • Apache2.4

 

    サイジング済み(想定されるリクエスト数、使用メモリ、CPUは計算済み)

设置方式

为了使设置更加清晰易懂,这次将记录在一个名为mpm.conf的文件中。
→也可以记录在httpd.conf中。

确认进程的行为模式

有一个名为worker的与prefork类似的选项。默认情况下是prefork,但为了保险起见,请再确认一下。

# apachectl -V
Server version: Apache/2.4.25 (CentOS)
Server built:   Jan  6 2017 14:54:10
Server's Module Magic Number: 20120211:67
Server loaded:  APR 1.5.2, APR-UTIL 1.5.4
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
Architecture:   64-bit
Server MPM:     prefork ←★ここを確認!
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

服务器MPM:只要是prefork就可以!

2. 进行设定之前的确认

这次我们要增加 Apache 的进程数,所以让我们先确认一下增加之前的状态。

# ps -ef | grep httpd
root       941     1  0 Mar21 ?        00:00:16 /usr/sbin/httpd -DFOREGROUND
apache    2149   941  0 Mar21 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2150   941  0 Mar21 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2151   941  0 Mar21 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2152   941  0 Mar21 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2153   941  0 Mar21 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root      8109  8035  0 14:35 pts/0    00:00:00 grep httpd

记住这个数字!
在进行基本设置之前,请确保进行了事前确认!
如果不这样做,就无法知道设置后的变化是什么了…

创建mpm.conf文件

请创建一个记录Apache调优内容的文件。
可以使用vi命令一次性创建并进行写入。

# touch /etc/httpd/conf.d/mpm.conf

4. 在 mpm.conf 文件中写入

以下是实际的调整内容。
※ 调整内容会因大小尺寸不同而有所不同!

<IfModule mpm_prefork_module>
    StartServers 400 ←起動時に生成される子サーバプロセスの数。デフォルトは5。
    MinSpareServers 400 ←アイドル状態にいる子サーバプロセスの最小(希望)個数。デフォルトは5。
    MaxSpareServers 400 ←アイドル状態にいる子サーバプロセスの最大(希望)個数。デフォルトは10。
    ServerLimit 400 ←MaxClientsに指定可能な値の上限。(MaxClientより大きな数にする)
    MaxClients 400 ←応答できる同時リクエスト数。デフォルトは256。
    MaxRequestsPerChild 80 ←個々の子サーバプロセスが扱うことのできるリクエストの総数。デフォルトは10000。0にすると無制限
</IfModule>

在httpd.conf文件中进行添加

这次我还额外追加了下面的内容。

KeepAlive On ←クライアントからの接続要求時に即座にセッションを閉じないようにする設定
MaxKeepAliveRequests 80 ←一度に処理できる数の最大値(1ページあたりの平均ファイル数+αが参考値)
KeepAliveTimeout 120 ←KeepAlive有効時に接続要求を受け付ける数の最大許容値(1ページ当たりの平均的な転送時間+αが参考値)

6. 设定的应用

为了应用上述设置,我们将重新启动Apache。

# systemctl restart httpd

7. 確認設定后的进程。

让我们将步骤2进行比较吧!

# ps -ef | grep httpd
root      8120     1 87 14:36 ?        00:00:05 /usr/sbin/httpd -DFOREGROUND
apache    8121  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8123  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8124  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8126  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8129  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8131  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8133  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8134  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8136  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8137  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8139  8120  1 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8140  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8141  8120  1 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8142  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8143  8120  2 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8144  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8145  8120  2 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8146  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8147  8120  1 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8148  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8149  8120  1 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8163  8120  1 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8165  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8167  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8169  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8171  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8173  8120  0 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8175  8120  1 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8177  8120  5 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8179  8120  2 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8181  8120  4 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8183  8120  2 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    8185  8120  8 14:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root      8188  8035  0 14:36 pts/0    00:00:00 grep httpd

增长很大!由于内存和CPU容量估计失误会导致服务器宕机,所以我们要准确计算容量。
我记得当时安装的是5台32GB内存的服务器……(我记得不太清楚……)

糟糕! or 不好了!

闲谈

为什么选择将其命名为mpm.conf?

    • mpm_prefork_moduleを使っているから

 

    • MPM=マルチプロセッシングモジュール

 

    • マルチプロセスとは、リクエストごとにforkを行い、子プロセスを生成し、処理をしてもらう

 

    • MPMとは、リクエストを処理する部分のことを指す

 

    prefork, worker, eventなどがある

工人是指一位从事劳动工作的人。

    • 子プロセスがマルチスレッドで操作し、スレッドがクライアントを受け持つ

 

    • 1つのプロセスが複数の通信を行う(プロセスの中に、通信をするスレッドが複数いる)

 

    プロセスの起動を抑えることが可能なため、CPUやメモリの使用率を抑えることが可能

event是指一個特定的活動或場合。

    • workerと同じで、マルチスレッドで動作する

 

    • 違いは、Keep-Alive(持続的接続)の処理方法

 

    preforkやworkerは同じプロセスやスレッドを持続接続の際に利用するが、workerでは別のスレッドに割り振る

MPM的切换方法(Apache2.4)

将默认的prefork模式更改为worker模式。

1. 请事先确认变更前的内容。

# apachectl -V | grep MPM
Server MPM:     prefork

2. 切换到MPM

# /etc/httpd/conf.modules.d/00-mpm.conf
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so ←★コメントアウトします!

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
LoadModule mpm_worker_module modules/mod_mpm_worker.so ←★コメントアウトを外します!

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so

3. 应用设置的更新

# systemctl restart httpd

4. 確認設定已完成。

# apachectl -V | grep MPM
Server MPM:     worker