Как получить максимальную отдачу от MySQL на машине QuadCore с 16 ГБ ОЗУ?

10

Я использую сервер MySQL 5.5 на своей рабочей станции для анализа научных данных и задаюсь вопросом, как настроить MySQL, чтобы получить максимальную отдачу от него с точки зрения производительности. Типы запросов, которые я обычно выполняю, включают в себя соединения из 10-20 таблиц и могут выполняться довольно долго, от одной до нескольких минут, не являясь исключением. Только очень немногие пользователи имеют доступ к базе данных одновременно (5 - максимум). Я переместил сервер с Lenovo Thinkpad T61 с двухъядерным процессором 2,2 ГГц и 4 ГБ оперативной памяти на следующую совершенно новую машину с выбранными вручную компонентами:

  • Intel i7 3770, 4x 3,4 ГГц (работает при 4x3,7 ГГц)
  • Чипсет Z77
  • 16 ГБ оперативной памяти DDR3 1600
  • Windows 7 Prof 64-битная
  • Сервер Windows и MySQL работает на SSD-накопителе серии Intel 520.

Первые тесты (выполнение одного и того же запроса на обеих машинах) показали определенное улучшение скорости для нового, но запросы все еще занимают много времени, и я ожидал большего ускорения. Запросы, о которых идет речь, довольно хорошо оптимизированы, т. Е. Все таблицы имеют надлежащий ключ, который также используется для «расширенного объяснения».

Теперь перейдите к моим текущим настройкам MySQL: сначала я должен упомянуть, что я перешел из MyISAM в Innodb очень давно.

Некоторые из моих настроек my.ini (то есть отклонения от настроек по умолчанию):

# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
#tmp_table_size=35M
tmp_table_size=4000M
max_heap_table_size=4000M

# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system.  Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
#innodb_buffer_pool_size=96M
innodb_buffer_pool_size=800M

general-log
expire_logs_days = 60
general_log_file = "F:/my_query_mysql.log"
log-output = TABLE
optimizer_search_depth = 0 #meant to cure the "statistics state" bug in some queries

Я хотел бы знать, будет ли кто-то предлагать изменения вышеуказанных номеров или даже дополнительные настройки, о которых я не знаю.

Буду признателен за полезное замечание.

Стив

РЕДАКТИРОВАТЬ: у меня есть два запроса, связанные с объединениями по 10-20 таблицам, и запустил их на моем ноутбуке Lenovo и новом ПК. Запрос № 1 занял 3m36s на новой машине против 9m11s на ноутбуке; Запрос №2 занял 22,5 с на рабочей станции против 48,5 с на ноутбуке. Таким образом, скорость выполнения была улучшена примерно в 2-2,5 раза. На рабочей станции не было использовано даже 50% оперативной памяти. Средняя загрузка ЦП по четырем ядрам (по данным диспетчера задач Windows) составила всего около 13%. Нагрузка для каждого ядра (как сообщает Core Temp) составляла около 25-40% для ОДНОГО ядра, в то время как для остальных она составляла <= 10%, что указывает на то, что MySQL не использует несколько ядер для одного запроса. ,

Steve06
источник
Пожалуйста, покажите загрузку вашего сервера, так что проверьте память, IO, загрузка процессора и т. Д.
Я проведу несколько тестов и
Этого должно быть достаточно для первого указания, чтобы увидеть, где ваша проблема.
просто добавил некоторые характеристики.
2
Кроме того, вы также можете попробовать мастер Percona, чтобы получить «рекомендуемые» настройки для своего сервера базы данных по адресу tools.percona.com/wizard
Стивен Сенькомаго Мусоке

Ответы:

5

Поскольку вы работаете с MySQL 5.5, вы можете рассмотреть возможность настройки InnoDB для доступа к нескольким ядрам.

Вот настройки, которые вы должны использовать

innodb_thread_concurrency устанавливает верхнюю границу количества одновременных потоков, которые InnoDB может держать открытыми. Лучшее число раундов для этого - (2 X Количество процессоров) + Количество дисков. ОБНОВЛЕНИЕ : Как я узнал из первых рук на конференции Percona NYC Conference, вы должны установить это значение в 0, чтобы предупредить InnoDB Storage Engine, чтобы найти лучшее число потоков для среды, в которой он работает.

innodb_concurrency_tickets устанавливает количество потоков, которые могут безнаказанно обходить проверку параллелизма. После того, как этот предел достигнут, проверка параллельности потока снова становится нормой.

innodb_commit_concurrency устанавливает количество одновременных транзакций, которые могут быть зафиксированы. Поскольку значение по умолчанию равно 0, не устанавливая его, можно одновременно фиксировать любое количество транзакций.

innodb_thread_sleep_delay устанавливает количество миллисекунд, в течение которых поток InnoDB может бездействовать до повторного входа в очередь InnoDB. По умолчанию 10000 (10 секунд).

innodb_read_io_threads и innodb_write_io_threads (оба начиная с MySQL 5.1.38) выделяют указанное количество потоков для чтения и записи. По умолчанию 4 и максимум 64.

innodb_replication_delay налагает задержку потока на ведомое устройство, когда достигается innodb_thread_concurrency.

Вот мои прошлые посты о MySQL 5.5 и активации нескольких ядер для InnoDB

RolandoMySQLDBA
источник
2

Percona - ведущий консультант MySQL предлагает мастера настройки MySQL . Это позволяет вам настраивать в my.cnf/my.iniзависимости от конфигурации вашей системы.

Также сотрудники Percona выпустили книгу под названием « High Performance MySQL ». Третье издание было выпущено недавно и подробно описывает тюнинг.

Махеш Патил
источник
эти значения они предлагают для хорошей производительности, или это просто выплевывает то, что я ввожу?
OpenCoderX
1

Использование памяти: см http://mysql.rjweb.org/doc.php/memory (Большинство параметров настройки не будет делать достаточно разницы в материю.)

max_heap_table_size = 4000M опасно высоко! Если 4 пользователя нуждаются в этом, значит, у вас недостаточно оперативной памяти и вы подкачали. Обмен вредит производительности гораздо больше, чем что-либо еще.

Запросы, занимающие более нескольких секунд: они должны быть изучены для улучшения; пожалуйста, предоставьте SHOW CREATE TABLE; ПОКАЗАТЬ СТОЛ СТАТУС; ОБЪЯСНИТЬ ВЫБОР

Рик Джеймс
источник
0

Вы можете рассмотреть варианты otger тоже. Например, PostgreSQL на FreeBSD. Но переход с Windows на Linux повысит вашу производительность.

Илхан
источник