Недавно я переместил клиентский веб-сайт (используя CMS Concrete5) на VPS с Gentoo, Apache 2.2, PHP5 и MySQL 5, и я заметил, что время отклика Apache довольно низкое (то же самое было и на старом сервере) , иногда до 8-9 секунд, но чаще от 300 мс до 3 секунд (около 300 мс, я не возражаю). Я знаю, что это не задержка в сети, так как у сервера пинг (с моего местоположения) составляет около 30 мс.
Вот пример времени (вы можете видеть, что это быстро после первоначального ожидания):
Я использую APC (хотя Я не уверен, что это работает правильно...) и SuExec. Модули Apache:
core_module (static)
authn_file_module (static)
authn_default_module (static)
authz_host_module (static)
authz_groupfile_module (static)
authz_user_module (static)
authz_default_module (static)
auth_basic_module (static)
include_module (static)
filter_module (static)
deflate_module (static)
log_config_module (static)
env_module (static)
expires_module (static)
headers_module (static)
setenvif_module (static)
version_module (static)
ssl_module (static)
mpm_prefork_module (static)
http_module (static)
mime_module (static)
status_module (static)
autoindex_module (static)
asis_module (static)
info_module (static)
suexec_module (static)
cgi_module (static)
negotiation_module (static)
dir_module (static)
actions_module (static)
userdir_module (static)
alias_module (static)
rewrite_module (static)
so_module (static)
suphp_module (shared)
и модули PHP:
bcmath
calendar
ctype
curl
db
dbase
domxml
exif
ftp
gd
gettext
iconv
imap
mbstring
mcrypt
mime_magic
mysql
openssl
overload
pcre
posix
session
standard
sysvsem
sysvshm
tokenizer
xml
xslt
zlib
У меня включен gzip для всех соответствующих файлов.
Apache работает с использованием prefork, а настройки в httpd.conf следующие:
<IfModule prefork.c>
StartServers 10
MinSpareServers 10
MaxSpareServers 20
MaxClients 250
MaxRequestsPerChild 4000
</IfModule>
HostnameLookups Off
Я заметил, что страницы, которые, как мне кажется, перегружены базами данных, такие как Dashboard CMS, обычно работают медленнее. Я подумал, что это может означать, что MySQL можно оптимизировать. Я также задавался вопросом о модулях Apache - я путаюсь между mod_php5, mod_cgi, mod_fastcgi и т. Д. И т. Д. - во всей сети есть противоречивые советы относительно того, какой из них лучше использовать.
Вот результат MySQLTuner:
-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.44-log
[OK] Operating on 64-bit architecture
-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated -InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 35M (Tables: 161)
[!!] Total fragmented tables: 15
-------- Security Recommendations -------------------------------------------
[OK] All database users have passwords assigned
-------- Performance Metrics -------------------------------------------------
[--] Up for: 3d 21h 44m 16s (293K q [0.868 qps], 1K conn, TX: 135M, RX: 90M)
[--] Reads / Writes: 99% / 1%
[--] Total buffers: 58.0M global + 1.6M per thread (100 max threads)
[!!] Maximum possible memory usage: 219.7M (93% of installed RAM)
[OK] Slow queries: 0% (0/293K)
[OK] Highest usage of available connections: 2% (2/100)
[OK] Key buffer size / total MyISAM indexes: 16.0M/20.9M
[OK] Key buffer hit rate: 99.6% (5M cached / 21K reads)
[!!] Query cache is disabled
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 3K sorts)
[!!] Temporary tables created on disk: 47% (2K on disk / 5K total)
[!!] Thread cache is disabled
[!!] Table cache hit rate: 6% (64 open / 1K opened)
[OK] Open file limit used: 12% (128/1K)
[OK] Table locks acquired immediately: 100% (356K immediate / 356K locks)
-------- Recommendations -----------------------------------------------------
General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
Reduce your overall MySQL memory footprint for system stability
Enable the slow query log to troubleshoot bad queries
When making adjustments, make tmp_table_size/max_heap_table_size equal
Reduce your SELECT DISTINCT queries without LIMIT clauses
Set thread_cache_size to 4 as a starting value
Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
*** MySQL's maximum memory usage is dangerously high ***
*** Add RAM before increasing MySQL buffer variables ***
query_cache_size (>= 8M)
tmp_table_size (> 32M)
max_heap_table_size (> 16M)
thread_cache_size (start at 4)
table_cache (> 64)
Я заметил, что при загрузке страницы с большим объемом базы данных загрузка ЦП выросла до 57% (при использовании top) - для меня это говорит о том, что есть либо плохо оптимизированный материал MySQL, либо кеширование абсолютно необходимо для ускорения этой настройки.
Любая помощь приветствуется!
Вы точно знаете, на что висят рабочие процессы apache? Попробуйте это увидеть:
mkdir /strace; ps auxw | grep httpd | awk '{print"-p " $2}' | xargs strace -o /strace/strace.log -ff -s4096 -r
Загрузите несколько новых (т.е. не кэшированных локально) страниц в свой браузер, нажмите CTRL + C, чтобы остановить strace, затем отсортируйте strace.logs по времени, потраченному на каждый вызов:
for i in `ls /strace/*`; do echo $i; cat $i | cut -c11-17 | sort -rn | head; done
Просмотрите все strace.logs с вызовами более 1,0 секунды и выполните поиск по времени из вывода предыдущей команды. Это укажет вам на точный шаг, на котором они зацикливаются.
Установлен ли у вас брандмауэр типа CSF? Я видел ту же проблему на VPS. При отладке процессов httpd с помощью strace на вызовы gettimeofday уходило до 5 секунд и более. Как ни странно, я сузил это до CSF, который пытался фильтровать интерфейс venet0, интерфейс обратной петли в контейнерах OpenVZ или Virtuozzo. Установка этого параметра в /etc/csf/csf.conf в основном исправила это для меня:
"ETH_DEVICE_SKIP = "venet0,lo"
Я говорю в основном потому, что иногда для установления соединения все еще требуется 500-1000 мс, но это большое улучшение по сравнению с 5000+.
Вот превосходно праймер / пошаговое руководство для устранения проблем такого рода с помощью strace.
Maximum possible memory usage: 219.7M (93% of installed RAM)
Это должно быть коробка VPS начального уровня?
Вы должны разделить сеть, apache, mysql и php как источники задержки.
Если вы можете быстро получить изображение из apache (очень мало времени до первого байта), то сеть и apache обычно в порядке.
Если вы можете вытащить страницу с помощью только оператора phpinfo (), то обычно с PHP все в порядке (может потребоваться несколько настроек).
Если вы напишете простой тест подключения к БД, и он будет быстрым, то этот уровень тоже нормально.
Наконец, потяните страницу приложения. Если он медленный, значит, проблема связана с обработкой приложений. Хотя настройка может помочь, решить эту проблему гораздо сложнее.
Без профилирования приложения найти проблему может быть сложно. Такие инструменты, как NewRelic, могут помочь с этой проблемой, но не являются лекарством.
Есть ли в вашем приложении какая-либо внутренняя отладка, показывающая, на что тратится время?
Я предлагаю добавить измерение времени рендеринга и проверить, сколько времени требуется серверу для рендеринга чистой HTML-страницы. Тогда вы узнаете, находится ли это в CMS или где-то еще. Бьюсь об заклад, мой 2cent это не конфигурация вашего сервера. / Маддин