Постоянная скорость записи на диск

#windows #io #disk

#Windows #io #диск

Вопрос:

Я записываю данные в реальном времени на пустой вращающийся диск последовательно. (РЕДАКТИРОВАТЬ: это не обязательно должно быть последовательным, если я могу прочитать его обратно, как если бы оно было последовательным.) Данные поступают со скоростью 100 МБ / с, а средняя скорость записи на диски составляет 120 МБ / с.

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

Есть ли какой-либо способ записи на диск по шаблону (или каким-либо другим способом), чтобы обеспечить постоянную скорость записи, близкую к средней скорости? Независимо от того, сколько данных в настоящее время находится на диске.

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

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

Обычно запись на диск начинается с быстрой части диска, а затем выполняется запись в более медленные части. Однако, если бы я мог записать половину данных в быструю часть и половину данных в медленную часть (т. Е. За 1 секунду он мог бы записать 50 МБ в быструю часть и 50 МБ в медленную часть), они должны встретиться посередине. Возможно, я мог бы достичь постоянной скорости?

Как программист, я не уверен, как я могу решить, где на блюде записываются данные, или даже если ОС может достичь чего-то подобного.

Комментарии:

1. Если диск почти заполнен, а единственной пустой частью является медленная часть, то это кажется невозможным.

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

3. Просто бросьте массив raid 0 на проблему.

4. … или твердотельный диск.

5. Чтобы уменьшить издержки произвольного доступа, используйте большие операции ввода-вывода. Предположим, что произвольный доступ занимает около 10 МС, а средняя скорость ввода-вывода составляет 100 МБИТ / с. Если ввод-вывод выполняется 10 МБ за раз, это займет 100 МС, поэтому поиск будет стоить 10% накладных расходов. Если ввод-вывод выполняется 100 МБ за раз, накладные расходы на поиск практически незначительны. Использование большого ввода-вывода является частью стратегии сортировки слиянием k-way с одним жестким диском, где k может быть 12 или более.

Ответ №1:

Если бы мне пришлось делать это в обычной системе Windows, я бы использовал устройство с более высокой средней скоростью записи, чтобы обеспечить больший запас. Ожидаемая средняя скорость записи 100 МБ / с по всему диску, рассчитанная на 120 МБ / с, вызовет у вас проблемы. Вращающиеся жесткие диски не имеют постоянной скорости записи по всему диску.

Обычным решением этой проблемы является буферизация в ОЗУ, чтобы скрыть нечастые замедления. Чем больше оперативной памяти вы используете в качестве буфера, тем дольше период замедления, с которым вы можете справиться. Это компромиссы, которые вы должны сделать. Если ваша проблема заключается в известном замедлении внутренних секторов вращающегося диска, то ваше устройство просто недостаточно быстро.

Еще одна вещь, которая может помочь, — получить доступ к диску как можно более напрямую и убедиться, что он не используется другими частями системы. Используйте отдельное физическое устройство, не форматируйте его с помощью файловой системы, записывайте непосредственно в разделенное пространство. Да, вам придется иметь дело с некоторыми проблемами, которые файловая система решает за вас, но вы также пропускаете кучу кода, который вы не можете контролировать. Даже в этом случае у вашего приложения могут возникнуть проблемы с планированием в Windows. Windows не является ОСРВ, нет никаких гарантий в отношении времени. Опять же, это помогло бы больше при временных замедлениях из-за очистки файловой системы, удаления грязных страниц и т. Д. Вероятно, это не сильно поможет с проблемой «последние 100 ГБ записи со скоростью 80 МБ / с».

Если вы действительно застряли с диском, скорость которого варьируется от 120 МБ / с до> 80 МБ / с снаружи внутрь (вы должны протестировать свой собственный код и не доверять спецификациям производителя, чтобы вы знали, с чем имеете дело), тогда вам придется играть в игры с разделениемкак и предлагали другие. На механическом диске это приведет к серьезному поиску заголовка, что может свести на нет ваше улучшение. Чтобы минимизировать запросы, было бы еще более важно убедиться, что это выделенный диск, который ОС не использует ни для чего другого. Кроме того, используйте большие буферы и записывайте много мегабайт за раз, прежде чем искать конец диска. Вместо разбиения на разделы вы можете выполнять запись непосредственно на блочное устройство и контролировать, в какие блоки вы записываете. Я не знаю, как это сделать в Windows.

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

Комментарии:

1. Буферизация не будет работать, так как у меня закончится оперативная память, поскольку я постоянно пишу. Если диск записывает 80 МБ / с последние 100 ГБ, он не будет работать.

2. Избежать файловой системы — интересная идея. Рассмотрит это.

3. Мое предложение о буферизации необходимо прочитать ПОСЛЕ прочтения моего первого абзаца о необходимости большего запаса.

4. Что касается отказа от файловой системы, это может немного помочь, но в основном я считаю, что это поможет избежать временных сбоев, а не замедления, вызванного записью во внутренние и внешние дорожки. Если вы уверены (вы проверили это самостоятельно с помощью своего кода, а не просто доверяли спецификациям производителя), что вы можете обеспечить постоянную запись 120 МБ / с на внешнюю часть диска в течение нескольких минут, то отказ от файловой системы вряд ли поможет. Я обновлю свой ответ.

5. Моя проблема заключается в частых замедлениях. Это постоянное замедление, чем больше записывается на диск, тем медленнее он становится, пока после записи около 70% он больше не отстает от источника. Буферизация поможет только при записи временных замедлений, которые здесь не являются проблемой.

Ответ №2:

Разделите диск на два раздела одинакового размера. Запись данных на несколько секунд, чередующихся между разделами. Таким образом, вы получаете почти всю обычную последовательную скорость, хорошо усредненную. Один поиск диска каждые несколько секунд почти не занимает времени. Один поиск в секунду сокращает время использования с 1000 мс до ~ 990 мс, что на ~ 1% снижает пропускную способность. Чем больше оперативной памяти вы можете выделить для буферизации, тем меньше вам нужно искать.

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

Комментарии:

1. Почему это было отклонено? На самом деле это довольно креативное возможное решение. По крайней мере, это заслуживает комментария, объясняющего снижение.

2. Поиск с одного раздела на другой и обратно легко поглотит преимущество. (Я знаю, что это утверждение столь же необоснованно, как и утверждение usr о том, что его решение может сработать.) Хотя это не мой минус.

3. @DevSolar если у вас есть один поиск каждые несколько секунд, он почти ничего не съест. Я уточнил. Теперь я понимаю, что происходит с понижением. Число казалось составленным.

4. Это может быть хорошей идеей. Хотя, как разделы будут отображаться на диске?

5. @ronag вы можете выбрать точную компоновку разделов при их создании.

Ответ №3:

Я боюсь, что это может быть сложнее, чем вы думаете:

  • Если ваша средняя скорость записи 120 МБ / с соответствует значению производителя, то, скорее всего, она в лучшем случае «оптимистична».
  • Даже сравнительная скорость записи обычно выполняется на неразделенном / отформатированном диске и будет выше, чем вы обычно видите при фактическом использовании (насколько выше — хороший вопрос).
  • Более важным значением является минимальная скорость записи на диск. Например, в тестах жесткого диска Tom’s Hardware 2013 для диска со средней скоростью 120 МБ / с минимальная скорость составляет 76 МБ / с.
  • Диск, который одновременно используется другими приложениями (например, Windows), будет иметь гораздо меньшую скорость записи.
  • Еще более важным значением является фактическая измеренная производительность накопителя. Я бы сделал простое приложение, похожее на ваш вариант использования, которое записывает данные на диск как можно быстрее, пока они не заполнят диск. Сделайте это несколько (дюжин) раз, чтобы получить более реалистичную среднюю / минимальную / максимальную скорость записи value…it скорее всего, он будет ниже, чем вы ожидаете.
  • Как вы заметили, даже если ваша «реальная» средняя скорость записи превышает 100 МБ / с, вы столкнетесь с проблемами, если столкнетесь с низкой скоростью записи непосредственно перед заполнением диска, предполагая, что вам больше некуда записывать данные. Использование буфера в этом случае не помогает.
  • Я не уверен, что в наши дни вы действительно можете указать физическое местоположение для записи на жесткий диск, не заходя в прошивку диска. Даже если бы вы могли, это был бы мой последний выбор для решения.

Несколько конкретных вещей, на которые я хотел бы обратить внимание, чтобы решить вашу проблему:

  • Измерьте «реальную» производительность записи диска, чтобы увидеть, достаточно ли она быстрая. Это дает вам представление о том, насколько вы отстали на самом деле.
  • Поместите ОС на отдельный диск, чтобы убедиться, что диск с данными не используется ничем, кроме вашего приложения.
  • Получите более быстрые диски (HDD или SDD). Можно использовать скорости записи производителя в качестве начального ориентира, но также тщательно протестировать их.
  • Получите больше дисков и поместите их в конфигурацию RAID0 (или аналогичную) для более быстрого доступа к записи. Вы снова захотите проверить это, чтобы убедиться, что это работает для вас.

Комментарии:

1. Это среднее значение 120 МБ / с, как мы его измерили.

2. Спасибо за усилия. Но предоставленная вами информация является своего рода лучшим изложением моей проблемы, а не решением.

Ответ №4:

Вы могли бы реализовать стратегию чередования операций записи как внутри, так и снаружи, напрямую управляя местами записи на диск. В Windows вы можете открыть диск, например «. PhysicalDriveX» и контролируйте, куда он записывает. Для получения дополнительной информации см.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858 (v= против 85).aspx

Комментарии:

1. Возможная идея. Может быть, немного более подробное объяснение, чем справочная страница?

Ответ №5:

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

  1. Создайте пустой, не разреженный файл такого размера, какой поместится в файловой системе.
  2. Получите сопоставление логических позиций файлов с блоками диска.
  3. Измените это сопоставление, чтобы можно было сопоставлять блоки диска с логическими позициями файлов. Конечно, некоторые блоки недоступны из-за собственного использования файловой системы.

На этом этапе диск выглядит как необработанный диск, к которому вы получаете доступ через дисковый блок. Допустимо предположить, что адресация этого блока в основном однообразна номеру физического цилиндра. IOW если вы увеличите номер блока диска, номер цилиндра никогда не уменьшится (или никогда не увеличится — в зависимости от LBA диска для физического порядка сопоставления).

Также обратите внимание, что средняя скорость записи на диск может быть указана на цилиндр или на единицу памяти. Откуда вы знаете? Вам нужно последнее число, и единственный верный способ получить его — самостоятельно протестировать его. Вам нужно заполнить весь диск данными, многократно записывая нулевую страницу на диск, блок за блоком, и разделить общий объем записанных данных на объем, который потребовался. Вам необходимо получить доступ к диску или файлу в прямом режиме. Это должно отключить буферизацию ОС для файловых данных, а не для метаданных файловой системы (если не используется необработанный диск).

На этом этапе все, что вам нужно сделать, это записать блоки данных разумных размеров в двух крайних значениях номеров блоков: вам нужно заполнить диск с обоих концов внутрь. Размер блоков данных зависит от потери полосы пропускания, которую вы можете разрешить для запросов. Вы также должны предположить, что жесткий диск может время от времени запрашивать обновление своих служебных данных. Предполагая, что поиск в худшем случае занимает 15 мс, вы тратите 1,5% пропускной способности в секунду на каждый поиск. Предполагая, что вы можете сэкономить не более 5% пропускной способности, в среднем 1 поиск / с для самого диска, вы можете выполнять поиск дважды в секунду. Таким образом, размер вашего блока должен быть your_bandwith_per_second/2 . Эта пропускная способность — это не пропускная способность диска, а пропускная способность вашего источника данных.

Увы, если только все так просто. Обычно оказывается, что пропускная способность в середине диска не является средней пропускной способностью. Во время тестирования вы также должны учитывать скорость записи на меньших участках диска, скажем, на каждые 1% диска. Таким образом, при записи в каждый раздел диска вы можете выяснить, как разделить данные между «низким» и «высоким» разделом, в который вы записываете. Предположим, что вы начинаете с позиций 0% и 99% на диске, а нижняя позиция имеет пропускную mean*1.5 способность, а верхняя позиция имеет пропускную mean*0.8 способность, где mean ваша желаемая средняя пропускная способность. Затем вам нужно будет записать 100% * 1.5/(0.8 1.5) часть данных в младшую позицию, а остаток ( 100% * 0.8/(0.8 1.5) ) в более медленную верхнюю позицию.

Размер вашего буфера должен быть больше, чем просто размер блока, поскольку вы должны предположить некоторую задержку в наихудшем случае для жесткого диска, если он сталкивается с поврежденными блоками и нуждается в перемещении данных и т. Д. Я бы сказал, что 3-секундный буфер может быть разумным. При желании она может расти сама по себе, если задержки, которые вы измеряете во время работы вашего программного обеспечения, оказываются выше. Этот буфер должен быть заблокирован («закреплен») в физической памяти, чтобы он не подвергался замене.

Ответ №6:

Другим возможным вариантом является уничтожение (или короткий ход) жесткого диска. Если вы начнете с диска объемом 4 ТБ или больше и уменьшите его до 2 ТБ, будут использоваться только внешние части дисков, что приведет к более высокой пропускной способности. Проблема заключается в том, что программное обеспечение, которое выдает уникальные команды поставщика на жесткий диск, уничтожает его.