Ao longo dos últimos dias, o desempenho do meu site foi muito lento, com as consultas demorando muito tempo para serem executadas. Meu uso de CPU atingiu cerca de 100% 4 vezes esta semana. Aqui está a saída de top
em um desses momentos
top - 00:08:03 up 3 days, 21:47, 2 users, load average: 6.06, 1.95, 0.84
Tasks: 92 total, 2 running, 90 sleeping, 0 stopped, 0 zombie
%Cpu(s): 86.1 us, 12.9 sy, 0.0 ni, 0.0 id, 0.0 wa, 1.0 hi, 0.0 si, 0.0 st
KiB Mem: 1017948 total, 773520 used, 244428 free, 107200 buffers
KiB Swap: 0 total, 0 used, 0 free. 257228 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28433 www-data 20 0 854660 69288 5608 S 98.7 6.8 0:47.36 apache2
28469 www-data 20 0 529692 7692 3012 S 0.7 0.8 0:00.13 apache2
28514 root 20 0 24820 1488 1064 R 0.7 0.1 0:00.08 top
25 root 20 0 0 0 0 S 0.3 0.0 1:00.70 kworker/0:1
28518 postgres 20 0 370016 6984 4276 S 0.3 0.7 0:00.01 postgres
1 root 20 0 33384 1288 0 S 0.0 0.1 0:11.70 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.13 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:09.40 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root 20 0 0 0 0 S 0.0 0.0 0:45.06 rcu_sched
8 root 20 0 0 0 0 R 0.0 0.0 1:54.47 rcuos/0
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0
11 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
O Apache parece estar ocupando muito CPU, mas não tenho idéia do porquê. Estava funcionando perfeitamente até alguns dias atrás. Eu otimizei o Apache removendo módulos não utilizados, ajustei-o para ter apenas um pequeno número de crianças sobressalentes em execução, mas isso não parece ter feito a diferença. Eu também instalei mod-evasive
e mod-qos
para proteger contra o DDOS. Aqui está a minha configuração do apache
Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 3
MaxClients 10
MaxRequestsPerChild 3000
</IfModule>
<IfModule mpm_worker_module>
StartServers 1
MinSpareThreads 5
MaxSpareThreads 15
ThreadLimit 25
ThreadsPerChild 5
MaxClients 25
MaxRequestsPerChild 200
</IfModule>
<IfModule mpm_event_module>
StartServers 1
MinSpareThreads 5
MaxSpareThreads 15
ThreadLimit 25
ThreadsPerChild 5
MaxClients 25
MaxRequestsPerChild 200
</IfModule>
<IfModule mod_spamhaus.c>
MS_METHODS POST,PUT,OPTIONS,CONNECT
MS_WhiteList /etc/spamhaus.wl
MS_CacheSize 256
</IfModule>
Aqui está minha configuração do VirtualHost
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com [nocase]
RewriteRule ^(.*) http://www.example.com$1 [last,redirect=301]
ServerName example.com
ServerAlias www.example.com
ServerAdmin [email protected]
WSGIDaemonProcess example python-path=/home/abc/example:/home/abc/example/env/lib/python2.7/site-packages
WSGIProcessGroup example
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias / /home/abc/example/wsgi.py
DocumentRoot /home/abc/example
<Directory />
Require all granted
</Directory>
Alias /static/ /home/abc/example/static/
<Directory /home/abc/example/static>
Order deny,allow
Allow from all
</Directory>
Alias /media/ /home/abc/example/media/
<Directory /home/abc/example/media>
Order deny,allow
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Aqui está o meu arquivo .htaccess
<FilesMatch "\.(ico|svg|woff|eot|ttf)$">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>
<FilesMatch "\.(jpg|png|gif|css|js|json)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>
<IfModule mod_mime.c>
AddType application/javascript js
AddType application/vnd.ms-fontobject eot
AddType application/x-font-ttf ttf ttc
AddType font/opentype otf
AddType application/x-font-woff woff
AddType image/svg+xml svg svgz
AddEncoding gzip svgz
</Ifmodule>
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css application/json
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE text/xml application/xml text/x-component
AddOutputFilterByType DEFLATE application/xhtml+xml application/rss+xml application/atom+xml
AddOutputFilterByType DEFLATE image/x-icon image/svg+xml application/vnd.ms-fontobject application/x-font-ttf font/opentype
</Ifmodule>
Estou usando o memcached para armazenar em cache a maioria das consultas. As páginas da Web com poucas consultas básicas são mais rápidas (embora não tão rápidas quanto antes), enquanto as páginas com consultas complexas demoram muito tempo. O tempo de resposta do servidor para essas páginas aumentou de 0,2 segundos para 4 segundos (medido usando o Google PageSpeed Insights).
Estou usando um banco de dados do PostgreSQL 9.3. A seguir está meu postgresql.conf sintonizado usando o PgTune.
default_statistics_target = 50
maintenance_work_mem = 60MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 704MB
work_mem = 6MB
wal_buffers = 8MB
checkpoint_segments = 16
shared_buffers = 240MB
max_connections = 80
Aqui está o gráfico do uso de CPU, disco e largura de banda no último mês
Embora a largura de banda mostre um aumento na última semana, o tráfego real não aumentou. Estou recebendo uma média de 1.500 visitantes por dia nos últimos 15 a 20 dias. O aumento do uso da largura de banda provavelmente poderia ser um aumento na atividade do bot.
Meu site é um aplicativo Django hospedado no droplet com a configuração - 1GB Ram, 30GB SSD Disk, Ubuntu 14.04 x64. Eu tentei todas as coisas possíveis que eu poderia pensar e não posso para a vida de mim descobrir o que está errado aqui. Eu não sou muito bom em lidar com servidores e a única coisa que posso pensar agora é mudar do Apache para o nginx e do PostgreSQL para o MySQL. Qualquer sugestão que possa me ajudar a descobrir como consertar isso seria muito apreciada.