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

Низкая производительность веб-сайта - высокая загрузка ЦП и диска

За последние пару дней мой веб-сайт работал очень медленно, а выполнение запросов требовало много времени. На этой неделе загрузка моего процессора достигала 100% 4 раза. Вот результат top в одно такое время

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 

Кажется, что Apache занимает много процессора, но я понятия не имею, почему. Пару дней назад он работал отлично. Я оптимизировал Apache, удалив неиспользуемые модули, настроил его так, чтобы работало только небольшое количество запасных детей, но, похоже, это не имело значения. Я также установил mod-evasive и mod-qos для защиты от DDOS. Вот моя конфигурация 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>

Вот моя конфигурация 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 admin@example.com

    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>

Вот мой .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>

Я использую memcached для кеширования большинства запросов. Веб-страницы с несколькими базовыми запросами работают быстрее (хотя и не так быстро, как раньше), тогда как страницы со сложными запросами занимают много времени. Время ответа сервера для таких страниц увеличилось с 0,2 до 4 секунд (измерено с помощью Google PageSpeed ​​Insights).

Я использую базу данных PostgreSQL 9.3. Ниже приведен мой postgresql.conf, настроенный с помощью 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

Вот график использования ЦП, диска и полосы пропускания за последний месяц.

Хотя пропускная способность показывает увеличение за последнюю неделю или около того, но фактический трафик не увеличился. Я получаю в среднем 1500 посетителей в день в течение последних 15-20 дней. Увеличение использования полосы пропускания, вероятно, может быть связано с увеличением активности ботов.

Мой веб-сайт представляет собой приложение Django, размещенное на капле с конфигурацией - 1 ГБ ОЗУ, 30 ГБ SSD-диск, Ubuntu 14.04 x64. Я перепробовал все, что только мог придумать, и не могу понять, что здесь не так. Я не очень хорошо разбираюсь в серверах, и единственное, о чем я могу думать сейчас, - это переключиться с Apache на nginx и с PostgreSQL на MySQL. Будем очень признательны за любые предложения, которые могут помочь мне понять, как это исправить.

Удаление неиспользуемых модулей иногда имеет противоположный эффект, поскольку сервер, например, не может эффективно кэшировать, но если предположить, что это не проблема, я думаю, что может возникнуть другая проблема, заключающаяся в том, что у вас может быть мало памяти и, следовательно, так называемый происходит "перегрузка диска" (высокий уровень ввода-вывода), это очень возможно, особенно на виртуальном хосте. Сосед на том же виртуальном хосте мог бы открыть новый сайт, который занимает большую часть памяти, оставляя вам меньше. Также просмотрите данные аналитики, чтобы узнать, почему внезапный всплеск трафика и откуда он исходит.