Я настраиваю свою домашнюю страницу для повышения производительности, в настоящее время она обрабатывает около 200 запросов в секунду на 3.14.by, который использует 6 запросов SQL, и 20 запросов / секунду на 3.14.by/forum, который является форумом phpBB.
Как ни странно, цифры примерно одинаковы на некоторых VPS и выделенном сервере Atom 330.
Программное обеспечение сервера следующее: Apache2 + mod_php prefork 4 дочерних (здесь пробовали разные числа), php5, APC, nginx, memcached для хранения сессий PHP.
MySQL настроен на потребление около 30% доступной оперативной памяти (~ 150 МБ на VPS, 700 МБ на выделенном сервере)
Похоже, что где-то есть узкое место, не позволяющее мне подняться выше, какие-либо предложения? (то есть я знаю, что выполнение менее 6 SQL-запросов сделает это быстрее, но это не выглядит ограничивающим фактором, так как sqld потребляет не более нескольких% из-за кэшированных запросов)
Кто-нибудь проверял, что пинать preforked 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 req / sec, с 6 SQL - 180 req / sec. Как вы думаете, я могу настроить здесь? (Я могу раскошелиться на 100-200Mb для MySQL)
[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
апаш
PHP
ОС твики
источник
Если узким местом является не процессор, то его IO - либо сеть, либо диск. Итак ... вам нужно посмотреть, сколько IO происходит. Я бы не подумал, что это сеть (если вы не используете полудуплексный канал 10 Мбит / с, но стоит проверить коммутатор на случай, если функция автоопределения не выполняет свою работу правильно).
Это оставляет дисковый ввод-вывод, который может быть важным фактором, особенно на VPS. Используйте sar или iostat, чтобы взглянуть на диски, а затем Google, как найти более подробную информацию, если ваш диск интенсивно используется.
источник
Я хотел бы изучить кеширование с помощью Nginx ( memcached ) или Varnish .
По крайней мере, вы должны сервер статических файлов с Nginx, как сказал SaveTheRbtz.
источник
Поскольку сервер, кажется, не является проблемой, может быть, генератор нагрузки. Попробуйте запустить его на нескольких машинах.
источник
Для меня это звучит так, как будто вы подключаетесь к максимальному количеству соединений, которые пропускает Apache. Посмотрите на вашу конфигурацию Apache. Увеличение лимита сервера и максимальное количество клиентов должно помочь, если вы еще не связаны каким-либо другим ограничением, таким как ввод-вывод или память. Посмотрите на значения, присутствующие для mpm_prefork_module или mpm_worker_module и скорректируйте в соответствии с вашими потребностями.
источник
Эта нагрузка создается инструментом или реальными нагрузками?
Вы можете проверить memcached. Я видел проблемы с высокой скоростью соединения, что приводило к задержке в приложении.
Если вы используете генератор нагрузки, что вы получаете, когда нажимаете на небольшую статическую страницу?
Во время загрузки вы можете проверить сетевой стек на наличие условий TIME_WAIT. Возможно, вы заполняете свою очередь соединения.
Есть еще около 100 причин и пунктов, на которые вы можете посмотреть, но без дополнительной информации, я просто выбрасываю догадки на данный момент.
источник
В 99% случаев подобные проблемы будут отслеживаться в базе данных. Убедитесь, что ваши индексы попадания в первую очередь. Если это не сработает, начните кэшировать все, что можете.
источник
Я рекомендую вам использовать (если это возможно) диспетчер соединений, чтобы база данных была подключена к вашим веб-приложениям (нет необходимости переподключаться при каждом запросе). Это может иметь огромное значение для скорости.
Кроме того, попробуйте проанализировать все ваши запросы с помощью EXPLAIN (и почему бы не профилировать ваши запросы с помощью SHOW PROFILE?).
источник