Недавно я заменил свой старый 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. Результаты?
Что я получу от этого? Вы должны настроить MySQL 5.5 / 5.6, чтобы задействовать многоядерные улучшения..
Учитывая, что вы используете my.cnf, MySQL по-прежнему работает "из коробки" во всех смыслах и целях.
Пожалуйста, проведите необходимую комплексную проверку (настройка запросов, желаемая конфигурация, инфраструктура БД, правильный выбор и настройка механизма хранения), чтобы MySQL работал лучше для вас.
У вас достаточно места для подкачки?
У вас достаточно места для / tmp и / var / tmp?
Я просто делаю дикие предположения, но как насчет пространства tmp для базы данных MySQL.