Для статьи в новостной газете я тестирую 5 различных веб-серверов (Apache2, Cherokee, Lighttpd, Monkey и Nginx).
Проведенные тесты состоят из измерения времени выполнения, а также различных параметров, таких как количество запросов, обслуживаемых в секунду, объем оперативной памяти, используемый ЦП, во время растущей нагрузки одновременных клиентов (от 1 до 1.000 с шагом 10 ) каждый клиент отправляет 1.000.000 запросов небольшого фиксированного файла, затем фиксированного файла среднего размера, затем небольшого динамического содержимого (hello.php) и, наконец, сложного динамического содержимого (расчет возмещения ссуды).
Все веб-серверы способны выдержать такую нагрузку (до 1.000 клиентов), но Apache2 всегда перестает отвечать, когда тест достигает 450-500 одновременных клиентов.
Моя конфигурация:
Моя конфигурация Apache2 выглядит следующим образом:
/etc/apache2/apache2.conf
LockFile ${APACHE_LOCK_DIR}/accept.lock
PidFile ${APACHE_PID_FILE}
Timeout 30
KeepAlive On
MaxKeepAliveRequests 1000000
KeepAliveTimeout 2
ServerName "fnux.net"
<IfModule mpm_prefork_module>
StartServers 16
MinSpareServers 16
MaxSpareServers 16
ServerLimit 2048
MaxClients 1024
MaxRequestsPerChild 0
</IfModule>
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
AccessFileName .htaccess
<Files ~ "^\.ht">
Order allow,deny
Deny from all
Satisfy all
</Files>
DefaultType None
HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel emerg
Include mods-enabled/*.load
Include mods-enabled/*.conf
Include httpd.conf
Include ports.conf
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
Include conf.d/
Include sites-enabled/
/etc/apache2/ports.conf
NameVirtualHost *:8180
Listen 8180
<IfModule mod_ssl.c>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
/ и т.д. / apache2 / доступные моды
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi .php
Action php5-fcgi /cgi-bin/php5.external
<Location "/cgi-bin/php5.external">
Order Deny,Allow
Deny from All
Allow from env=REDIRECT_STATUS
</Location>
</IfModule>
/ и т.д. / apache2 / сайты-доступные / по умолчанию
<VirtualHost *:8180>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/apache2
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel emerg
##### CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi .php
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization
</IfModule>
</VirtualHost>
/etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
Итак, я был бы очень признателен за ваш совет по настройке Apache2, чтобы он мог поддерживать 1.000 одновременных клиентов, если это вообще возможно.
TIA за вашу помощь. Ура.
@Laszlo Valco: Я согласен с вашей точкой зрения на 100 из 100, и именно поэтому я пришел сюда, чтобы попросить совета и помочь настроить Apache2, чтобы он мог выдерживать такую нагрузку.
Теперь мне удобно делать это для всех других веб-серверов, но я признаю, что я тупой и полностью игнорирую настройки Apache2.
Кстати, текущая конфигурация Apache2, указанная выше, не является конфигурацией по умолчанию, но я еще раз согласен, что она не отвечает необходимости поддерживать мои тесты.
Итак, не могли бы вы объяснить, как установить числа, влияющие на рабочие процессы, таким образом, чтобы были доступны 1.000 дочерних процессов?
Я предполагаю, что это находится в разделе «IfModule mpm_prefork_module» файла «/etc/apache2/apache2.conf», но я не знаю, как установить правильные значения в соответствии с обоими возможностями моего оборудования (особенно объемом оперативной памяти, равным 32 Гб) и моя потребность достичь 1.000 одновременно подключенных клиентов.
Буду искренне признателен за ваш опыт, который поможет мне использовать правильные значения, поскольку даже после долгих поисков я не смог найти четких объяснений, как это сделать.
TIA для получения дополнительной информации.
Ура.
При использовании резьбового worker
MPM, это зависит только от того, сколько ресурсов у вас доступно (ЦП и память); apache с радостью выполнит 1000 одновременных потоков, если у вас есть, скажем, 4 ГБ.
mod_prefork устарел, и его следует избегать для любых серьезных приложений.
Я не слишком уверен, что ваш тест будет очень полезен, когда он будет выполняться с такими конфигурациями. Мне кажется бессмысленным проводить какой-либо тест производительности с конфигурациями по умолчанию (или аналогичными). Если кого-то вообще интересует производительность, обязательно откорректируйте конфигурацию, отключив все функции, снижающие производительность, которые не являются абсолютно необходимыми. Тогда зачем этому кому-то интересен тест, не показывающий реальную мощность этих серверов, а вместо этого показывающий, какая конфигурация по умолчанию считается полезной?
Итак, если идея состоит в том, чтобы провести надлежащий тест производительности, вам следует составить реальный список функциональных требований и провести некоторое исследование того, как настроить эти части программного обеспечения для выполнения функциональных требований и максимальной производительности. Например, конфигурация Apache по умолчанию, как известно, не способствует повышению производительности.
И чтобы помочь вам с конфигурацией Apache: установите числа, влияющие на рабочие процессы, таким образом, чтобы дочерний процесс 1000 был всегда доступен.
Попробуйте эти настройки для предварительного форка MPM:
StartServers 1024
MinSpareServers 128
MaxSpareServers 1024
ServerLimit 2048
MaxClients 2048
MaxRequestsPerChild 0
или эти для работника MPM:
ServerLimit 64
StartServers 32
MaxClients 2048
MinSpareThreads 128
MaxSpareThreads 1024
ThreadsPerChild 32
Также обратите внимание, что <IfModule mpm_prefork_module>
строка исключает этот раздел, если вы не используете этот модуль MPM или не измените имя модуля в этой строке.