Назад | Перейти на главную страницу

Apache использует 100% ЦП даже с одним пользователем

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)




Журналы доступа и ошибок не содержат ничего особенного или подозрительного.