Настройка параметров MySQL для обработки большой нагрузки пользователей
Я разработал PHP-игру, которая, очевидно, зависит от запросов MySQL. Я запускаю его на огромном сервере: Intel Xeon 7550 с 32 ГБ ОЗУ (Redhat x86_64 ES 5.0) с установленной cPanel. Я выпустил игру на Facebook, и только 250 пользователей могли использовать ее, пока процессор не заработал.
Я включил "top" и следил за загрузкой процессора. MySQL был когда-то использовать до 1600%! Все остальное было около 3%. Очевидно, мне нужно настроить параметры для MySQL, чтобы выпустить это в большем масштабе.
Извиняюсь, если этот вопрос неопределенный. Мои знания по настройке сервера MySQL очень ограничены. Какие настройки мне нужно настроить? И что я должен установить их? Я предполагаю, что память является одним из них? Я предсказываю, что база пользователей будет состоять из 10000 сеансов одновременно. С моими текущими настройками у меня может быть только 250. Любые рекомендации от опытных администраторов сервера будут очень благодарны.
4 ответа
Проблемы, которые я предвижу..
1.) Mysql использует много памяти для сотен / тысяч соединений по замыслу.
В основном вам нужно настроить конфигурацию, чтобы помочь минимизировать использование памяти
Я не думаю, что это проблема с памятью
С базой данных 200 МБ и установленной 32 ГБ вы не должны использовать максимальную память
У вас есть только 250 пользователей и вы используете максимальный процессор
2.) Mysql по замыслу, дает одно соединение / поток к ядру (это может быть разделено)
Это, очевидно, может использоваться многими потоками, но 1 поток не может нарушить ядро.
Проблема, которую вы видите, заключается в слишком большом количестве "медленных / тяжелых" запросов, в результате чего максимизируется каждое ядро.
Поэтому вы не можете принять больше пользователей, так как процессор на пределе.
- Начните профилировать ваши запросы
- Индекс правильно для чтения
- При необходимости используйте мастер записи и ведомого чтения
Некоторые вопросы
What is your ratio READS / WRITES???
Have you tried Slow_query logging ( set it to 1 second )?
Have you used "explain" on queries to see if indexing is working?
Have you considered a job queue for writes?
Are you using the mysql cache effectively for reads?
Реально ваша проблема - плохие запросы / вставки..
Если вы можете решить эту проблему, мы можем помочь вам с вашей конфигурацией, чтобы минимизировать использование памяти.
Конфигурация в основном не предлагает много, чтобы помочь с использованием процессора, это зависит от вашего кода!
Надеюсь, это ясно:D
У меня есть только пара моментов, о которых вы должны подумать.
32 ГБ ОЗУ на интенсивно используемом сервере баз данных не является "монстром", но это зависит от того, как используется ваша база данных. Если у вас есть несколько запросов - и все данные (которые запрашиваются) не могут поместиться в ОЗУ, у вас возникнет серьезная проблема, связанная с тем, что дисковая система забивает ввод-вывод в хранилище данных. Это не звучит так, как будто вам нужно больше оперативной памяти, так как вы увеличиваете нагрузку на процессор.
1600% загрузки процессора равняется 16 логическим (8 физическим) ядрам на максимуме X7550. Вы должны заметить, что гиперпоточность на серверах баз данных широко обсуждается, так как обычно она обеспечивает чуть более высокую производительность записи и чуть меньше производительность чтения. С другой стороны, отключение этого не решит вашу проблему.
Мне кажется, что ваша база данных и / или ваше приложение не очень хорошо спроектированы с точки зрения оптимизации и времени обработки. 250 пользователей буквально убивают ядра 8x2,4 ГГц - это не то, что я бы назвал обычным, и это не то, что настройки сервера MySQL могут решить для вас.
Я проголосовал за перенос этого вопроса в Переполнение стека.
Это довольно простой, но "скрипт для начинающих с настройкой производительности mysql" ( http://www.day32.com/MySQL/) предлагает несколько хороших советов для начала.
В настоящее время он обрабатывает рекомендации для следующего:
- Журнал медленных запросов
- Макс подключений
- Рабочие темы
- Ключевой буфер
- Query Cache
- Сортировка буфера
- присоединяется
- Временные таблицы
- Кэш таблицы (Open & Definition)
- Блокировка стола
- Сканирование таблицы (read_buffer)
- Innodb Status
Я могу дать некоторые общие рекомендации, так как более конкретные оптимизации трудно / невозможно для "слепого" диагноза:
- В файле my.cnf по умолчанию используются настройки самого низкого уровня (по крайней мере, все те, которые я видел по умолчанию). Существует множество примеров my.cnf, чтобы дать вам общее представление о том, с чего начать (поиск "mysql my.cnf оптимизация"). Помните, что точные настройки, которые необходимо настроить, зависят от вашего приложения, поэтому настройки, которые хорошо работают для кого-то другого, могут не работать для вас.
- Сказать "250 пользователей" недостаточно. Приложение тяжело для чтения / записи? Сколько запросов в секунду на пользователя?
- База данных должным образом разработана для производительности? Есть ли в каждой таблице индексы для часто используемых запросов? Являются ли запросы простыми, сложными или сверхсложными? Имейте в виду "ошибки" в запросах, которые могут привести к проблемам с производительностью на порядок. Вы фильтруете записи на стороне базы данных, используя "ГДЕ", или вы фильтруете на стороне сервера, запрашивая и игнорируя несколько записей на запрос?
- Для базы данных объемом 200 МБ с правильными настройками my.cnf весь рабочий набор базы данных должен легко помещаться в ОЗУ, особенно на сервере с 32 ГБ памяти.
- Если ваше приложение тяжело читается со сложными запросами, тогда посмотрите на стратегию кэширования, чтобы уменьшить нагрузку на сервер MySQL.
- Для сравнения: у меня MySQL-сервер занимает 1/5 емкости (ЦП / ОЗУ) вашего сервера, который в среднем составляет 100 запросов в секунду для сайта MediaWiki и всегда на 90-95% простаивает. Хотя я не знаю деталей вашего приложения / настройки, я думаю, что с помощью нескольких настроек my.cnf и некоторых профилей и оптимизаций приложений и баз данных вы можете увеличить свою производительность на порядок или два.
- Если вы серьезно относитесь к разработке MySQL, посмотрите книгу High Performance MySQL. Это отличный обзор по настройке и использованию MySQL для начинающих пользователей. MySQL High Performance Blog - также отличный сайт для частых посещений.