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