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

12

Здесь я сталкиваюсь с проблемой максимальной пропускной способности и нуждаюсь в совете, как настроить мои ручки. Мы используем файловый сервер 10 Гбит для резервного копирования. Это двухдисковая установка S-ATA2 на контроллере LSI MegaRAID. Сервер также получил 24 гигабайта памяти.

Нам необходимо отразить нашу последнюю загруженную резервную копию с максимальной пропускной способностью.

RAID0 для наших «горячих» резервных копий дает нам около 260 МБ / с записи и 275 МБ / с чтения. Протестированные tmpfs размером 20 ГБ дают нам около 1 ГБ / с. Такая пропускная способность - то, что нам нужно.

Теперь, как я могу настроить подсистему виртуальной памяти Linux так, чтобы как можно дольше сохранять в памяти последние загруженные файлы, не записывая их на диск (или даже лучше: запись на диск И хранение их в памяти)?

Я установил следующие sysctl, но они не дают нам ожидаемой пропускной способности:

# VM pressure fixes
vm.swappiness = 20
vm.dirty_ratio = 70
vm.dirty_background_ratio = 30
vm.dirty_writeback_centisecs = 60000

Теоретически это должно дать нам 16 ГБ для кэширования ввода-вывода и подождать несколько минут до его записи на диск. Тем не менее, когда я тестирую сервер, я не вижу влияния на запись, пропускная способность не увеличивается.

Нужна помощь или совет.

Питер Мейер
источник
Разве не было бы больше смысла начать писать как можно скорее? В противном случае он достигает максимального размера буфера и внезапно останавливается. Если он писал все это, это дает вам больше времени.
Zan Lynx
У меня 20 ГБ памяти только для буферов, поскольку мои приложения (базовый linux + vsftpd) используют менее 4 ГБ (всего 24 ГБ). Мои резервные копии не более 20 ГБ. Если я смогу записать их в буфер, а затем последовательно записать на диск после выполнения резервного копирования, это значительно сократит время простоя моего источника резервного копирования (виртуальных серверов). PS: После этого сервер может остановиться, без проблем. У него есть 30 минут на восстановление :)
Питер Мейер
Похоже, что любое приложение, которое вы используете для передачи данных по сети, синхронизирует их на диск. Вы захотите, чтобы это не делалось так, чтобы данные могли просто храниться в кеше, хотя я задаюсь вопросом, почему вы хотите иметь возможность загружать много данных таким образом быстрее, чем диски могут поддерживать. Это указывает на недостаток дизайна где-то.
psusi
Это звучит как недостаток: ваше решение для резервного копирования не должно требовать остановки сервера все время.
psusi
1
@PeterMeyer: даже если у вас много оперативной памяти, все равно ошибка ждать начала записи. Единственный момент, который имеет какой-либо смысл, - это если вы собираетесь редактировать или удалять файлы (например, временный файл) до того, как они попадут на диск. Бэкап не делает этого. Вы хотите начать фоновые записи как можно скорее. Установите для background_ratio значение 1 или 2.
Zan Lynx,

Ответы:

6

Если посмотреть на установленные вами переменные, кажется, что вы в основном озабочены производительностью записи и не заботитесь о возможных потерях данных из-за перебоев в подаче электроэнергии.

Вы только когда-либо получите возможность для отложенной записи и использования кэша обратной записи с асинхронными операциями записи. Синхронные операции записи требуют фиксации на диск и никогда не будут записываться лениво - никогда. Ваша файловая система может вызывать частые обновления страниц и синхронные записи (обычно из-за журналирования, особенно с ext3 в режиме data = journal). Кроме того, даже «фоновые» очистки страниц будут мешать чтению без кэширования и синхронной записи , тем самым замедляя их.

В общем, вам нужно взять некоторые метрики, чтобы увидеть, что происходит - вы видите, что ваш процесс копирования переведен в состояние «D», ожидая, пока pdflush выполнит работу ввода-вывода? Видите ли вы интенсивную синхронную запись на ваших дисках?

Если ничего не помогает, вы можете установить явную файловую систему tmpfs, куда вы будете копировать свои резервные копии и просто синхронизировать данные с вашими дисками после факта - даже автоматически используя inotify

Для кэширования чтения все значительно проще - есть fadviseутилита fcoretools, у которой есть --willneedпараметр, который советует ядру загружать содержимое файла в буферный кеш.

Редактировать:

vm.dirty_ratio = 70

Теоретически это должно дать нам 16 ГБ для кэширования ввода-вывода и подождать несколько минут до его записи на диск.

Это не сильно повлияло бы на ваш сценарий тестирования, но в вашем понимании есть неправильное представление. Параметр dirty_ratio - это не процент от общей памяти вашей системы, а скорее ее свободной памяти.

Существует статья о настройке нагрузок для записи с более подробной информацией.

заместитель Wabbit
источник
Да, я после записи спектакля. Время, необходимое для разветвления резервной копии на резервные ведомые устройства, не является моей проблемой. У меня также есть сценарий для повторной передачи, если основной сервер резервного копирования выходит из строя и резервные копии не попадают на резервные подчиненные устройства. PS Я уже прочитал ссылку и настроил соответственно. Извините за ошибку о бесплатном и буферизированном против всего.
Питер Мейер
3

Или просто получите больше дисков ... Конфигурация массива дисков, которую вы имеете, не поддерживает все, что вам нужно. Это тот случай, когда решение должно быть реинжиниринг для удовлетворения ваших реальных потребностей. Я понимаю, что это только резервное копирование, но имеет смысл избегать грязного исправления.

ewwhite
источник
Согласовано. Невозможно, чтобы пара дисков SATA ( SATA ? Серьезно?) Выдерживала 275 МБ / с, и мы даже не говорим об ужасных IOP, которые вы получите от них.
Адаптер
1
Я могу видеть, куда он направляется - поскольку это всего лишь место для резервного копирования данных, он не заботится о возможности случайной потери данных из-за перебоев в подаче электроэнергии. И он хочет минимизировать время, необходимое для окна резервного копирования, обеспечивая максимальную доступную пропускную способность - таким образом, 20 ГБ данных могут быть записаны менее чем за 30 секунд. Если резервное копирование по какой-либо причине связано с простоями или влиянием на обслуживание, 30 секунд наверняка легче преодолеть, чем 20 минут.
The Wabbit
ПОЛНОСТЬЮ верно. Я синхронизирую образы виртуальных машин (очень маленькие для вычислительных узлов), которые не работают во время синхронизации. Приложение работает как tar | SSH, но с использованием FTP. И хорошо, симуляции нужно запустить ... :)
Питер Мейер
1
Неважно, какой породы SATA они являются. 7200 об / мин не корпоративные диски просто не могут гарантировать пропускную способность или задержку.
Адаптер
1
@adaptr, резервная копия будет последовательной записи.
psusi
1

Использование кэша памяти может привести к потере данных, так как если что-то пойдет не так, данные, которые находятся в памяти и не сохранены на дисках, будут потеряны.

Тем не менее, есть настройка, которая должна быть сделана на уровне файловой системы.

Например, если вы использовали ext4, вы можете попробовать опцию монтирования:

Барьер = 0

То есть: «отключает использование барьеров записи в коде jbd. Барьеры записи обеспечивают правильное упорядочение записей на диске на диске, что делает использование кэшей записи на энергозависимые диски безопасным для использования при некотором снижении производительности. Если ваши диски питаются от батареи одним способом или другое, отключение барьеров может безопасно улучшить производительность. Параметры монтирования «барьер» и «безбарьер» также могут использоваться для включения или отключения барьеров для совместимости с другими вариантами монтирования ext4 ».

Больше на: http://www.mjmwired.net/kernel/Documentation/filesystems/ext4.txt

Питер Сенна
источник
Я использую сильно настроенную XFS. Больше о том, в каком отношении это настроено в комментарии выше :)
Питер Мейер
Файловая система была создана с помощью mkfs.xfs -l lazy-count = 1, version = 2, size = 256m -i attr = 2 -d sunit = 512, swidth = 1024 и смонтирована с: rw, noatime, logbufs = 8, logbsize = 256k, osyncisdsync, delaylog, attr2, nobarrier, allocsize = 256k
Питер Мейер