Я настраиваю свою домашнюю страницу для повышения производительности, в настоящее время она обрабатывает около 200 запросов в секунду на 3.14.by, который потребляет 6 SQL-запросов, и 20 запросов в секунду на 3.14.by/forum, который является форумом phpBB.
Как ни странно, на некоторых VPS и выделенном сервере Atom 330 цифры примерно одинаковые.
Серверное программное обеспечение следующее: Apache2 + mod_php prefork 4 childs (пробовал разные числа здесь), php5, APC, nginx, memcached для хранения сессий PHP.
MySQL настроен на использование около 30% доступной оперативной памяти (~ 150 МБ на VPS, 700 МБ на выделенном сервере)
Похоже, где-то есть узкое место, не позволяющее мне подниматься выше, есть предложения? (т.е. я знаю, что выполнение менее 6 SQL-запросов сделает его быстрее, но это не похоже на ограничивающий фактор, поскольку sqld потребляет не более нескольких% сверху из-за кешированных запросов)
Кто-нибудь тестировал, что запускать предварительно сформированный apache2 и оставлять только nginx + php намного быстрее?
Еще несколько тестов
Small 40-byte static file: 1484 r/s via nginx+apache2, 2452 if we talk to apache2 directly.
Small "Hello world" php script: 458 r/s via ngin+apache2.
Обновить: Похоже, узким местом является производительность MySQL на кэшированных данных. Страница с одним SQL показывает 354 запросов / сек, с 6 SQL - 180 запросов / сек. Как вы думаете, что я могу здесь настроить? (Могу раскошелиться на MySQL 100-200Мб)
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
default-character-set=cp1251
collation-server=cp1251_general_cs
skip-character-set-client-handshake
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
skip-external-locking
bind-address = 127.0.0.1
key_buffer = 16M
max_allowed_packet = 8M
thread_stack = 64K
thread_cache_size = 16
sort_buffer_size = 8M
read_buffer_size = 1M
myisam-recover = BACKUP
max_connections = 650
table_cache = 256
thread_concurrency = 10
query_cache_limit = 1M
query_cache_size = 16M
expire_logs_days = 10
max_binlog_size = 100M
[mysqldump]
quick
quote-names
max_allowed_packet = 8M
[mysql]
[isamchk]
key_buffer = 8M
!includedir /etc/mysql/conf.d/
Очевидно, вы можете многое попробовать. Лучше всего искать в журналах запросы, которые не используют индексы (включите журналы для них), и другие неоптимизированные запросы. Я составил огромный список опций, связанных с производительностью, за эти годы, поэтому для вашей информации я включил здесь небольшое подмножество - надеюсь, это поможет. Вот несколько общих примечаний о том, что вы можете попробовать (если вы еще этого не сделали):
MySQL
Apache
PHP
Настройки ОС
Поскольку сервер не кажется проблемой, возможно, генератор нагрузки. Попробуйте запустить его на нескольких машинах.
Я бы посмотрел на кеширование с помощью Nginx (memcached) или Лак.
По крайней мере, вы должны серверить статические файлы с помощью Nginx, как сказал SaveTheRbtz.
Если узким местом является не ЦП, то его ввод-вывод - либо сетевой, либо дисковый. Итак .. вам нужно увидеть, сколько операций ввода-вывода происходит. Я бы не подумал, что это сеть (если вы не используете полудуплексный канал со скоростью 10 Мбит / с, но стоит проверить переключатель, если автоматическое обнаружение не выполняет свою работу правильно).
Остается дисковый ввод-вывод, который может быть большим фактором, особенно на VPS. Используйте sar или iostat, чтобы посмотреть на диски, затем погуглите, как найти более подробную информацию, если ваш диск интенсивно используется.
Мне кажется, вы используете максимальное количество подключений, которое позволяет Apache. Взгляните на свою конфигурацию Apache. Увеличение лимита сервера и максимального количества клиентов должно помочь, если вы еще не связаны каким-либо другим лимитом, таким как ввод-вывод или память. Посмотрите на значения, представленные для mpm_prefork_module или mpm_worker_module, и отрегулируйте соответственно своим потребностям.
ServerLimit 512 MaxClients 512
Эта нагрузка создается инструментом или реальными нагрузками?
Вы можете проверить memcached. Я видел проблемы с высокой скоростью соединения, вызывающие задержку в приложении.
Если вы используете генератор нагрузки, что вы получите при открытии небольшой статической страницы?
Во время загрузки вы можете проверить сетевой стек на наличие условий TIME_WAIT. Возможно, вы заполняете очередь на подключение.
Есть еще около 100 причин и пунктов, на которые вы можете взглянуть, но без дополнительной информации я просто выбрасываю догадки.
В 99% случаев подобные проблемы связаны с базой данных. Прежде всего убедитесь, что ваш индекс попадания. Если это не сработает, начните кэшировать все, что можете.
Я рекомендую вам использовать (если возможно) пул подключений, чтобы база данных оставалась подключенной к вашим веб-приложениям (нет необходимости повторно подключаться при каждом запросе). Это может иметь огромное значение для скорости.
Кроме того, попробуйте проанализировать все свои запросы с помощью EXPLAIN (а почему бы не профилировать свои запросы с помощью SHOW PROFILE?).