Apache использует 100% ЦП даже с одним пользователем
Apache (или я должен сказать, что PHP через Apache?) Использует 100% ЦП на несколько секунд каждый раз, когда кто-то ищет ошибки в нашем трекере ошибок или просто перезагружает страницу результатов поиска или просто сортирует результаты.
Это вызывает очень медленную загрузку страницы. Это происходит, даже если я обращаюсь к нашей системе отслеживания ошибок с самого сервера.
Мой вопрос в том, что здесь является узким местом (конфигурация apache, конфигурация php, конфигурация mysql, кеш, модули php или что-то еще?) И что я должен попытаться сделать, чтобы исправить это?
Программное обеспечение, которое мы используем (загружено несколько месяцев назад и после этого не обновлялось):
Кубунту: 14.04.3 LTS
PHP: 5.5.9 (я думаю, работает как мод apache? CGI? Не похоже на fastCGI)
apache2 : 2.4.7 (ПРЕФОРК)
MySQL, версия 5.5.44
The Bug Genie (программа для отслеживания ошибок): 4.1.0
Вот изображение Firebug.
«POST paginated» - сложный, для получения 4.0M требуется 1 с, но нужно ждать 7 секунд, прежде чем он сможет получить.
Вот изображение заголовка «POST paginated».
А что касается сервера, то это так.
Похоже, что на обработку «разбитого на страницы» запроса требовалось 7-8 секунд.
Первая волна - это когда я ищу и отображаю около 250 вопросов («POST с разбивкой на страницы»), а вторая - когда я совершаю небольшое действие, например, перехожу на страницу с одной проблемой. Вы можете видеть, что даже небольшое действие требует много ресурсов процессора.
Я не знаю, почему используется так много памяти (1,6 ГБ из 2,0 ГБ), даже если у меня нет доступа к системе отслеживания ошибок, но в любом случае свободной памяти кажется достаточно.
Не похоже, что есть проблемы ввода-вывода ("% iowait" низкий, а "await" может быть больше, чем "svctm" иногда, но только иногда)
И, похоже, не так уж много подмены.
Вот наши настройки (часть, которая может иметь значение, на мой взгляд).
Apache2.conf (без httpd.conf)
ServerName localhost
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
HostnameLookups Off
<Directory /var/www/html/bugs2/>
Options Indexes MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
AccessFileName .htaccess
Изменение ServerName на 127.0.0.1 не помогло.
Я также пытаюсь добавить текст ниже в apache.conf, но это ничего не изменит. Я думаю, это потому, что уже есть mpm_prefork.conf, который довольно близок (только MaxRequestWorkers - 150).
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 20
MaxRequestsPerChild 0
</IfModule>
.htaccess
<IfModule mod_php5.c>
php_flag magic_quotes_gpc off
php_flag register_globals off
</IfModule>
Options +FollowSymlinks
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /bugs2/public/
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*)$ index.php?url=$1 [NC,QSA,L]
RewriteCond %{REQUEST_URI} \..+$/
RewriteCond %{REQUEST_URI} !\.(html|wsdl|json|xml)$
RewriteRule .* - [L]
RewriteRule ^(.*)$ index.php?url=$1 [NC,QSA,L]
RedirectMatch 403 ^/\.svn(/|$)
</IfModule>
Несколько дней назад я также поместил ниже mod_expires, mod_headers, mod_deflate, mod_gzip в .htaccess, но я не увидел никакой разницы в использовании ЦП или скорости загрузки до / после.
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 24 hours"
ExpiresByType application/json "access plus 1 months"
ExpiresByType image/jpg "access plus 1 months"
ExpiresByType image/gif "access plus 1 months"
ExpiresByType image/jpeg "access plus 1 months"
ExpiresByType image/png "access plus 1 months"
ExpiresByType text/css "access plus 1 months"
ExpiresByType text/javascript "access plus 1 months"
ExpiresByType application/javascript "access plus 1 months"
ExpiresByType application/x-shockwave-flash "access plus 1 months"
ExpiresByType application/x-javascript "access plus 1 months"
ExpiresByType application/pdf "access plus 1 months"
ExpiresByType image/x-icon "access plus 1 year"
</IfModule>
<ifModule mod_headers.c>
<filesMatch "\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=2592000, public, no-transform"
</filesMatch>
<filesMatch "\\.(css)$">
Header set Cache-Control "max-age=604800, public"
</filesMatch>
<filesMatch "\\.(js)$">
Header set Cache-Control "max-age=216000, private"
</filesMatch>
<filesMatch "\\.(xml|txt)$">
Header set Cache-Control "max-age=216000, public, must-revalidate"
</filesMatch>
<filesMatch "\\.(html|htm|php)$">
Header set Cache-Control "max-age=1, private, must-revalidate"
</filesMatch>
Header unset ETag
Header unset Last-Modified
</ifModule>
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI _\.utxt$ no-gzip
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE application/json
</IfModule>
<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl|json)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>
Я также пробовал использовать filesMatch вместо ExpiresByType в части mod_expires, и это тоже не помогло.
Php.ini
engine = On
output_buffering = 4096
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
disable_classes =
zend.enable_gc = On
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
Кстати, я вижу другие ограничения памяти при запуске phpinfo ()
Но, наверное, не беда.
my.cnf
bind-address = localhost
skip-external-locking
skip-name-resolve
key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
myisam-recover = BACKUP
query_cache_limit = 1M
query_cache_size = 16M
Переключение адреса привязки на 127.0.0.1 не помогло.
Установленные модули php
Bcmath
Bz2
Calendar
Core
Ctype
Curl
Date
Dba
Dom
Ereg
Exif
Fileinfo
Filter
ftp
gd
gettext
hash
iconv
json
libxml
mbstring
mhash
mysql
mysqli
openssl
pcntl
pcre
PDO
Pdo_mysql
Phar
Posix
Readline
Reflection
Session
Shmop
SimpleXML
Soap
Sockets
SPL
Standard
Sysvmsg
Sysvsem
Sysvshm
Tokenizer
Wddx
Xml
Xmlreader
Xmlwriter
Zend OPcache
Zip
Zlib
Я узнал, что иногда модули php могут вызывать подобные вещи, но я еще не пытался останавливать их по одному. Кроме того, я не очень уверен, но похоже, что OPcache работает.
Установлены модули Apache
Core_module (static)
So_module (static)
watchdog_module (static)
http_module (static)
log_config_module (static)
version_module (static)
unixd_module (static)
access_compat_module (shared)
alias_module (shared)
auth_basic_module (shared)
authn_core_module (shared)
authn_file_module (shared)
authz_core_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
filter_module (shared)
mime_module (shared)
mpm_prefork_module (shared)
negotiation_module (shared)
php5_module (shared)
rewrite_module (shared)
setenvif_module (shared)
status_module (shared)
Журналы доступа и ошибок не содержат ничего особенного или подозрительного.