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

Я записываю данные в реальном времени в пустой вращающийся диск последовательно. (EDIT: он не обязательно должен быть последовательным, если я могу его прочитать, как если бы он был последовательным.) Данные поступают со скоростью 100 МБ/с, а диски имеют среднюю скорость записи 120 МБ/с.

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

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

EDIT:

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858 (v = vs .85).aspx

Ответ 5

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

  • Создайте пустой, не разреженный файл, размер которого будет соответствовать размеру файловой системы.

  • Получите сопоставление с позиций логических файлов на блоки диска.

  • Отмените это сопоставление, чтобы можно было отобразить из блоков диска в позиции логического файла. Конечно, некоторые блоки недоступны из-за использования файловой системы.

В этот момент диск выглядит как необработанный диск, к которому вы обращаетесь с помощью блока диска. Это допустимое предположение, что эта блочная адресация в основном монотонна для физического номера цилиндра. 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 ТБ, будут использоваться только внешние части пластин, что приведет к более высокой пропускной способности. Проблема заключается в получении программного обеспечения, которое выводит уникальные команды поставщика на жесткий диск, чтобы уничтожить его.