Как достичь скорости записи на диск так же высоко, как это делает fio?

Я купил карту Highpoint HBA с 4-мя Samsung 960PRO. Как говорилось на официальном сайте, эта карта может работать со скоростью 7500 МБ / с при записи и 13000 МБ / с при чтении.

Когда я тестировал эту карту с помощью fio в моей системе Ubuntu 16.04, я получил скорость записи около 7000 МБ / с, вот мои тестовые аргументы:

sudo fio -filename=/home/xid/raid0_dir0/fio.test -direct=1 -rw=write -ioengine=sync -bs=2k -iodepth=32 -size=100G -numjobs=1 -runtime=100 -time_base=1 -group_reporting -name=test-seq-write

Я сделал raid0 на карте и сделал файловую систему xfs. Я хочу знать, как достичь скорости записи на диск, такой же высокой, как при выполнении fio, если я хочу использовать такие функции, как "open(),read(),write()" или такие функции, как "fopen(),fread(),fwrite()" в моих консольных приложениях.

0 ответов

Я просто отмечу, что fio Задание, которое вы указали, выглядит немного некорректно:

-direct = 1 -rw = write - ioengine = sync -bs = 2k - iodepth = 32

(для простоты давайте предположим, что черточки на самом деле двойные)

Вышеприведенное спрашивает, пытаясь попросить синхронный ioengine использовать iodepth больше чем один. Это обычно не имеет смысла, и iodepth Раздел документации fio предупреждает об этом:

iodepth = int

Количество модулей ввода / вывода, которые нужно оставить в полете против файла. Обратите внимание, что увеличение iodepth за 1 не повлияет на синхронные ioengines (за исключением небольших степеней, когда используется verify_async). Даже асинхронные движки могут накладывать ограничения ОС, приводя к тому, что желаемая глубина не достигается. [выделение добавлено]

Вы не опубликовали вывод fio, поэтому мы не можем сказать, достигли ли вы когда-либо йодепта больше единицы. 7.5 Гбайт / с кажется слишком большим для такой работы, и я не могу не думать, что ваша файловая система тихо пошла и сделала буферизацию за вашей спиной, но кто знает? Я не могу сказать больше, потому что боюсь, что выход из твоего fio run недоступен.

Также обратите внимание, что данные, которые записывал fio, могли быть недостаточно случайными, чтобы победить сжатие, что помогло достичь искусственно высокой скорости ввода-вывода...

В любом случае, на ваш главный вопрос:

Как достичь скорости записи на диск так же высоко, как это делает fio?

Ваш пример показывает, что вы говорите fio использовать ioengine, который регулярно write звонки. Имея это в виду, теоретически вы должны быть в состоянии достичь аналогичной скорости с помощью:

  1. Предварительное выделение файла и запись только в выделенные части (таким образом, вы не выполняете расширенную запись)
  2. Выполнение всех требований использования O_DIRECT (есть строгое выравнивание памяти и ограничения размера, которые ДОЛЖНЫ выполняться)
  3. Убедитесь, что ваш write Операции работают с буферами, записывающими порциями ровно 2048 байтов (или больше, если они имеют степень двух)
  4. Отправка вашего write s как можно скорее:-)

Вы можете найти не используя O_DIRECT (и, следовательно, разрешить буферизованный ввод-вывод для объединения) лучше, если по какой-то причине вы не можете каждый раз отправлять "большие" хорошо выровненные буферы.

Другие вопросы по тегам