Desempenho do site lento - Alto uso de CPU e disco

1

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.

    
por Yin Yang 18.11.2014 / 20:26

1 resposta

0

Remover módulos não utilizados às vezes tem o efeito oposto, pois o servidor não pode armazenar em cache efetivamente, por exemplo, mas supondo que esse não seja o problema, o outro problema que talvez esteja acontecendo é que você pode estar com pouca memória e o chamado "disk thrashing" (alto IO) ocorre, isso é muito possível especialmente em um host virtual. Um vizinho no mesmo host virtual pode ter liberado um novo site, que ocupa uma fatia maior da memória, deixando-o com menos. Além disso, observe os dados de análise para descobrir por que o pico repentino no tráfego e de onde ele vem.

    
por 19.11.2014 / 12:09