eBay RAID

RAID — redundant array of independent disks или redundant array of inexpensive disks — избыточный массив независимых дисков или массив недорогих дисков.

Идея собрать raid какого-нибудь уровня на microSD дисках давно витала в воздухе и не давала покоя. Масла в огонь подливала цена на китайские изделия.

Итак, решено. Закупаем на eBay комплектуху и собираем RAID в Linux на сверхдешевых компонентах. Нам понадобится:

  • USB HUB не менее, чем на 5 портов (5 USD)
  • 5 кардридеров (5x1USD)
  • 5 microSD карт, допустим для начала на 2гб. (5x3USD)

Итого, где-то 1000 рублей по курсу на апрель-месяц, вполне терпимо.
Все необходимое нашлось, правда карты пришлось закупать в МСК, благо была распродажа в одной из крупных контор.

Что из этого получилось…

Итак, план:

  • Объединяем 5 microSD карт в массив
  • Монтируем его
  • Тестируем скорость
  • PROFIT!

Первая подстава случилась в момент проверки полученного USB-хаба. Мало того, что он эээ… немного развалился при попытке включить, так еще и внутри обнаружился дикий непропай разъемов. Ну ладно, суперклей, паяльник, вроде все работает как надо.

Подстава номер два  — один из ридеров проглотил карту в прямом смысле этого слова — она тупо ушла внутрь, то есть разъем был изначально сломанным. Еще раз суперклей, теперь точно все ок.

Слава богу, карточки Apacer на 2 GB вроде не подвели.

Прежде чем собирать массив, можно почитать матчасть по выравниванию партиций на SD-картах. Дело в том, что на флеш устройствах запись идет «поблочно» и если адресуется группа байт, лежащая на границе блоков, то запись выполняется 2 раза. Вообще, все расчеты очень условны и лежат на грани шаманизма. Тем не менее, вот несколько ссылок, где все расписано от начала до конца.

http://www.patriotmemory.com/forums/showthread.php?3696-HOWTO-Increase-write-speed-by-aligning-FAT32

http://www.olpcnews.com/forum/index.php?topic=4993.0

http://blogofterje.wordpress.com/2012/01/14/optimizing-fs-on-sd-card/

Поскольку карты одинаковые, проверяем одну на предмет размера блока и создаем разделы.

Нам понадобится 2 раздела на каждой карте:

  • Первый раздел — ext2, он отвечает за выравнивание — чтобы второй раздел начинался четко с начала блока. А еще, поскольку карты идентичные, ридеры идентичные, то единственный способ идентифицировать флешку — сделать e2label на первую партицию и обозвать ее скажем «microSD1» (e2label /dev/sdd1 «microsd1»). Ибо совершенно необязательно, что флешка определится как /dev/sdd. При следующем вставлении она может быть будет уже /dev/sdc или sdh.
  • Второй раздел — Linux raid. Его идентификатор в fdisk — «fd». Начинается он как раз на границе блоков.

В конечном итоге получаем что-то вроде такого:


ls -la /dev/disk/by-label/
total 0
drwxr-xr-x 2 root root 180 Jun 11 18:28 .
drwxr-xr-x 6 root root 120 Jun 8 20:07 ..
lrwxrwxrwx 1 root root 10 Jun 8 20:07 boot -> ../../sda1
lrwxrwxrwx 1 root root 10 Jun 8 20:07 data -> ../../sdb2
lrwxrwxrwx 1 root root 10 Jun 11 18:28 microsd1 -> ../../sdg1
lrwxrwxrwx 1 root root 10 Jun 11 17:24 microsd2 -> ../../sdf1
lrwxrwxrwx 1 root root 10 Jun 11 17:24 microsd3 -> ../../sde1
lrwxrwxrwx 1 root root 10 Jun 11 17:24 microsd4 -> ../../sdd1
lrwxrwxrwx 1 root root 10 Jun 8 20:07 swap -> ../../sdb1

Теперь вычислить, какие именно части рейда присутствуют и получить список вставленных дисков можно скриптом. В содружестве с udev можно все автоматически определять. К сожалению, autodetect работать не будет, партиция не первая, да и так как-то надежнее.

Ок, делаем RAID5 на 5ти дисках. Для этого требуется команда mdadm.


mdadm --create /dev/md0 --level=raid5 --raid-devices=5 /dev/sd[gfedh]2

mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

Что-то все как-то медленно собирается и проверяется… Что-то не так.
@#$! Китайский продавец тупо подсунул hub на версии 1.1…facepalm.jpg.

Ладно, контрольные замеры для определенности будут ниже, а пока что исправляем ситуацию. Берем еще один хаб, теперь уже на 4 порта и заведомо 2.0. Это даже лучше, ибо микросхема одна (вместо 2х), значит и «дергаться» все должно быстрее.

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

Всего проводилось 5 видов тестирования:

  • RAID5 USB1 5 cards
  • RAID5 USB2 4 cards
  • RAID0 USB2 4 cards
  • RAID10 USB2 4 cards
  • Single Card

Замеры проводились в 2х режимах:

  • Big File — пишем один большой файл на 160 мб
    sync; rm testing; sync; time ( dd if=/dev/zero of=testing bs=16k count=10000; sync)
  • Small File — пишем 1000 файлов по 160кб
    sync; rm -rf testing*; sync; time ( for item in `seq 1 1000`; do dd if=/dev/zero of=testing.$item bs=16k count=10; sync; done; )

Единицы измерения — Mb/s

Drive type Big File Small files
USB1/RAID5/5 0.7 0.01
USB2/RAID5/4 4.25 0.25
USB2/RAID0/4 12.22 0.72
USB2/RAID10/4 8 0.44
USB2/SINGLE FLASH 5 0.64

Можно сразу игнорировать первую строку таблицы. USB1 — чудовщная ошибка :-)

RAID5 — есть потери в скорости по сравнению с единичной флешкой, но при этом повышается надежность.

RAID0 — бешеный прирост в скорости на большом файле. Небольшой выигрыш на куче мелких. Но надежность никакая — ибо при смерти одной флешки все остальное тоже можно хоронить.

RAID10 — хороший компромисс, но стоимость мегабайта (гигабайта) сравнительно высока.

Вот тут ссылка на калькулятор RAID: http://www.ibeast.com/content/tools/RaidCalc/RaidCalc.asp

Ну и для статистики скорость чтения файла через hdparm. Все тестируется на USB2/4 cards

RAID5:
hdparm -t /dev/md0
/dev/md0:
Timing buffered disk reads: 126 MB in 3.02 seconds = 41.70 MB/sec

RAID10:
hdparm -t /dev/md0
/dev/md0:
Timing buffered disk reads: 110 MB in 3.05 seconds = 36.09 MB/sec

Single flash:
hdparm -t /dev/sdd2
/dev/sdd2:
Timing buffered disk reads: 42 MB in 3.12 seconds = 13.44 MB/sec

Для сравнения — обычный жесткий диск с интерфейсом USB:
hdparm -t /dev/sdb
/dev/sdb:
Timing buffered disk reads: 28 MB in 3.05 seconds = 9.19 MB/sec

Ну а дальше начинаются нарушения законов физики, учитывая что теоретическая пропускная способность USB2 — 60 Mb/s…

Тестирование проводилось на файле в 500мб и команде dd.

RAID5:

time (dd if=flashbox.img.bz2 of=/dev/null)
1061259+1 records in
1061259+1 records out
543365075 bytes (543 MB) copied, 4.4556 s, 122 MB/s

real 0m4.471s
user 0m1.040s
sys 0m3.432s

RAID10:

time (dd if=flashbox.img.bz2 of=/dev/null)
1061259+1 records in
1061259+1 records out
543365075 bytes (543 MB) copied, 4.48813 s, 121 MB/s

real 0m4.504s
user 0m1.028s
sys 0m3.476s

RAID0:

time (dd if=flashbox.img.bz2 of=/dev/null)
1061259+1 records in
1061259+1 records out
543365075 bytes (543 MB) copied, 3.82836 s, 142 MB/s

real 0m3.844s
user 0m1.008s
sys 0m2.836s

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

И даже есть куда расти:

  • Использовать разные контроллеры на материнской плате. «Очередь» команд будет обслуживаться быстрее
  • Сделать более глубокую оптимизацию размеров сектора  в зависимости от карты (см. ссылки вначале)

Учитывая постоянное снижение цен на flash-накопители уже сейчас можно построить хранилище на ~100gb с небольшими затратами. Оно будет во-первых масштабируемое, а во-вторых ремонтнопригодное. И отлично дополнит домашнюю «качалку».

Чего опасаться ?

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

Вот вроде бы и все. До новых встреч в эфире.

Реклама

One Response to eBay RAID

  1. […] продолжение темы raid из говна и палок действительно недорогих дисков (microSD […]

Добавить комментарий

Please log in using one of these methods to post your comment:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: