Использование Apache prefork MPM и worker MPM в CentOS 5

archive view archive save

Использование Apache prefork MPM и worker MPM в VPS CentOS 5 prefork MPM и worker MPM это мультипроцессорные модели (модули) для веб-сервера Apache, основными среди MPM являются worker, pre-fork, perchild, netware, winnt, Apache-ITK, peruser. По умолчанию Apache настроен на использование prefork MPM.

worker MPM обрабатывает запросы по такому принципу - при старте веб сервера Apache создаются несколько дочерних процессов, с несколькими потоками в каждом (определяется значениями конфигурационного файла Apache).

prefork MPM же при старте веб сервера Apache порождает определённое количество дочерних процессов httpd и в отличие от worker MPM, в каждом из этих процессов рождается только по одному потоку. Т.е. каждый порожденный prefork MPM процесс обрабатывает только одно соединение.

Преимуществом worker MPM перед prefork MPM является пониженное потребление памяти. Пользователи VPS с ограниченной оперативной памятью (менее 256 МВ) часто жалуются на пожирание Apache-м почти всей оперативки (100 МВ и более), от части это связано с настройками по умолчанию, а от части режима prefork MPM также по умолчанию установленного в Apache.

Нашей целью будет перевод Apache с режима prefork MPM в режим worker MPM и снижение потребления оперативной памяти (RAM) максимум до 50-60 МВ. Следует отметить, что режим prefork MPM заведомо определяется как стабильный, хотя в тоже время worker MPM не заявлен как не стабильный, а скорее связан с дополнительными сложностями настройки, отсутствием в системе нужных/дополнительных библиотек и модулей.

Перевод Apache с prefork MPM на worker MPM в VPS CentOS 5

Узнать скомпилированы ли модули для поддержки prefork MPM и worker MPM в VPS CentOS 5 можно выполнив команды:

[root@remotehelp tmp]# /usr/sbin/apachectl -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c
[root@remotehelp tmp]# /usr/sbin/httpd.worker -l
Compiled in modules:
  core.c
  worker.c
  http_core.c
  mod_so.c

По умолчанию Apache веб сервер использует prefork MPM, что бы это проверить можно выполнить команду cat /etc/sysconfig/httpd и если строка #HTTPD=/usr/sbin/httpd.worker окажется закомментированной, то значит используется prefork MPM.

Более точный результат о текущем варианте использования prefork MPM или worker MPM даёт команда /usr/sbin/apachectl -l

Теперь пытаемся перейти на worker MPM расскомментировав строку #HTTPD=/usr/sbin/httpd.worker и перезапустив Apache:

[root@remotehelp tmp]# vi /etc/sysconfig/httpd
[root@remotehelp tmp]# service httpd restart
Starting httpd: httpd.worker: Syntax error on line 215 of /etc/httpd/conf/httpd.
conf: Syntax error on line 9 of /etc/httpd/conf.d/php.conf: Cannot load /etc/htt
pd/modules/libphp5-zts.so into server: /etc/httpd/modules/libphp5-zts.so: cannot
 open shared object file: No such file or directory
                                                           [FAILED]
[root@remotehelp tmp]#

Как видим упёрлись в отсутствие модуля libphp5-zts.so. libphp5-zts.so содержится в пакете php-zts который у нас отсутствует:

Name        : php-zts
Version     : 5.3.8
Release     : 2.el5.art
Architecture: x86_64
Size        : 4210728
Packager    : None
Group       : Development/Languages
URL         : http://www.php.net/
Repository  : atomic
Summary     : Thread-safe PHP interpreter for use with the Apache HTTP Server
Description :
The php-zts package contains a module for use with the Apache HTTP
Server which can operate under a threaded server processing model.

Пакет php-zts (zts переводится как Zend Thread Safety) и инструкции по его установке можно найти здесь http://pkgs.org/centos-5-rhel-5/atomic-x86_64/php-zts-5.3.8-2.el5.art.x86_64.rpm.html#howto

Download the latest atomic-release rpm from
http://www6.atomicorp.com/channels/atomic/centos/5/x86_64/RPMS/
Install atomic-release rpm:
# rpm -Uvh atomic-release*rpm
Install php-zts rpm package:
# yum install php-zts

Для начала установки нам нужно получить доступ к репозиторию atomic. Получение доступа к репозиторию atomic с последующей установкой php-zts в SSH консоли выглядит следующим образом:

[root@remotehelp tmp]# wget -q -O - http://www.atomicorp.com/installers/atomic |
sh
 
Atomic Archive installer, version 2.0.6
 
BY INSTALLING THIS SOFTWARE AND BY USING ANY AND ALL SOFTWARE
PROVIDED BY ATOMICORP LIMITED YOU ACKNOWLEDGE AND AGREE:
 
THIS SOFTWARE AND ALL SOFTWARE PROVIDED IN THIS REPOSITORY IS
PROVIDED BY ATOMICORP LIMITED AS IS, IS UNSUPPORTED AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ATOMICORP LIMITED, THE
COPYRIGHT OWNER OR ANY CONTRIBUTOR TO ANY AND ALL SOFTWARE PROVIDED
BY OR PUBLISHED IN THIS REPOSITORY BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.
 
Do you agree to these terms? (yes/no) [Default: yes] yes
 
Configuring the [atomic] yum archive for this system
 
Installing the Atomic GPG key: OK
Downloading atomic-release-1.0-14.el5.art.noarch.rpm: OK
 
 
 
The Atomic Rocket Turtle archive has now been installed and configured for your
system
The following channels are available:
atomic - [ACTIVATED] - contains the stable tree of ART packages
atomic-testing - [DISABLED] - contains the testing tree of ART packages
atomic-bleeding - [DISABLED] - contains the development tree of ART packages
 
 
[root@remotehelp tmp]#
 
[root@remotehelp tmp]# yum install atomic-release
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* atomic: www7.atomicorp.com
* base: mirror.de.leaseweb.net
* extras: mirror.de.leaseweb.net
* updates: mirror.de.leaseweb.net
atomic | 1.9 kB 00:00
atomic/primary_db | 701 kB 00:07
Setting up Install Process
Package atomic-release-1.0-14.el5.art.noarch already installed and latest versio
n
Nothing to do
[root@remotehelp tmp]#
 
[root@remotehelp tmp]# yum install php-zts
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* atomic: www7.atomicorp.com
* base: mirror.de.leaseweb.net
* extras: mirror.de.leaseweb.net
* updates: mirror.de.leaseweb.net
Setting up Install Process
Package php-zts is obsoleted by php, trying to install php-5.3.14-6.el5.art.i386
instead
Resolving Dependencies
--> Running transaction check
---> Package php.i386 0:5.3.14-6.el5.art set to be updated
--> Processing Dependency: php-cli = 5.3.14-6.el5.art for package: php
--> Processing Dependency: php-common = 5.3.14-6.el5.art for package: php
--> Processing Dependency: libedit.so.0 for package: php
--> Processing Dependency: php53 = 5.3.3-13.el5_8 for package: php53-devel
--> Running transaction check
---> Package libedit.i386 0:3.0-2.20090923cvs.el5.art set to be updated
---> Package php-cli.i386 0:5.3.14-6.el5.art set to be updated
---> Package php-common.i386 0:5.3.14-6.el5.art set to be updated
---> Package php-devel.i386 0:5.3.14-6.el5.art set to be updated
--> Finished Dependency Resolution
 
Dependencies Resolved
 
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
php i386 5.3.14-6.el5.art atomic 2.7 M
replacing php53.i386 5.3.3-13.el5_8
 
php-cli i386 5.3.14-6.el5.art atomic 2.7 M
replacing php53-cli.i386 5.3.3-13.el5_8
 
php-common i386 5.3.14-6.el5.art atomic 1.0 M
replacing php53-common.i386 5.3.3-13.el5_8
 
php-devel i386 5.3.14-6.el5.art atomic 1.3 M
replacing php53-devel.i386 5.3.3-13.el5_8
 
Installing for dependencies:
libedit i386 3.0-2.20090923cvs.el5.art atomic 80 k
 
Transaction Summary
================================================================================
Install 5 Package(s)
Upgrade 0 Package(s)
 
Total download size: 7.7 M
Is this ok [y/N]: y
Downloading Packages:
(1/5): libedit-3.0-2.20090923cvs.el5.art.i386.rpm | 80 kB 00:01
(2/5): php-common-5.3.14-6.el5.art.i386.rpm | 1.0 MB 00:09
(3/5): php-devel-5.3.14-6.el5.art.i386.rpm | 1.3 MB 00:14
(4/5): php-cli-5.3.14-6.el5.art.i386.rpm | 2.7 MB 00:30
(5/5): php-5.3.14-6.el5.art.i386.rpm | 2.7 MB 00:25
--------------------------------------------------------------------------------
Total 96 kB/s | 7.7 MB 01:22
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : php-common 1/9
warning: /etc/php.ini created as /etc/php.ini.rpmnew
Installing : libedit 2/9
Installing : php-cli 3/9
Installing : php 4/9
Installing : php-devel 5/9
Erasing : php53-common 6/9
Erasing : php53 7/9
Erasing : php53-cli 8/9
Erasing : php53-devel 9/9
 
Installed:
php.i386 0:5.3.14-6.el5.art php-cli.i386 0:5.3.14-6.el5.art
php-common.i386 0:5.3.14-6.el5.art php-devel.i386 0:5.3.14-6.el5.art
 
Dependency Installed:
libedit.i386 0:3.0-2.20090923cvs.el5.art
 
Replaced:
php53.i386 0:5.3.3-13.el5_8 php53-cli.i386 0:5.3.3-13.el5_8
php53-common.i386 0:5.3.3-13.el5_8 php53-devel.i386 0:5.3.3-13.el5_8
 
Complete!
[root@remotehelp tmp]#

Теперь желательно выполнить обновление всех пакетов:

[root@remotehelp tmp]# yum update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* atomic: www7.atomicorp.com
* base: mirror.de.leaseweb.net
* extras: mirror.de.leaseweb.net
* updates: mirror.de.leaseweb.net
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package libsepol.i386 0:2.0.36-1.el5.art set to be updated
--> Processing Dependency: libmysqlclient.so.15 for package: perl-DBD-MySQL
--> Processing Dependency: libmysqlclient.so.15(libmysqlclient_15) for package:
perl-DBD-MySQL
---> Package mysql.i386 0:5.5.25-7.el5.art set to be updated
--> Processing Dependency: mysql-libs = 5.5.25-7.el5.art for package: mysql
---> Package mysql-server.i386 0:5.5.25-7.el5.art set to be updated
--> Processing Dependency: libaio.so.1(LIBAIO_0.4) for package: mysql-server
--> Processing Dependency: libaio.so.1 for package: mysql-server
--> Processing Dependency: libaio.so.1(LIBAIO_0.1) for package: mysql-server
---> Package nmap.i386 2:5.51-1.el5.art set to be updated
---> Package php-bcmath.i386 0:5.3.14-6.el5.art set to be updated
---> Package php-gd.i386 0:5.3.14-6.el5.art set to be updated
--> Processing Dependency: libt1.so.5 for package: php-gd
---> Package php-mbstring.i386 0:5.3.14-6.el5.art set to be updated
---> Package php-mysql.i386 0:5.3.14-6.el5.art set to be updated
---> Package php-pdo.i386 0:5.3.14-6.el5.art set to be updated
---> Package php-soap.i386 0:5.3.14-6.el5.art set to be updated
---> Package php-xml.i386 0:5.3.14-6.el5.art set to be updated
---> Package php-xmlrpc.i386 0:5.3.14-6.el5.art set to be updated
---> Package sqlite.i386 0:3.7.0.1-1.el5.art set to be updated
--> Running transaction check
---> Package libaio.i386 0:0.3.106-5 set to be updated
---> Package mysql-libs.i386 0:5.5.25-7.el5.art set to be updated
---> Package mysqlclient15.i386 0:5.0.90-2.el5.art set to be updated
---> Package t1lib.i386 0:5.1.2-2.el5.art set to be updated
--> Processing Dependency: libXaw.so.7 for package: t1lib
--> Processing Dependency: libXt.so.6 for package: t1lib
--> Running transaction check
---> Package libXaw.i386 0:1.0.2-8.1 set to be updated
--> Processing Dependency: libXext.so.6 for package: libXaw
--> Processing Dependency: libXmu.so.6 for package: libXaw
---> Package libXt.i386 0:1.0.2-3.2.el5 set to be updated
--> Processing Dependency: libICE.so.6 for package: libXt
--> Processing Dependency: libSM.so.6 for package: libXt
--> Running transaction check
---> Package libICE.i386 0:1.0.1-2.1 set to be updated
---> Package libSM.i386 0:1.0.1-3.1 set to be updated
---> Package libXext.i386 0:1.0.1-2.1 set to be updated
---> Package libXmu.i386 0:1.0.2-5 set to be updated
--> Finished Dependency Resolution
 
Dependencies Resolved
 
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
php-bcmath i386 5.3.14-6.el5.art atomic 40 k
replacing php53-bcmath.i386 5.3.3-13.el5_8
 
php-gd i386 5.3.14-6.el5.art atomic 205 k
replacing php53-gd.i386 5.3.3-13.el5_8
 
php-mbstring i386 5.3.14-6.el5.art atomic 2.3 M
replacing php53-mbstring.i386 5.3.3-13.el5_8
 
php-mysql i386 5.3.14-6.el5.art atomic 89 k
replacing php53-mysql.i386 5.3.3-13.el5_8
 
php-pdo i386 5.3.14-6.el5.art atomic 116 k
replacing php53-pdo.i386 5.3.3-13.el5_8
 
php-soap i386 5.3.14-6.el5.art atomic 279 k
replacing php53-soap.i386 5.3.3-13.el5_8
 
php-xml i386 5.3.14-6.el5.art atomic 210 k
replacing php53-xml.i386 5.3.3-13.el5_8
 
php-xmlrpc i386 5.3.14-6.el5.art atomic 86 k
replacing php53-xmlrpc.i386 5.3.3-13.el5_8
 
Updating:
libsepol i386 2.0.36-1.el5.art atomic 129 k
mysql i386 5.5.25-7.el5.art atomic 7.5 M
mysql-server i386 5.5.25-7.el5.art atomic 16 M
nmap i386 2:5.51-1.el5.art atomic 3.3 M
sqlite i386 3.7.0.1-1.el5.art atomic 325 k
Installing for dependencies:
libICE i386 1.0.1-2.1 base 54 k
libSM i386 1.0.1-3.1 base 27 k
libXaw i386 1.0.2-8.1 base 324 k
libXext i386 1.0.1-2.1 base 35 k
libXmu i386 1.0.2-5 base 62 k
libXt i386 1.0.2-3.2.el5 base 173 k
libaio i386 0.3.106-5 base 19 k
mysql-libs i386 5.5.25-7.el5.art atomic 1.1 M
mysqlclient15 i386 5.0.90-2.el5.art atomic 1.4 M
t1lib i386 5.1.2-2.el5.art atomic 194 k
 
Transaction Summary
================================================================================
Install 18 Package(s)
Upgrade 5 Package(s)
 
Total download size: 34 M
Is this ok [y/N]: y
Downloading Packages:
(1/23): libaio-0.3.106-5.i386.rpm | 19 kB 00:00
(2/23): libSM-1.0.1-3.1.i386.rpm | 27 kB 00:00
(3/23): libXext-1.0.1-2.1.i386.rpm | 35 kB 00:00
(4/23): php-bcmath-5.3.14-6.el5.art.i386.rpm | 40 kB 00:00
(5/23): libICE-1.0.1-2.1.i386.rpm | 54 kB 00:00
(6/23): libXmu-1.0.2-5.i386.rpm | 62 kB 00:00
(7/23): php-xmlrpc-5.3.14-6.el5.art.i386.rpm | 86 kB 00:00
(8/23): php-mysql-5.3.14-6.el5.art.i386.rpm | 89 kB 00:00
(9/23): php-pdo-5.3.14-6.el5.art.i386.rpm | 116 kB 00:01
(10/23): libsepol-2.0.36-1.el5.art.i386.rpm | 129 kB 00:01
(11/23): libXt-1.0.2-3.2.el5.i386.rpm | 173 kB 00:00
(12/23): t1lib-5.1.2-2.el5.art.i386.rpm | 194 kB 00:01
(13/23): php-gd-5.3.14-6.el5.art.i386.rpm | 205 kB 00:01
(14/23): php-xml-5.3.14-6.el5.art.i386.rpm | 210 kB 00:01
(15/23): php-soap-5.3.14-6.el5.art.i386.rpm | 279 kB 00:02
(16/23): libXaw-1.0.2-8.1.i386.rpm | 324 kB 00:00
(17/23): sqlite-3.7.0.1-1.el5.art.i386.rpm | 325 kB 00:02
(18/23): mysql-libs-5.5.25-7.el5.art.i386.rpm | 1.1 MB 00:09
(19/23): mysqlclient15-5.0.90-2.el5.art.i386.rpm | 1.4 MB 00:11
(20/23): php-mbstring-5.3.14-6.el5.art.i386.rpm | 2.3 MB 00:18
(21/23): nmap-5.51-1.el5.art.i386.rpm | 3.3 MB 00:28
(22/23): mysql-5.5.25-7.el5.art.i386.rpm | 7.5 MB 01:18
(23/23): mysql-server-5.5.25-7.el5.art.i386.rpm | 16 MB 02:28
--------------------------------------------------------------------------------
Total 111 kB/s | 34 MB 05:16
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : mysql-libs 1/36
Updating : sqlite 2/36
Installing : mysqlclient15 3/36
Installing : libXext 4/36
Installing : libICE 5/36
Installing : libSM 6/36
Installing : libXt 7/36
Installing : libXmu 8/36
Installing : libXaw 9/36
Installing : t1lib 10/36
Installing : php-pdo 11/36
Updating : mysql 12/36
Installing : libaio 13/36
Installing : php-xmlrpc 14/36
Updating : nmap 15/36
Installing : php-bcmath 16/36
Updating : mysql-server 17/36
Installing : php-soap 18/36
Installing : php-mysql 19/36
Installing : php-xml 20/36
Installing : php-gd 21/36
Updating : libsepol 22/36
Installing : php-mbstring 23/36
Erasing : php53-xmlrpc 24/36
Cleanup : nmap 25/36
Erasing : php53-bcmath 26/36
Erasing : php53-pdo 27/36
Cleanup : mysql-server 28/36
Erasing : php53-soap 29/36
Erasing : php53-mysql 30/36
Cleanup : sqlite 31/36
Erasing : php53-xml 32/36
Erasing : php53-gd 33/36
Cleanup : libsepol 34/36
Erasing : php53-mbstring 35/36
Cleanup : mysql 36/36
 
Installed:
php-bcmath.i386 0:5.3.14-6.el5.art php-gd.i386 0:5.3.14-6.el5.art
php-mbstring.i386 0:5.3.14-6.el5.art php-mysql.i386 0:5.3.14-6.el5.art
php-pdo.i386 0:5.3.14-6.el5.art php-soap.i386 0:5.3.14-6.el5.art
php-xml.i386 0:5.3.14-6.el5.art php-xmlrpc.i386 0:5.3.14-6.el5.art
 
Dependency Installed:
libICE.i386 0:1.0.1-2.1 libSM.i386 0:1.0.1-3.1
libXaw.i386 0:1.0.2-8.1 libXext.i386 0:1.0.1-2.1
libXmu.i386 0:1.0.2-5 libXt.i386 0:1.0.2-3.2.el5
libaio.i386 0:0.3.106-5 mysql-libs.i386 0:5.5.25-7.el5.art
mysqlclient15.i386 0:5.0.90-2.el5.art t1lib.i386 0:5.1.2-2.el5.art
 
Updated:
libsepol.i386 0:2.0.36-1.el5.art mysql.i386 0:5.5.25-7.el5.art
mysql-server.i386 0:5.5.25-7.el5.art nmap.i386 2:5.51-1.el5.art
sqlite.i386 0:3.7.0.1-1.el5.art
 
Replaced:
php53-bcmath.i386 0:5.3.3-13.el5_8 php53-gd.i386 0:5.3.3-13.el5_8
php53-mbstring.i386 0:5.3.3-13.el5_8 php53-mysql.i386 0:5.3.3-13.el5_8
php53-pdo.i386 0:5.3.3-13.el5_8 php53-soap.i386 0:5.3.3-13.el5_8
php53-xml.i386 0:5.3.3-13.el5_8 php53-xmlrpc.i386 0:5.3.3-13.el5_8
 
Complete!
[root@remotehelp tmp]#

ВНИМАНИЕ! Выше мы видим, что у нас обновляется mysql сервер и mysql клиент, а также устанавливаются дополнительные библиотеки. Будьте готовы к тому, что обновление mysql может вызвать ошибку #2000 и отказ в доступе к mysql БД по валидным логинам и паролям из-за использования более стойкой состемы шифрования (16, 41 символьные пароли)!!!

Пробуем запустить веб сервер Apache и упираемся в следующие грабли:

[root@remotehelp tmp]# service httpd start
Starting httpd: WARNING: MaxClients (10) must be at least as large
 as ThreadsPerChild (25). Automatically
 increasing MaxClients to 25.
                                                           [  OK  ]

Здась нам глаголется про неверные настройки MaxClients и ThreadsPerChild которое будет автоматически увеличено до 25. Но, грабли то мы проскочили, значение ThreadsPerChild автоматически увеличено до 25, а РНР всё равно полноценно не обрабатывается, работает только ХТМЛ!;(

Читая less /var/www/httpd/error_log мы напарываемся ещё на одни грабли:

[Sun Jul 08 21:08:57 2012] [error] [client 94.27.108.128] PHP Fatal error: Call \
    to undefined function mysql_connect() in \
    /usr/local/ispconfig/interface/lib/classes/db_mysql.inc.php 
    on line 76

Отобразив информацию phpinfo()мы обнаружим, что расширенияmysqlиmysqliне подключены, хотя РНР и скомпилирован с их поддержкой.

При использовании prefork MPM файлы конфигурации РНР читаются из /etc/php.d/, а при переходе на worker MPM файлы конфигурации РНР читаются из /etc/php-zts.d/ соответственно каталоги РНР модулей у них тоже разные, для php.d это /usr/lib/php/modules/, а для php-zts.d это /usr/lib/php-zts/modules/ соответственно.

На этом этапе перевода Apache с prefork MPM на worker MPM в VPS CentOS 5 требуются некоторые дополнительные манипуляции с РНР модулями:

 

Наконец то Apache в режиме worker MPMсовместно с РНР MySQL заработал надлежащим образом, но при старте мы продолжаем получать "Starting httpd: WARNING: MaxClients (10) must be..." которое связано с неверными значениями MaxClients и ThreadsPerChild в файле конфигурации /etc/httpd/conf.d/swtune.conf, из которого Apache worker MPM читает настройки, а поэтому получаем предупреждение:

Starting httpd: WARNING: MaxClients (10) must be at least as large
 as ThreadsPerChild (25). Automatically
 increasing MaxClients to 25.

Править секцию настроек в /etc/httpd/conf/httpd.conf отвечающую за режим работы Apache worker MPM не имеет смысла, потому как Apache работающий в режиме worker MPM читает конфигурацию из /etc/httpd/conf.d/swtune.conf!!!

После успешного старта Apache в режиме worker MPM вместо процеса httpd мы должны будем наблюдать процес httpd.worker

Назначение параметров Apache prefork MPM и worker MPM

Перед началом конфигурации параметров prefork MPM и worker MPM модулей для apache рассмотрим их смысловое назначение.

  • StartServers N — определяет число (N) процессов стартующих при запуске apache.
  • ServerLimit N — это мутный параметр и согласно документации apache (http://www.apache.com/docs/httpd-docs-2.2.13.en/mod/mpm_common.html#serverlimit) ServerLimit в сочетании с ThreadLimit устанавливает максимальное значение для жизни процесса Apache из MaxClients. Если ServerLimit установлен в значение намного выше, чем это необходимо, дополнительные, неиспользованная память будет выделена. Если значение ServerLimit и MaxClients установлено выше, чем система может выдержать, Apache может не запуститься или система может стать нестабильной. Обычно значение ServerLimit и MaxClients устанавливаются равными друг-другу. С MPM Prefork, используйте эту директиву, только если вам нужно установить MaxClients выше, чем 256 (по умолчанию). Не устанавливайте значение этой директивы выше, чем значение в MaxClients. С Apache-MPM worker используйте эту директиву только если значения MaxClients и ThreadsPerChild установлены больше чем 16 процессов сервера (по умолчанию). Не устанавливайте значение этой директивы выше, чем количество серверных процессов, что установлены для MaxClients и ThreadsPerChild - вероятно имеется ввиду не превышать суммарное значение директив MaxClients и ThreadsPerChild.
    ВНИМАНИЕ!!! В стандартной компиляции веб сервера Апаче существует жесткое ограничение ServerLimit 20000 (для Prefork MPM 200000).
  • MinSpareServers N — определяет минимальное число (N) свободных процессов, т.е. тех которые ничем не заняты, при их уменьшении по мере занятости, apache будет создавать новые резервные процессы, чтобы не снизить скорость выполнении скриптов имея в запасе свободные ресурсы.
  • MaxSpareServers N — определяет макисмальное число (N) процессов, высящих без дела, при превышении этого числа процессы будут уничтожатся. Выставление этого параметра очень сильно зависит от характера скриптов, и загруженности в целом сервера. Если число поступающих к вам запросов превышает число серверов в пуле, заданное параметром StartServers, буфер серверов увеличивается для обслуживания запросов. Эти дополнительные процессы-серверы не завершаются после обработки запроса, ради которого они были запущены; они остаются в памяти. Директива MaxSpareServers позволяет настраивать число свободных серверов, находящихся в пуле. Если их больше, чем указано в директиве MaxSpareServers, то лишние процессы завершаются. Аналогично, если свободных серверов в пуле меньше, чем допускает директива MinSpareServers, то в преддверии наплыва запросов создаются дополнительные копии сервера.
  • MaxClients N — определяет максимальное число (N) запускаемых в единицу времени процессов, фактически определяет сколько клиентов смогут одновременно подключиться к веб серверу. Слишком большое значение подвергает веб сервер опасности быть атакованным и сваленным в своп, а также грозит полным отказом в обслуживании.
  • MaxRequestsPerChild N — значение (N) определяет максимальное количество обрабатываемых одним потоком запросов, после выполнения количества которых процесс будет заколбашен. Очень нужный параметр! Рекомендуется устанавливать значение этого параметра до 4000. При утечке оперативной памяти в скриптах, апаче будет освобождать ее после 4К выполненных этим процессом запросов.
  • ThreadsPerChild N - значение этого параметра определяет количество потоков создаваемых каждым порождённым процессом. При использовании MPM как mpm_winnt, где есть только один дочерний процесс, это число должно быть достаточно высоким, чтобы обрабатывать всю нагрузку на сервер. При использовании MPM как Apache-MPM worker, где есть несколько дочерних процессов, общее количество потоков также должно быть достаточно высоким, чтобы справиться с большой нагрузкой на сервер. Обычно значение по умолчанию для ThreadsPerChild составляет 64 при использовании с mpm_winnt и 25 при использовании с другими MPM модулями.

Значения параметров Apache prefork MPM и worker MPM следует подбирать сугубо индивидуально для каждого отдельного случая принимая во внимание загруженность сервера, количество оперативной памяти, силу ЦП, жестких дисков и пр..

Настройка режима Apache worker MPM

Править секцию настроек в /etc/httpd/conf/httpd.conf отвечающую за режим работы Apache worker MPM не имеет смысла, а вернее нужно продублировать настройки из swtune.conf в httpd.conf, потому как Apache работающий в режиме worker MPM читает конфигурацию из /etc/httpd/conf.d/swtune.conf подключаемого почти в конце httpd.conf!!!

Зачем нужен /etc/httpd/conf.d/swtune.conf, когда теже директивы прописывать и в /etc/httpd/conf/httpd.conf достоверно не известно, вероятно можно безболезнено удалить или swtune.conf или директивы из httpd.conf?! Предположительно swtune.confиз пакетаvzdummy-apacheи его можно безболезненно отключить, а использовать только директивы из httpd.conf.

Откроем vi /etc/httpd/conf.d/swtune.conf и изменим MaxClients и ThreadsPerChild следующим образом:

[root@remotehelp ~]# vi /etc/httpd/conf.d/swtune.conf
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# 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
# MaxRequestsPerChild: maximum number of requests a server process serves
 
<IfModule worker.c>
ServerLimit 10
StartServers 1
#MaxClients 10
MaxClients 50
MinSpareThreads 1
MaxSpareThreads 3
#ThreadsPerChild 25
ThreadsPerChild 3
MaxRequestsPerChild 4000
</IfModule>
[root@remotehelp ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[root@remotehelp ~]#

ВНИМАНИЕ!!! Значение директивы MaxClients должно быть кратным значению по умолчанию директивы ThreadsPerChild (25 по умолчанию), при этом ThreadsPerChild может принимать любые значения! Т. е. MaxClients должно устанавливаться в 25, 50, 75, 100, 125 и т. д.! Иначе бедете получать предупредительное сообщение с разростанием лог файла!

Starting httpd: WARNING: MaxClients (35) is not an integer multiple
 of ThreadsPerChild (25), lowering MaxClients to 25
 for a maximum of 1 child processes,

Слегка потоптав грабли мы получили полноценно рабочий Apache веб сервер работающий в режиме worker MPM, чем добились снижения потребления оперативной памяти при этом особо не потеряв в быстродействии выдачи веб страниц клиенту:

top - 11:53:09 up 3 min,  1 user,  load average: 0.04, 0.05, 0.01
Tasks:  20 total,   1 running,  19 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.5%us,  1.5%sy,  0.0%ni, 95.5%id,  0.0%wa,  0.0%hi,  0.0%si,  1.5%st
Mem:    131072k total,    62348k used,    68724k free,        0k buffers
Swap:   655360k total,        0k used,   655360k free,    19204k cached
 
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  649 mysql     20   0  325m  31m 4856 S  0.3 24.8   0:00.45 mysqld
    1 root      20   0  2108  668  580 S  0.0  0.5   0:00.06 init
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd/9530
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.00 khelper/9530
   95 root      16  -4  2212  584  364 S  0.0  0.4   0:00.00 udevd
  390 root      20   0  1816  612  520 S  0.0  0.5   0:00.01 syslogd
  402 root      20   0  7192 1028  628 S  0.0  0.8   0:00.00 sshd
  410 root      20   0  2784  864  688 S  0.0  0.7   0:00.00 xinetd
  448 root      20   0  3716 1348 1148 S  0.0  1.0   0:00.04 mysqld_safe
  673 root      20   0 10028 2916 2364 S  0.0  2.2   0:00.10 sshd
  693 root      20   0  3852 1556 1272 S  0.0  1.2   0:00.03 bash
  711 root      20   0  2292 1024  828 R  0.0  0.8   0:00.12 top
  716 root      20   0  9264 1672  668 S  0.0  1.3   0:00.00 sendmail
  724 smmsp     20   0  8976 1488  608 S  0.0  1.1   0:00.00 sendmail
  735 root      20   0 30508 9712 5496 S  0.0  7.4   0:00.18 httpd.worker
  737 root      20   0  4736 2828 1624 S  0.0  2.2   0:00.03 vlogger
  744 root      20   0  4448 1112  564 S  0.0  0.8   0:00.00 crond
  752 root      20   0  5636  716  436 S  0.0  0.5   0:00.00 saslauthd
  753 root      20   0  5636  432  152 S  0.0  0.3   0:00.00 saslauthd
  759 apache    20   0 81776 5780 1536 S  0.0  4.4   0:00.00 httpd.worker

Значения утилиты top предоставлены после перезагрузки VPS CentOS 5 и как видим у нас висит два процесса httpd.worker с общим потреблением оперативной памяти 11.8 %.

В боевых/рабочих условиях сервера VPS CentOS 5 (Apache 2.2 + PHP 5.3 + MySQL 5.5) процессы httpd.worker потребляют до 30-40 МВ вместо 70-100 МВ и более, что можно считать вполне приемлемым.

top - 12:02:31 up 13 min,  1 user,  load average: 0.26, 0.13, 0.04
Tasks:  20 total,   1 running,  19 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  1.5%sy,  0.0%ni, 97.0%id,  0.0%wa,  0.0%hi,  0.0%si,  1.5%st
Mem:    131072k total,    85920k used,    45152k free,        0k buffers
Swap:   655360k total,        0k used,   655360k free,    24460k cached
 
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  649 mysql     20   0  327m  34m 5684 S  0.3 26.7   0:01.67 mysqld
    1 root      20   0  2108  668  580 S  0.0  0.5   0:00.07 init
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd/9530
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.00 khelper/9530
   95 root      16  -4  2212  584  364 S  0.0  0.4   0:00.00 udevd
  390 root      20   0  1816  612  520 S  0.0  0.5   0:00.01 syslogd
  402 root      20   0  7192 1028  628 S  0.0  0.8   0:00.00 sshd
  410 root      20   0  2784  864  688 S  0.0  0.7   0:00.00 xinetd
  448 root      20   0  3716 1348 1148 S  0.0  1.0   0:00.04 mysqld_safe
  673 root      20   0 10028 2916 2364 S  0.0  2.2   0:00.21 sshd
  693 root      20   0  3852 1556 1272 S  0.0  1.2   0:00.03 bash
  711 root      20   0  2292 1028  832 R  0.0  0.8   0:00.62 top
  716 root      20   0  9264 1868  792 S  0.0  1.4   0:00.01 sendmail
  724 smmsp     20   0  8976 1488  608 S  0.0  1.1   0:00.00 sendmail
  735 root      20   0 30508 9712 5496 S  0.0  7.4   0:00.20 httpd.worker
  737 root      20   0  4736 2848 1636 S  0.0  2.2   0:00.05 vlogger
  744 root      20   0  4448 1116  568 S  0.0  0.9   0:00.00 crond
  752 root      20   0  5636  716  436 S  0.0  0.5   0:00.00 saslauthd
  753 root      20   0  5636  432  152 S  0.0  0.3   0:00.00 saslauthd
  759 apache    20   0 99184  23m 5064 S  0.0 18.5   0:05.08 httpd.worker

Переведя Apache с режима prefork MPM в режим worker MPM под VPS CentOS 5 мы отвоевали минимум от 30-40 МВ и более оперативной памяти, чем обеспечили относительно стабильную работу нашему серверу и постоянных доступ клиентов к нему.

Если кому придет в голову дополнительно использовать РНР кэширование (Alternative PHP Cache (АРС), eAccelerator, PhpExpress, XCache), то скажу сразу, что если памяти менее 256, зависит от количества сайтов, то не имеет особого смысла выделять дополнительные ресурсы, которые мы сэкономили на переходе с prefork MPM на worker MPM, под РНР кэширование - это во-первых, а во-вторых РНР кэширование (Alternative PHP Cache (АРС), eAccelerator, PhpExpress, XCache) может некорректно работать или не работать вовсе в режиме worker MPM!

Также возможны проблемы с РНР кэшированием при использовании suPHP:

There is also a difference on whether you are running PHP as FCGI, CGI, DSO, or suPHP. If you are using suPHP then you will not be able to run eAccelerator, APC, or memcached correctly. I have been told that the best combination for using PHP opcode caching is to use MPM Event and FCGI.

Автор: Олег Головский


Об авторе
Иван Шаман
Меня нет ни в Инстаграмме ни в Фейсбуке, я просто хожу по улицам и рассказываю первым встречным: сколько зарабатываю; с кем дружу; где живу и чем дышу. У меня даже появилось несколько подписчиков: ПСИХоЛОХ и участковый полицай!
Ещё статьи автора
Комментарии в блоге
Новое на форуме