O Apache está usando 100% de CPU, mesmo com um usuário
O Apache (ou devo dizer PHP através do Apache?) está usando 100% de CPU por alguns segundos toda vez que alguém pesquisa bugs no nosso bug tracker ou apenas recarrega a página de resultados da pesquisa ou simplesmente ordena os resultados.
Isso causa um carregamento de página muito lento. Isso ocorre mesmo se eu acessar nosso rastreador de bugs da própria máquina do servidor.
A minha pergunta é o que parece ser o gargalo aqui (configuração do apache, configuração do php, mysql config, cache, módulos php ou outra coisa?) e o que devo tentar fazer para corrigir isso?
Software que estamos usando (baixado alguns meses atrás e não atualizado após isso):
Kubuntu: 14.04.3 LTS
PHP: 5.5.9 (Eu acho que rodando como mod apache? CGI? Não parece ser fastCGI)
apache2 : 2.4.7 (PREFORK)
mysql: 5.5.44
O Bug Genie (software de acompanhamento de bugs): 4.1.0
Aqui está a imagem do Firebug.
"POSTpaginado" é o mais pesado, leva 1s para receber 4.0M mas tem que esperar 7s antes de poder receber.
Aqui está uma imagem do cabeçalho de "POST paginado".
Equantoaoservidor,estáfazendoassim.
Aprimeiraondaéquandoprocuroeexibocercade250edições(“POSTpaginado”)easegundaéquandofaçoumapequenaaçãocomoiraumapáginadeproblema.VocêpodeverqueatémesmopequenasaçõesexigemmuitoCPU.
Eu não sei porque tanta memória é usada (1.6G de 2.0G), mesmo se eu não acessar o bug tracker, mas de qualquer forma a memória livre parece ser suficiente.
NãoparecehaverproblemasdeE/S("% iowait" é baixo e "await" pode ser maior que "svctm" às vezes, mas apenas algumas vezes)
Enãoparecequehajamuitatrocaporaí.
Aquiestãoasnossasconfigurações(apartequepodeinteressaraomeupalpite).
Apache2.conf(nãousandohttpd.conf)
ServerNamelocalhostTimeout300KeepAliveOnMaxKeepAliveRequests100KeepAliveTimeout5HostnameLookupsOff<Directory/var/www/html/bugs2/>OptionsIndexesMultiViewsAllowOverrideAllOrderallow,denyAllowfromall</Directory>AccessFileName.htaccess
Aalteraçãodonomedoservidorpara127.0.0.1nãoajudou.
Eutambémtentoadicionarotextoabaixoaoapache.conf,masissonãomudarianada.Euachoqueéporquejáexisteompm_prefork.confqueébempróximo(apenasoMaxRequestWorkersé150).
<IfModulempm_prefork_module>StartServers5MinSpareServers5MaxSpareServers10MaxClients20MaxRequestsPerChild0</IfModule>
.htaccess
<IfModulemod_php5.c>php_flagmagic_quotes_gpcoffphp_flagregister_globalsoff</IfModule>Options+FollowSymlinks<IfModulemod_rewrite.c>RewriteEngineOnRewriteBase/bugs2/public/RewriteCond%{REQUEST_FILENAME}-s[OR]RewriteCond%{REQUEST_FILENAME}-l[OR]RewriteCond%{REQUEST_FILENAME}-dRewriteRule^.*$-[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]RedirectMatch403^/\.svn(/|$)</IfModule>
Háalgunsdiascoloqueiabaixomod_expires,mod_headers,mod_deflate,mod_gzipem.htaccess,masnãoconseguivernenhumadiferençanousodaCPUounavelocidadedecarregamentoantes/depois.
<IfModulemod_expires.c>ExpiresActiveonExpiresDefault"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>
Eu também tentei usar o filesMatch em vez do ExpiresByType na parte do mod_expires e não ajudou muito.
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
Pela maneira que eu posso ver outros limites de memória quando executar phpinfo ()
Masprovavelmenteissonãoimporta.
my.cnf
bind-address=localhostskip-external-lockingskip-name-resolvekey_buffer=16Mmax_allowed_packet=16Mthread_stack=192Kthread_cache_size=8myisam-recover=BACKUPquery_cache_limit=1Mquery_cache_size=16M
Mudarobind-addresspara127.0.0.1nãoajudou.
MódulosPhpinstalados
BcmathBz2CalendarCoreCtypeCurlDateDbaDomEregExifFileinfoFilterftpgdgettexthashiconvjsonlibxmlmbstringmhashmysqlmysqliopensslpcntlpcrePDOPdo_mysqlPharPosixReadlineReflectionSessionShmopSimpleXMLSoapSocketsSPLStandardSysvmsgSysvsemSysvshmTokenizerWddxXmlXmlreaderXmlwriterZendOPcacheZipZlib
Euaprendiqueàsvezesmódulosphppodemcausaressetipodecoisa,maseunãotenteipará-losumporumainda.Alémdisso,nãotenhomuitacerteza,masparecequeoOPcacheestáfuncionando.
Módulos do Apache instalados
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)
Os registros de acesso e de erros não mostram nada de especial ou suspeito.
Tags php linux apache-2.4 cpu-usage mysql5.5