Может ли включение кэша обратной записи контроллера RAID повлиять на общую производительность?
У меня есть 8-ми дисковый RAID 10, подключенный к Adaptec 5805Z, с Centos 5.5 и планировщиком сроков.
Основной dd
читать тест показывает 400мб / с, а базовый dd
написать тест показывает примерно то же самое.
Когда я запускаю их одновременно, я вижу снижение скорости чтения до ~5 Мбит / с, в то время как скорость записи остается примерно равной 400 Мбит / с. Выход из iostat -x
как и следовало ожидать, показывает, что очень мало транзакций чтения выполняется, пока диск засыпается записями.
Если я выключаю кэш обратной записи контроллера, я не вижу разделения 50:50, но я вижу заметное улучшение, где-то около 100 МБ / с читает и 300 МБ / с пишет. Я также обнаружил, что если я уменьшу значение nr_requests в очереди накопителя (где-то около 8 кажется оптимальным), я получу 150 МБ / с и 150 МБ / с; то есть. снижение общей пропускной способности, но, безусловно, больше подходит для моей рабочей нагрузки.
Это реальное явление? Или мой синтетический тест слишком упрощен?
Причина, по которой это может произойти, кажется достаточно ясной: когда планировщик переключается с чтения на запись, он может выполнять кучу запросов на запись, поскольку все они просто попадают в кэш контроллера, но должны быть выполнены в какой-то момент. Я полагаю, что фактическая запись на диск происходит, когда планировщик снова пытается выполнить чтение, в результате чего выполняется очень мало запросов на чтение.
Это кажется разумным объяснением, но также кажется огромным недостатком использования кэша обратной записи в системе с нетривиальными нагрузками записи. Я искал обсуждения вокруг этого весь день и ничего не нашел. Что мне не хватает?
2 ответа
Ну, простой 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 потоков.