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

Может ли включение RAID-контроллера обратной записи в кэш снизить общую производительность?

У меня есть конфигурация RAID 10 с 8 дисками, подключенная к Adaptec 5805Z, работающая под управлением Centos 5.5 и планировщик сроков.

Базовый dd тест чтения показывает 400 МБ / с, а базовый dd написать тест показывает примерно то же самое.

Когда я запускаю их одновременно, я вижу, что скорость чтения падает до ~ 5 МБ / сек, в то время как скорость записи остается примерно на том же уровне 400 МБ / сек. Выход iostat -x как и следовало ожидать, это показывает, что выполняется очень мало транзакций чтения, когда диск загружен записями.

Если я отключу кеш обратной записи контроллера, я не увижу разделения 50:50, но я вижу заметное улучшение, где-то около 100 МБ / с при чтении и 300 МБ / с при записи. Я также обнаружил, что если я уменьшу параметр nr_requests в очереди диска (где-то около 8 кажется оптимальным), я могу получить 150 МБ / с чтения и 150 МБ / с записи; т.е. снижение общей пропускной способности, но, безусловно, больше подходит для моей рабочей нагрузки.

Это реальное явление? Или мой синтетический тест слишком упрощен?

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

Это кажется разумным объяснением, но также кажется серьезным недостатком использования кэша обратной записи в системе с нетривиальными нагрузками записи. Я искал дискуссии вокруг этого весь день и ничего не нашел. Что мне не хватает?

Что ж, простой dd, вероятно, не лучший способ измерить пропускную способность диска. Это нереальная нагрузка. Однако, если вы запустите ddпожалуйста, передайте oflag=direct в командной строке, чтобы исключить эффект кеширования файловой системы. Также см: Как измерить пропускную способность диска? советы по измерению рабочих нагрузок.

Я думаю, что ваш выбор планировщика имеет большее влияние на ваши результаты, чем что-либо еще. Для RAID-контроллеров с батареей или кэш-памятью с флеш-памятью (кэш записи) я использовал deadline планировщик, но теперь используйте noop планировщик, если кеш равен 512 МБ или 1 ГБ. Планировщик можно менять на лету, поэтому попробуйте тесты с noop алгоритм и oflag=direct и посмотрите, как выглядят результаты.

Ты бежишь bonnie++ или iozone?

Если вы планируете использовать iozone вот несколько способов проверить свою работоспособность. Это лучше, чем dd поскольку они позволяют проводить именно тот тест, который вам нужен.

iozone -s 4G -a -i 0 -i 1 -i 2

Это запустит тесты с набором данных 4 ГБ (-s 4G), используя переменный размер записи и запустите тест записи (-i 0), тест чтения (-i 1) и случайный тест чтения / записи (-i 2). Выбор размера файла очень важен. Если вы выберете тот, который умещается в ОЗУ, ваши результаты будут больше основываться на файловом кеше, чем на фактической производительности хранилища. Поэтому, если у вас есть сервер с 4 ГБ ОЗУ, проверьте размер файла больше этого.

Однако, если у вас неприличное количество оперативной памяти (у меня есть один сервер с 12 ГБ) и вы хотите, чтобы ваши тесты завершились менее чем за много часов, вы можете предоставить -I параметр, который указывает iozone установить O_DIRECT и обойти кеш файловой системы. Здесь вы получите истинную производительность подсистемы хранения.

Вы также можете выполнять тесты, проверяющие одновременный доступ.

iozone -s 128M -r 4k -t 32 -i 0 -i 1 -i 2

Это запустит 32 параллельных потока 128 МБ, выполняющих те же тесты, что и предыдущая команда, но с размером записи 4 КБ (-r 4k). Рабочий набор составляет 4 ГБ, но некоторые файлы поместятся в файловый кеш. В зависимости от того, что вы делаете с этим хранилищем, это может быть более точным тестом вашей вероятной производительности. Как и раньше, -I параметр установит O_DIRECT.

iozone -s 128M -r 4k -l 16 -u 32 -i 0 -i 1 -i 2

Это делает то же самое, что и приведенная выше команда, но запускает серию тестов, начиная с 16 потоков и увеличиваясь до 32 потоков.