Важна ли настройка innodb_buffer_pool_size для Solaris ZFS?

Мы запускаем базу данных среднего размера (350 ГБ) с несколькими довольно большими таблицами (несколько сотен миллионов строк, 50 ГБ) на достаточно большом сервере (2 четырехъядерных процессора Xeon, 24 ГБ ОЗУ, 2,5-дюймовые 10-тысячные диски в RAID10) и получают довольно медленные вставки (например, простая вставка одной строки занимает 90 секунд!).

Наш innodb_buffer_pool_size установлен на 400 МБ, что обычно слишком мало для такой настройки. Однако наш хостинг-провайдер сообщает, что это не имеет значения при работе в ZFS. Он прав?

(Извинения за двойной пост на https://dba.stackexchange.com/questions/1975/is-tuning-the-innodb-buffer-pool-size-important-on-solaris-zfs, но я не уверен, насколько велика аудитория вон там!)


person Mark B    schedule 29.03.2011    source источник
comment
cdn.oreillystatic. com/en/assets/1/event/21/ здесь у вас есть несколько советов по настройке   -  person juanmf    schedule 26.03.2015


Ответы (3)


Я бы все же установил innodb_buffer_pool_size намного выше 400M. Причина? InnoDB Buffer Pool по-прежнему будет кэшировать данные и индексные страницы, необходимые для часто используемых таблиц.

Запустите этот запрос, чтобы получить рекомендуемый размер innodb_buffer_pool_size в МБ:

SELECT CONCAT(ROUND(KBS/POWER(1024,IF(pw‹0,0,IF(pw>3,0,pw)))+0,49999),SUBSTR(' KMG',IF(pw‹0,0,IF (pw>3,0,pw))+1,1)) рекомендуемый_innodb_buffer_pool_size FROM (ВЫБЕРИТЕ СУММУ(длина_данных+длина_индекса) KBS FROM information_schema.tables WHERE engine='InnoDB') A,(SELECT 2 pw) B;

Просто используйте либо результат этого запроса, либо 80% установленной оперативной памяти (в вашем случае 19660M), в зависимости от того, что меньше.

Я бы также установил innodb_log_file_size на 25% от размера буферного пула InnoDB. К сожалению, максимальное значение innodb_log_file_size составляет 2047M. (1M меньше 2G) Таким образом, установите для innodb_log_file_size значение 2047M, так как 25% innodb_buffer_pool_size моего рекомендуемого значения составляет 4915M.

Еще одна рекомендация — отключить совместимость с ACID. Используйте либо 0, либо 2 для innodb_flush_log_at_trx_commit (по умолчанию 1, что поддерживает соответствие ACID). Это приведет к более быстрой записи InnoDB С РИСКОМ потери транзакций до 1 секунды в случае сбоя.

person RolandoMySQLDBA    schedule 29.03.2011

Ваш хостинг-провайдер неверен. Есть несколько вещей, которые вы должны настроить по-разному при запуске MySQL на ZFS, но уменьшение innodb_buffer_pool_size не входит в их число. Я написал статью на тему запуска MySQL на ZFS и некоторое время назад прочитал лекцию. В частности, что касается innodb_buffer_pool_size, вам следует установить его в любое разумное значение в любой другой файловой системе, а поскольку O_DIRECT не означает «не кэшировать» в ZFS, вы должны установить primarycache=metadata в файловой системе ZFS, содержащей ваш datadir . Есть и другие оптимизации, которые вы можете найти в статье и на слайдах лекции.

person Gordan Bobić    schedule 05.06.2020

Возможно, стоит прочитать slow-mysql-inserts, если вы еще этого не сделали. Также эта ссылка на документацию mysql по этому вопросу - особенно в отношении рассмотрения транзакции, если вы делаете несколько вставок в большую таблицу.

Более актуальна эта статья mysql о производительности innodb и zfs который конкретно учитывает размер буферного пула.

Заголовок вывод;

В случае с InnoDB кривая производительности ZFS предлагает новую стратегию: «установить низкий размер буферного пула и позволить ZFS обрабатывать буферизацию данных».

Вы можете добавить некоторые дополнительные детали, такие как количество/сложность индексов в таблице - это, очевидно, может иметь большое значение.

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

person Roger    schedule 29.03.2011
comment
Официальная рекомендация оракула — отключить ZFS ARC в наборе данных mysql и позволить InnoDB обрабатывать кэширование. - person Allan Jude; 13.01.2014