Пропускная способность SD-карты на машине с Linux

Я пытаюсь запустить пользовательское приложение на встроенной платформе Linux (Linux 4.1). Это приложение непрерывно записывает 1 МБ данных на SD-карту (класс Sandisk UHS I). Приложение использует вызов fwrite() для записи данных на SD-карту.

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

  1. Средняя скорость составляет около 10 Мбайт в секунду.
  2. Мгновенная пропускная способность (измеряемая для передачи 1 МБ) падает после записи каждых 50 МБ данных. Пропускная способность падает до 200 кбайт в секунду.
  3. Я попытался использовать системный вызов write() вместо fwrite() с установленным флагом O_SYNC. При этом мгновенная пропускная способность увеличилась до 1 МБ/с.

В спецификации SD-карты указано, что минимальная поддерживаемая пропускная способность составляет 10 МБ/с. Почему падает мгновенная пропускная способность?

Ожидается ли такое поведение? Что ограничивает мгновенную пропускную способность?

Моему приложению требуется минимальная мгновенная пропускная способность 4 МБ/с. Что я должен делать?


person PRASAD MALLYA    schedule 11.12.2015    source источник
comment
Убедитесь, что ваша файловая система действительно выровнена с размером физического блока, убедитесь, что вы пишете буферы длиной ровно в физический блок, и убедитесь, что у вас достаточно буферной памяти, чтобы отделить источник от того, что хочет делать слой флэш-трансляции карты. Обратите внимание, что пропускная способность интерфейса SD очень отличается от скорости записи (фиксации) данной карты - вы можете быстро получить данные туда, но это может занять некоторое время, чтобы подготовиться к большему.   -  person Chris Stratton    schedule 12.12.2015
comment
Спасибо Дэн! Об этих вещах уже позаботились, физический размер блока составляет 512, а буфер записи — 1 МБ. Согласен скорость будет меньше заявленной производителем, все же 200Кб это очень мало.   -  person PRASAD MALLYA    schedule 12.12.2015
comment
физический размер блока 512 нет, это определенно не так мало для любой современной карты. Где бы вы ни получили эту информацию, она ошибочна — она может отражать эмулируемый размер, а не физический, и это главный подозреваемый в замедлении. Вы хотите сопоставить как размер блока, так и убедиться, что блоки файловой системы выровнены с физическими, что может легко стать проблемой при случайных попытках форматирования. Вероятно, вы также можете позволить себе гораздо больший буфер.   -  person Chris Stratton    schedule 12.12.2015


Ответы (1)


  1. Убедитесь, что интерфейс и драйвер, соединяющий ваше встроенное Linux-устройство с SD-картой, поддерживают пропускную способность. (Например, когда он подключен через «Bitbanging», пропускная способность может быть намного меньше, чем вы ожидаете).
  2. Проверьте пропускную способность с помощью хорошо известного инструмента (dd) и очистите кеш перед: sync; эхо 3 | sudo tee /proc/sys/vm/drop_caches dd if=/dev/zero of= bs=500K count=2024
  3. И, наконец, обратитесь к: https://raspberrypi.stackexchange.com/questions/32884/why-does-the-sd-card-random-write-performance-for-record-size-8-128-kb-drops-bel
person fisehara    schedule 16.08.2016