Оптимальный размер буфера для записи (2) - PullRequest
3 голосов
/ 10 января 2012

Допустим, я хочу записать 1 ГБ данных в файл, скажем, ext3 в файловой системе Linux, используя write(2) системный вызов, и это происходит в очень загруженной среде (многие подобные операции ввода-вывода). concurently). Каков оптимальный размер буфера в интервале, скажем, [4 kB, 4 MB], чтобы сделать это, когда

  1. не использует O_DIRECT флаг открытия или
  2. с использованием O_DIRECT?

Пожалуйста, не отвечайте "проверьте сами" - я бы хотел получить ответ от ребят из "файловых систем".

Ответы [ 3 ]

8 голосов
/ 10 января 2012

По моему опыту, ответ гораздо больше зависит от базовых устройств и оборудования, а не от самой файловой системы - то есть буферных кешей на устройстве и возможностей устройства для записи в виде небольших блоков и т. Д. - однако вам следуетникогда не пишите в меньших размерах, чем размер блока вашей файловой системы (stat(.) - вероятно, будет около 4kb ) - аналогично, вы не должны превышать размер кэш-памяти L2 / L3 ЦП, который во многихслучаи могут быть столь же низкими как 512kb .

Учитывая, что SSD-устройства и подобные похожи на 64 КБ в качестве единицы операций, я бы предложил, чтобы размер буфера 64 КБ-128 КБ был наиболее оптимальным -- которые также соответствуют моему эмпирическому опыту как обладающему самой высокой пропускной способностью.

5 голосов
/ 10 января 2012

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

  • небольшое кратное размеру файловой системы (см. Комментарий Йоахима Пилеборга, предлагающий stat(".") и т. Д.)
  • степень двойки (потому что компьютеры и ядра похожи на них)
  • не слишком большой (например, вписывается в какой-то кэш внутри вашего процессора, например, в кэш L2)
  • выровнено в памяти (например, по размеру страницы, используя posix_memalign).

Так что, вероятно, должна подходить мощность от двух до 16 Кбайт и несколько мегабайт. Большая часть времени уходит на чтение диска. Тесты файловой системы и диска в этом диапазоне довольно плоские.

4 Кбайт, по-видимому, часто являются размером страницы и размером порции диска.

Конечно, вы можете настраивать, даже настраивать, при создании файловой системы с mke2fs размером блока файловой системы.

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

0 голосов
/ 10 января 2012

Включая stdio.h, следует определить BUFSIZ как оптимальный размер для системы. Это ни в коем случае не гарантируется, но это правильное значение, если у вас нет возможности проводить обширные тесты, и это хорошая отправная точка для таких тестов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...