Назад | Перейти на главную страницу

Настройка виртуальной памяти Linux для решения проблемы с дисковым вводом-выводом

У меня проблема с сервером 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 и т. Д.:

http://models.street-artists.org/2016/10/09/nfs-syncasync-some-of-the-issue-solved-or-how-to-set-vm-dirty_bytes-and-vm-dirty_background_bytes/

Краткая версия заключается в том, чтобы не использовать переменные * _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 секунд, прежде чем буферы станут достаточно большими, чтобы их можно было регулировать.