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 с небольшими затратами. Оно будет во-первых масштабируемое, а во-вторых ремонтнопригодное. И отлично дополнит домашнюю «качалку».
Чего опасаться ?
Карты во время работы изрядно нагреваются. Лучше использовать ридеры с металлическими вставками для лучшего теплоотвода.
Вот вроде бы и все. До новых встреч в эфире.
[…] продолжение темы raid из говна и палок действительно недорогих дисков (microSD […]