Я пишу индексатор, использующий python, который индексирует документы и вставляет их в базу данных. Раньше это был отдельный процесс, но теперь я перешел на многопроцессорную работу с 4 параллельными процессами. После каждого извлечения текста он вставляется в базу данных и выполняет коммит.
Теперь это проблема IO, главная проблема IO - это не мой процесс, а jdb2 EXT4, система журналирования. Это на 99,99% и побуждает ЦП ожидать ввода-вывода при каждой фиксации MySQL.
Я видел многих, имеющих эту проблему в Интернете, и их решение состоит в том, чтобы установить, используя барьер = 0. Будет ли это полностью отключить ведение журнала? Мои серверы имеют ИБП и заманчиво сделать это, не так ли?
linux
mysql
performance
python
Phyo Arkar Lwin
источник
источник
Ответы:
Поместите базу данных в файловую систему без журналирования. По крайней мере, более крупные серверы (oracle, sql server) имеют свои собственные функции журнала (журнал транзакций) и соответственно оптимизируют свои операции ввода-вывода. У вас есть журнал и база данных на отдельных файловых системах и дисках, и вы используете внутреннюю функциональность базы данных для обработки некорректного ввода-вывода. Как правило, никаких изменений в файловой системе (более крупных) не происходит, за исключением даты записи, поскольку файлы не расширяются - они будут генерироваться с их «окончательным» размером (хорошо, администраторы могут это изменить), а изменения, как я уже сказал, отслеживаются базой данных. Уровень транзакций журнала.
Вы также можете сообщить нам, какой у вас аппаратный уровень. Большинство людей недооценивают, что IOPS является ограничивающим фактором для базы данных, и считают, что небольшой набор дисков является подходящей средой для большой базы данных. Хотя некоторые из нас работают с базами данных, используя большее количество дисков, таким образом, потенциально поддерживая большее количество операций ввода-вывода в секунду.
источник
Всегда будет компромисс между отказоустойчивостью и производительностью.
При использовании MySQL на ext4 значение по умолчанию «барьеры = 1» действительно приводит к замедлению, однако первым действием не должно быть отключение ведения журнала или включение data = writeback.
Во-первых, если устойчивость очень важна, RAID с резервным питанием от батареи, безусловно, того стоит.
Варианты монтирования, которые я выбрал, особенно для RAID без аккумулятора:
Это намеренно не использует data = writeback, потому что я не хочу рисковать повреждением файловой системы, в результате чего «старые данные появляются в файлах после сбоя и восстановления журнала» (цитата из
man mount
).Идеальная конфигурация в my.cnf для полной устойчивости вокруг настроек, связанных с вводом / выводом:
Я выбрал следующую последовательность компромиссов для повышения производительности:
sync_binlog = 0
Это первый конфиг MySQL, который я изменил от полной отказоустойчивости. Причина этого заключается в том, что это дает значительное улучшение производительности, особенно там, гдеbinlog_format=row
(к сожалению, требуется для Jira). Я использую достаточное количество реплик MySQL в кластере, чтобы в случае повреждения бинлога из-за сбоя питания я сделал бы двоичную копию из другой реплики.innodb_flush_log_at_trx_commit = 2
: Хотя для полного соответствия ACID требуется значение 1, со значением 2 "буфер журнала записывается в файл при каждой фиксации, но на нем не выполняется операция очистки на диск. Однако очистка на Файл журнала выполняется один раз в секунду, а также при значении 2. Обратите внимание, что сбрасывание один раз в секунду не гарантируется на 100% каждую секунду из-за проблем с планированием процесса ». (цитата из документации по MySQL)data=writeback
. Обратите внимание, что если это ваша корневая файловая система, вам также нужно будет указать параметр командной строки ядра. Я собрал несколько шагов по этому вопросу в coderwall .innodb_flush_method
. Показано, что O_DIRECT улучшает производительность в некоторых рабочих нагрузках, но не считается, что это будет работать в вашей среде.innodb_io_capacity
, а также настраивать параметры , такие какinnodb_adaptive_flushing
,innodb_read_io_threads
,innodb_write_io_threads
,innodb_purge_threads
, и другие возможные настройки.источник
Вполне вероятно, что ваш бэкэнд ввода-вывода не справляется с нагрузкой. Вы должны убедиться, что ваша файловая система не регистрирует данные. Я бы предложил использовать
data=writeback,relatime,nobarrier
параметры для монтирования раздела данных вашей базы данных в качестве первой быстрой и грязной оптимизации.Кроме того, исходя из ваших симптомов, вы, очевидно, не используете кеширование записи с вашим контроллером. Вы должны убедиться, что используете на контроллере кэш-память с батарейным или флэш-накопителем и включите его - это должно значительно повысить производительность без значительного увеличения риска потери или повреждения данных. Обратите внимание, что использование кэша записи без батареи или флэш-резервирования значительно увеличивает риск потери или повреждения данных - поэтому делайте это только в целях тестирования и / или если вы можете принять потерю.
источник
nobarrier
же, какbarrier=0
?Это старый вопрос, но мы столкнулись с теми же проблемами (высокая скорость ввода-вывода и ужасная скорость вставки / обновления) на прошлой неделе на новом выделенном сервере, и это решение напрямую решает эту проблему.
Отключение ведения журнала с помощью
tune2fs -O "^has_journal" /dev/<drive>
было самым быстрым решением, поскольку оно устраняет ожидание ввода-вывода из-за процесса JDB2. Но это не рекомендуется, если у вас нет накопителя с батарейным питанием, потому что вы потеряете данные в случае сбоя. Таблицы InnoDB безопасны, если выdoublewrite
включили в MySQL. Но такие файлы, как .frm, журналы и т. Д. Небезопасны. Мы попытались переместить эти файлы на другой диск (особенно в журналы bin), но ожидание ввода-вывода jdb2 все еще продолжалось. Так что это не оставляло нас очень комфортно.data=writeback,relatime,nobarrier
это не помогло ускорить процесс записи / чтения, так как отключило ведение журнала для всего раздела. Дополнительные параметры для ext4 находятся в документе EXT4 .Настоящий виновник в нашем случае был
sync_binlog
. Мы установили, как1
в,/etc/mysql/my.cnf
и это было убийственное представление.Перкона подтверждает это здесь . Мы установили для него значение по умолчанию
0
и производительность выросла более чем на 500%.источник
Какой движок базы данных вы используете для вставки этих данных?
Если это MyISAM: он должен блокировать всю таблицу во время записи, поэтому выполнение параллельных потоков вставки уничтожит ЛЮБУЮ систему, независимо от ее мощности.
Убедитесь, что вы используете InnoDB для этих таблиц.
источник
Кроме того, не имеет прямого отношения к mysql, но некоторые HD имеют проблемы с ext4 из-за агрессивного управления питанием ... когда это происходит, загрузка машины увеличивается без какой-либо видимой активности.
Попробуйте отключить это. сначала проверьте, какое у вас значение (если вам нужно вернуть его без перезагрузки), а затем отключите его.
Проверьте текущее значение:
Отключить это
(или как там у тебя HD) и тестируй. Вероятно, это не поможет для большинства проблем, но это может помочь некоторым пользователям там. Перезагрузка сбросит значение или вручную заменит 255 на предыдущее значение.
Если это помогает, проверьте
/etc/default/hdparm
или/etc/hdparm.conf
для более постоянной конфигурации, установив его при загрузке.источник