За последние пару дней мой веб-сайт работал очень медленно, а выполнение запросов требовало много времени. На этой неделе загрузка моего процессора достигала 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. Будем очень признательны за любые предложения, которые могут помочь мне понять, как это исправить.
Удаление неиспользуемых модулей иногда имеет противоположный эффект, поскольку сервер, например, не может эффективно кэшировать, но если предположить, что это не проблема, я думаю, что может возникнуть другая проблема, заключающаяся в том, что у вас может быть мало памяти и, следовательно, так называемый происходит "перегрузка диска" (высокий уровень ввода-вывода), это очень возможно, особенно на виртуальном хосте. Сосед на том же виртуальном хосте мог бы открыть новый сайт, который занимает большую часть памяти, оставляя вам меньше. Также просмотрите данные аналитики, чтобы узнать, почему внезапный всплеск трафика и откуда он исходит.