Фоновая очистка в Linux происходит, когда либо ожидается слишком много записанных данных (настраивается с помощью / proc / sys / vm / dirty_background_ratio), либо достигается тайм-аут для ожидающих записей (/ proc / sys / vm / dirty_expire_centisecs). Если не установлен другой предел (/ proc / sys / vm / dirty_ratio), может быть сохранено больше записанных данных. Дальнейшие записи заблокируют.
Теоретически, это должно создать фоновый процесс записи грязных страниц, не мешая другим процессам. На практике это мешает любому процессу, выполняющему чтение без кэширования или синхронную запись. Плохо. Это связано с тем, что фоновая очистка фактически записывает со скоростью устройства 100%, и любые другие запросы устройств в это время будут задерживаться (поскольку все очереди и кэши записи на дороге заполнены).
Есть ли способ ограничить количество запросов в секунду, которые выполняет процесс очистки, или иным образом эффективно расставить приоритеты для других устройств ввода-вывода?
источник
Ответы:
После большого количества сравнений с sysbench я пришел к такому выводу:
Чтобы выжить (с точки зрения производительности) ситуация, когда
просто сбросьте все лифты, очереди и грязные кэши страниц. Правильное место для грязных страниц находится в оперативной памяти этого аппаратного кэша записи.
Отрегулируйте dirty_ratio (или новый dirty_bytes) как можно ниже, но следите за последовательной пропускной способностью. В моем конкретном случае 15 МБ были оптимальными (
echo 15000000 > dirty_bytes
).Это скорее взлом, чем решение, потому что гигабайты оперативной памяти теперь используются только для кэширования чтения вместо грязного кэша. Чтобы грязный кэш хорошо работал в этой ситуации, фоновый очиститель ядра Linux должен был усреднять, с какой скоростью базовое устройство принимает запросы, и соответствующим образом корректировать фоновую очистку. Не просто.
Технические характеристики и ориентиры для сравнения:
Протестировано при установке
dd
нулей на диск, sysbench продемонстрировал огромный успех , увеличив 10 потоковых записей fsync при 16 кБ с 33 до 700 операций ввода-вывода в секунду (предел простоя: 1500 операций ввода-вывода в секунду) и одного потока от 8 до 400 операций ввода-вывода в секунду.Без нагрузки IOPS не пострадали (~ 1500), а пропускная способность немного снизилась (с 251 МБ / с до 216 МБ / с).
dd
вызов:для sysbench test_file.0 был подготовлен для разборки с:
вызов sysbench для 10 потоков:
вызов sysbench для одного потока:
Меньшие размеры блоков показали еще более резкие цифры.
--file-block-size = 4096 с 1 ГБ dirty_bytes:
--file-block-size = 4096 с 15 МБ dirty_bytes:
--file-block-size = 4096 с 15 МБ dirty_bytes в неактивной системе:
sysbench 0.4.12: тест оценки многопоточной системы
Тест-система:
Таким образом, теперь я уверен, что эта конфигурация будет хорошо работать в режиме ожидания, при высокой нагрузке и даже при полной загрузке для трафика базы данных, который в противном случае был бы истощен последовательным трафиком. Последовательная пропускная способность выше, чем два гигабитных канала, которые могут быть доставлены в любом случае, поэтому нет проблем с ее небольшим уменьшением.
источник
dirty_bytes
должен быть достаточно высоким, чтобы не останавливать процессоры во время записи процессов, если процесс пишет в среднем с пропускной способностью устройства. Если код вашего приложения выполняет циклы огромных вычислений с последующей записью огромного количества данных, оптимизировать его будет очень сложно, поскольку средние значения за короткое время сильно отличаются от средних значений за долгое время. Правильным решением было бы настроитьdirty_bytes
параметры, специфичные для процесса, но Linux не поддерживает такую вещь, насколько я знаю.Несмотря на то, что настройка параметров ядра остановила проблему, на самом деле, возможно, проблемы с производительностью были результатом ошибки контроллера Adaptec 5405Z, которая была исправлена в обновлении прошивки 1 февраля 2012 года. В примечаниях к выпуску говорится: «Исправлена ошибка, из-за которой прошивка могла зависать при высокой нагрузке ввода-вывода». Возможно, достаточно было распределить ввод-вывод, чтобы предотвратить появление этой ошибки, но это всего лишь предположение.
Вот примечания к выпуску: http://download.adaptec.com/pdfs/readme/relnotes_arc_fw-b18937_asm-18837.pdf
Даже если это не относится к вашей конкретной ситуации, я подумал, что это может помочь пользователям, которые столкнутся с этим постом в будущем. В выводе dmesg мы увидели некоторые сообщения, подобные следующим, что в итоге привело нас к обновлению прошивки:
Ниже приведены номера моделей RAID-контроллеров Adaptec, которые перечислены в примечаниях к выпуску микропрограммы с исправлением высокой вероятности зависания ввода-вывода: 2045, 2405, 2405Q, 2805, 5085, 5405, 5405Z, 5445, 5445Z, 5805, 5805Q, 5805Z, 5805ZQ, 51245, 51645, 52445.
источник
Ядро, в состав которого входит «WBT»:
WBT не требует переключения на новый блочный уровень blk-mq. Тем не менее, он не работает с планировщиками ввода-вывода CFQ или BFQ. Вы можете использовать WBT с планировщиками дедлайн / mq-deadline / noop / none. Я считаю, что это также работает с новым планировщиком ввода-вывода "kyber".
Помимо масштабирования размера очереди для управления задержкой, код WBT ограничивает количество запросов фоновой обратной записи в виде пропорции от вычисленного предела очереди.
Конфигурация времени выполнения находится в
/sys/class/block/*/queue/wbt_lat_usec
.Параметры конфигурации сборки, которые нужно искать:
Ваше утверждение о проблеме на 100% подтверждено автором WBT - молодец :-).
источник
Какое у вас среднее значение для Dirty в / proc / meminfo? Обычно это не должно превышать ваш / proc / sys / vm / dirty_ratio. На выделенном файловом сервере я установил dirty_ratio на очень высокий процент памяти (90), поскольку я никогда не буду превышать его. Ваша грязная_грация слишком низкая, когда вы ее ударили, все вылетает, поднимите ее.
источник