Назад | Перейти на главную страницу

Ужасная производительность mysqld после обновления системы

Недавно я заменил свой старый Core2duo Mac на 4 ГБ и OS X 10.6.8 на 4-ядерный i5 с 16 ГБ, SSD и 10.7.2.

Новая система удивительно быстра для всего, кроме mysqld. С легкими нагрузками все в порядке, но когда я даю ему реальную работу, он ведет себя очень своеобразно.

Я пробовал mysql-5.1.59-osx10.6-x86_64 и mysql-5.5.16-osx10.6-x86_64 с аналогичными результатами.

Рабочая нагрузка - это пакетный файл, который принимает большую базу данных, которую мы получаем от поставщика, и преобразовывает данные в форму, которую мы можем использовать в нашем приложении на производственных серверах. На старом Mac для работы требовалось от 3 до 4 часов.

На новом он какое-то время работает быстро, а затем останавливается, после чего каждый запрос выполняется на удивление медленно с тривиальным вводом-выводом и ЦП, привязанным к 100%, на одном ядре (пакетный файл выполняет только один запрос за раз через обычный клиент mysql cli). Другие приложения также сильно замедляются и используют много ЦП, хотя, по словам top, у них 10 ГБ неактивной памяти.

Например, сейчас mysqld запущен

select t.t_id, a.a_id from t inner join a on a.x=t.x into outfile;

Этот запрос выполнялся около часа, тогда как в старой системе он занимал всего 4 минуты. Он использует 100% ЦП на одном ядре и каждую минуту или около того записывает блок размером 1 МБ в файл вывода. Используя iosnoop, я не вижу никаких чтений ни из таблицы a, ни из t (оба MyISAM), поэтому я предполагаю, что они кэшируются в виртуальной машине. Соответствующий индекс был предварительно загружен в буфер ключей MyISAM. Так что узкого места ввода-вывода определенно нет. И все же эта новая система намного медленнее (~ 20x), чем старая.

У меня есть схема производительности 5.5, но я ее не понимаю. И у меня есть dtrace, но я не совсем компетентен управлять им, кроме как с помощью данных утилит, таких как iosnoop.

Что могло происходить? Что я мог сделать, чтобы получить нужную информацию?

РЕДАКТИРОВАТЬ: Это все, что у my.cnf есть для mysqld - значения по умолчанию для всего остального.

[mysqld]
datadir = /Users/fsb/mysql
port = 3306
socket = /tmp/mysql.sock
key_buffer_size = 1536M
performance_schema = ON

Ваше наблюдение совсем не удивительно.

Если есть одна вещь, которую я усвоил за годы работы в качестве администратора базы данных MySQL, так это следующее: производительность MySQL повышается настолько, насколько вы ее настраиваете. Я могу сказать это с абсолютной уверенностью, потому что я установил PostgreSQL и MySQL и видел, как PostgreSQL работает намного лучше "из коробки", чем MySQL "из коробки".

Чтобы доказать это за пределами моего собственного мнения,

Percona недавно провела «Королевскую битву» среди нескольких выпусков MySQL.

  • MySQL 4.1
  • MySQL 5.0
  • MySQL 5.1 (со встроенным InnoDB)
  • MySQL 5.1 с InnoDB-плагином
  • MySQL 5.5
  • MySQL 5.6

Все тесты проводились с ненастроенным MySQL. Результаты?

  • MySQL 4.1 лучше всех работает в однопоточной среде
  • MySQL 5.1 с подключаемым модулем InnoDB масштабируется на нескольких ядрах лучше, чем 5.1 InnoDB built, 5.5 и 5.6

Что я получу от этого? Вы должны настроить MySQL 5.5 / 5.6, чтобы задействовать многоядерные улучшения..

Учитывая, что вы используете my.cnf, MySQL по-прежнему работает "из коробки" во всех смыслах и целях.

Пожалуйста, проведите необходимую комплексную проверку (настройка запросов, желаемая конфигурация, инфраструктура БД, правильный выбор и настройка механизма хранения), чтобы MySQL работал лучше для вас.

У вас достаточно места для подкачки?

У вас достаточно места для / tmp и / var / tmp?

Я просто делаю дикие предположения, но как насчет пространства tmp для базы данных MySQL.