У меня проблема с сервером Linux, который много пишет на диск, поэтому у меня медленное время ответа из-за большого ожидания ввода-вывода. Я уже проверял умные значения для дисков и все в порядке. Это установка с двумя дисками в программном обеспечении RAID1, файловая система ext4.
Поскольку на данный момент я не могу ни обновить оборудование, ни избавиться от интенсивных приложений ввода-вывода, я планировал настроить Linux vm, чтобы уменьшить время ожидания ввода-вывода.
Я думаю о смене настроек, но в основном dirty_background_ratio и dirty_ratio.
Вопрос:
Как я могу оценить настройку этих значений на основе моей текущей загрузки системы и использования памяти?
Вы хотите немногое. Сначала вы хотите уменьшить подкачку
sysctl -w vm.swappiness = 10
Это сэкономит некоторое количество операций ввода-вывода диска; потому что последнее, что вам нужно, это дополнительная запись на диск, когда ядро пытается выгрузить какой-то материал из памяти. Цель состоит в том, чтобы настроить вещи так, чтобы не требовалось подкачки. Однако не отключайте подкачку, установив для нее значение 0 или отключив. Я бы рекомендовал крайние меры, чтобы установить для swappiness значение 1. Если вы некоторое время наблюдаете за выводом dstat, вы быстро заметите, сколько данных фактически записывается и читается из swap.
Теперь в новых ядрах (3.2+) есть механизм, называемый регулирование обратной записи. Чтобы использовать его, как вы сказали, вам нужно настроить грязные отношения. Проверить подробности эта ссылка. Цитата оттуда, которая вас интересует
Once dirty_ratio (resp. dirty_bytes) limit is hit then the process which
writes gets throttled.
Так что по умолчанию «грязь» довольно высока, особенно если у вас много памяти и медленная дисковая подсистема. Так что вам нужно их приглушить; как можно меньше, чтобы не повлиять на нормальное использование *, и все же значение будет определять объем данных, которые будут существовать в памяти до того, как ядро запустит процессы для записи их на диск, когда начнется ситуация узкого места ввода-вывода вашего диска. В этот момент вы хотите, чтобы этот процесс был ограничен, что ядро делает, вставляя в него спящие режимы.
* чтобы выяснить, что такое нормальное использование; Рекомендую установить поверх и понаблюдать за тем, что там происходит; вы хотите проверить цифры dirty
там и посмотрите обзор D, где отслеживаются чтение / запись на диск. Есть столбец WCANCL; на самом деле это записи, которые обрабатывались в памяти и никогда не требовались для записи на диск (грязные страницы), кроме некоторых временных данных. У Mysql есть те, когда он выполняет сложные запросы, компилятор при создании кучи небольших файлов obj, которые не нужны надолго и т. Д.
Кроме того, это может помочь переключиться на планировщик диска крайнего срока и настроить соответствие чтения и записи, чтобы лучше соответствовать вашей среде. например если вы делаете в 10 раз больше операций чтения, чем записи, вы можете установить
/sys/block/<device>/queue/iosched/writes_starved
до 5, а не по умолчанию 2. Установка выше
/sys/block/<device>/queue/iosched/write_expire
тоже поможет. Кроме того, вы можете получить некоторую задержку, если уменьшите количество запросов, выполняемых в пакетном режиме из 128
сказать 32
/sys/block/<device>/queue/nr_requests
Если у вас есть тяжелые записи, вы будете ограничены тем, что в вашей системе не будет уровня кэширования записи. Два диска и программный RAID усложняют задачу. Обычно это особенность аппаратного RAID. То, что у вас есть сейчас, не является подходящей конфигурацией оборудования для вашей рабочей нагрузки.
Чтобы получить более точные ответы, нам потребуется конкретная информация о том, что делает ваше приложение, ОС, включены ли в вашей файловой системе барьеры записи и т. Д.
Изменить: вы можете настраиваться только в том случае, если ваш фундамент плохой. Возможно, вам стоит подумать о SSD вместо вращающихся дисков для этой цели.
Я недавно писал в своем блоге о dirty_background_ratio и dirty_ratio и т. Д.:
Краткая версия заключается в том, чтобы не использовать переменные * _ratio, а вместо этого использовать версию * _bytes и оценить количество байтов, взяв полосу пропускания (или скорость генерации данных) и умножив на максимальную задержку, которую вы хотите иметь перед большими записями начинают бить по диску.
Устанавливая относительно низкое значение dirty_background_bytes (менее секунды задержки при полной скорости приема / генерации данных), вы гарантируете, что буфер не накапливается, пока никто ничего не делает. Установка dirty_bytes в 2 или 3 раза выше (по крайней мере, может быть, до 10 раз или больше, в зависимости от вашего объема ОЗУ) гарантирует, что прерывистый процесс не будет ограничен. Вы можете оценить значение dirty_bytes, учитывая разницу между скоростью генерации данных и скоростью записи на диск. Это скорость заполнения буфера, и вы можете затем умножить ее на максимальное время буферизации, прежде чем заполнение будет ограничено. Так, например, если вы генерируете данные со скоростью Rg и записываете на диск со скоростью Rd, а Rg больше, чем Rd, вы можете установить dirty_background_bytes на Rg * (0,5 секунды), чтобы ваш диск начал писать примерно через 0,5 секунды после того, как вы начали захлопывать данные. в буферы, а затем установите для dirty_bytes значение max (2 * Rg * 0,5, (Rg-Rd) * (2 секунды)), например. Пакетные процессы смогут писать до 2 секунд, прежде чем буферы станут достаточно большими, чтобы их можно было регулировать.