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.