Table of Contents
Apache Architecture
refer: http://stackoverflow.com/questions/17999140/prefork-vs-worker-module-for-apache-what-is-being-used
MPM(Multi Processing Module)
MPM Prefork Architecture
Basic configuration:
- StartServers: number of server processes to start
- MinSpareServers: minimum number of server processes which are kept spare
- MaxSpareServers: maximum number of server processes which are kept spare
- MaxClients: maximum number of server processes allowed to start ⇒ Limist number of httpd created and processing the request. For example: MaxClients 10, And clients send 100 concurrency requests to server, The server only create max 10 server process httpd for processing, and 99 remain requests will waiting in the queues
<IfModule mpm_prefork_module> StartServers 6 MinSpareServers 6 MaxSpareServers 12 MaxClients 12 MaxRequestsPerChild 0 </IfModule>
check config:
- check number of httpd process with none client request:
ps -eaf | grep httpd
output:
root 1629 1 0 20:56 ? 00:00:00 /usr/local/apache/bin/httpd apache 1631 1629 0 20:56 ? 00:00:00 /usr/local/apache/bin/httpd apache 1632 1629 0 20:56 ? 00:00:00 /usr/local/apache/bin/httpd apache 1633 1629 0 20:56 ? 00:00:00 /usr/local/apache/bin/httpd apache 1634 1629 0 20:56 ? 00:00:00 /usr/local/apache/bin/httpd apache 1635 1629 0 20:56 ? 00:00:00 /usr/local/apache/bin/httpd apache 1636 1629 0 20:56 ? 00:00:00 /usr/local/apache/bin/httpd
⇒ 7 processes = MinSpareServers + 1
- run load test with 20 concurrecy requests to server:
ab -n 200 -c 20 http://shop.babies.vn/
And check number of httpd processes:
ps -eaf | grep httpd root 1013 1 0 19:50 ? 00:00:00 /usr/local/apache/bin/httpd apache 1144 1013 0 20:10 ? 00:00:09 /usr/local/apache/bin/httpd apache 1210 1013 1 20:29 ? 00:00:05 /usr/local/apache/bin/httpd apache 1216 1013 2 20:30 ? 00:00:05 /usr/local/apache/bin/httpd apache 1219 1013 2 20:30 ? 00:00:06 /usr/local/apache/bin/httpd apache 1220 1013 2 20:30 ? 00:00:05 /usr/local/apache/bin/httpd apache 1226 1013 8 20:33 ? 00:00:06 /usr/local/apache/bin/httpd apache 1227 1013 8 20:33 ? 00:00:06 /usr/local/apache/bin/httpd apache 1228 1013 8 20:33 ? 00:00:06 /usr/local/apache/bin/httpd apache 1229 1013 7 20:33 ? 00:00:05 /usr/local/apache/bin/httpd apache 1230 1013 6 20:33 ? 00:00:04 /usr/local/apache/bin/httpd apache 1231 1013 8 20:33 ? 00:00:05 /usr/local/apache/bin/httpd apache 1288 1013 8 20:34 ? 00:00:03 /usr/local/apache/bin/httpd
⇒ max httpd processes = 13 = maxClients + 1
MPM worker Architecture
- StartServers: initial number of server processes to start
- MinSpareThreads: minimum number of worker threads which are kept spare
- MaxSpareThreads: maximum number of worker threads which are kept spare
- ThreadsPerChild: constant number of worker threads in each server process
Debug architecture of apache
Get current MPM is running: MPM Prefork or MPM worker
apachectl -V Server version: Apache/2.2.15 (Unix) Server built: Apr 3 2014 23:56:16 Server's Module Magic Number: 20051115:25 Server loaded: APR 1.3.9, APR-Util 1.3.9 Compiled using: APR 1.3.9, APR-Util 1.3.9 Architecture: 64-bit Server MPM: Prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/prefork" ...........................
compiled modules in MPM Prefork(httpd) and MPM worker(httpd.worker)
- httpd -V
Server version: Apache/2.2.15 (Unix) Server built: Apr 3 2014 23:56:16 Server's Module Magic Number: 20051115:25 Server loaded: APR 1.3.9, APR-Util 1.3.9 Compiled using: APR 1.3.9, APR-Util 1.3.9 Architecture: 64-bit Server MPM: Prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/prefork" -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=128 -D HTTPD_ROOT="/etc/httpd" -D SUEXEC_BIN="/usr/sbin/suexec" -D DEFAULT_PIDLOG="run/httpd.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_LOCKFILE="logs/accept.lock" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="conf/mime.types" -D SERVER_CONFIG_FILE="conf/httpd.conf"
- httpd.worker -V
Server version: Apache/2.2.15 (Unix) Server built: Apr 3 2014 23:56:59 Server's Module Magic Number: 20051115:25 Server loaded: APR 1.3.9, APR-Util 1.3.9 Compiled using: APR 1.3.9, APR-Util 1.3.9 Architecture: 64-bit Server MPM: Worker threaded: yes (fixed thread count) forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/worker" -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=128 -D HTTPD_ROOT="/etc/httpd" -D SUEXEC_BIN="/usr/sbin/suexec" -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"
- Difference between “httpd -V” and “httpd.worker -V”
- httpd -V
Server MPM: Prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/prefork"
- httpd.worker -V
Server MPM: Worker threaded: yes (fixed thread count) forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/worker"
- httpd -l
Compiled in modules: core.c prefork.c http_core.c mod_so.c
- httpd.worker -l
Compiled in modules: core.c worker.c http_core.c mod_so.c
Debug processes and used memory, cpu
- netstat -anp | grep 80 | grep LISTEN
tcp 0 0 :::80 :::* LISTEN 5141/httpd => http listen on port 80 with PID(ProcessID) 5141
- ps -eaf | grep 5141
ps -eaf | grep 5141 UID PID PPID C STIME TTY TIME CMD root 5141 1 0 15:38 ? 00:00:00 /usr/sbin/httpd apache 5176 5141 0 15:40 ? 00:00:01 /usr/sbin/httpd apache 5196 5141 0 15:42 ? 00:00:02 /usr/sbin/httpd apache 5353 5141 0 15:58 ? 00:00:00 /usr/sbin/httpd apache 5358 5141 0 15:58 ? 00:00:00 /usr/sbin/httpd apache 5360 5141 0 15:59 ? 00:00:00 /usr/sbin/httpd
⇒ PPID(Parent PID). the master process is 5141, and sub processes are 5176, 5196, 5353, 5358, 5360 with CMD is /usr/sbin/httpd
- ps -aux | grep /usr/sbin/httpd
ps -aux | grep /usr/sbin/httpd USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 5141 0.0 1.9 254904 9920 ? Ss 15:38 0:00 /usr/sbin/httpd apache 5176 0.1 9.0 290320 45340 ? S 15:40 0:01 /usr/sbin/httpd apache 5196 0.1 9.3 291896 46956 ? S 15:42 0:02 /usr/sbin/httpd apache 5353 0.1 6.8 279708 34160 ? S 15:58 0:00 /usr/sbin/httpd apache 5358 0.0 3.3 263124 16592 ? S 15:58 0:00 /usr/sbin/httpd apache 5360 0.1 7.6 283964 38312 ? S 15:59 0:00 /usr/sbin/httpd
With VSZ is Virtual Memory Size(address space allocated) , and RSS is Resident Set Size (physically resident memory)
- pmap -x 6726 | sort -nk +2
pmap -x 6812 | sort -nk +2 00007fcacac95000 2048 0 0 ----- mod_mime_magic.so 00007fcacb4a8000 2048 0 0 ----- mod_log_config.so 00007fcacc0c1000 2048 0 0 ----- mod_authz_user.so 00007fcacccd7000 2048 0 0 ----- mod_auth_digest.so 00007fcacd559000 2048 0 0 ----- libdl-2.12.so 00007fcacdb06000 2048 0 0 ----- libpthread-2.12.so 00007fcace4db000 2048 0 0 ----- libcrypt-2.12.so 00007fcad1562000 2384 2356 2356 rw--- [ anon ] 00007fcac723b000 3268 1672 0 r-x-- libphp5.so 00007fcad17b6000 47848 47488 47488 rw--- [ anon ]
Optimize apache and PHP config
optimize load module apache
Config Optimize load modules for httpd with Explain directives with these modules:
LoadModule authz_host_module modules/mod_authz_host.so#Order LoadModule access_compat_module modules/mod_access_compat.so#Require LoadModule log_config_module modules/mod_log_config.so#LogFormat,TransferLog LoadModule expires_module modules/mod_expires.so LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so LoadModule env_module modules/mod_env.so LoadModule setenvif_module modules/mod_setenvif.so#BrowserMatch LoadModule mime_module modules/mod_mime.so#AddHandler LoadModule autoindex_module modules/mod_autoindex.so#IndexOptions LoadModule negotiation_module modules/mod_negotiation.so#LanguagePriority LoadModule dir_module modules/mod_dir.so#DirectoryIndex LoadModule alias_module modules/mod_alias.so#Alias LoadModule rewrite_module modules/mod_rewrite.so
optimize load module php
Custom Config for Apache
Config disable warning log from browser
With this config, the log will display in PHP error log but they don't display in browser side\
Update httpd.conf
<IfModule mod_php5.c> php_admin_flag display_errors off </IfModule>