пятница, 16 сентября 2011 г.

ZFS и geli

Тесты показали, что лучше создавать шифрованные диски с заданным размером сектора. В моем случае размер сектора 4096 байт дал прирост скорости чтения в полтора раза. При этом скорость записи осталась прежней - на уровне 21-22МБ в секунду.

Используйте geli init ... -s 4096 ... - один ключик при создании позволит значительно изменить производительность шифрованного раздела.

четверг, 15 сентября 2011 г.

Создание шифрованного пула zfs в FreeBSD

Для шифрования в ядре FreeBSD есть GELI.
Достаточно быстрая и надежная штука.
Мне надо создать сервер, на котором будут хранится данные, доступ к которым не смогут получить нежелательные люди.

[root@new /]# geli init /dev/gpt/0disk2t
Enter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/gpt_0disk2t.eli and
can be restored with the following command:

        # geli restore /var/backups/gpt_0disk2t.eli /dev/gpt/0disk2t

[root@new /]# geli init /dev/gpt/1disk2t
Enter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/gpt_1disk2t.eli and
can be restored with the following command:

        # geli restore /var/backups/gpt_1disk2t.eli /dev/gpt/1disk2t

[root@new /]#

Далее надо подключить шифрованные диски в систему для создания пула:
[root@new /]# geli attach /dev/gpt/0disk2t
Enter passphrase:
[root@new /]# geli attach /dev/gpt/1disk2t
Enter passphrase:
[root@new /]#

Затем создать пул:
[root@new /]# zpool create data1 raidz /dev/gpt/0disk2t.eli /dev/gpt/1disk2t.eli

Сразу же решил проверить скорость записи, которая была на нешифрованном пуле в районе 32-34МБ в секунду, а скорость чтения была на уровне 86-95МБ в секунду.
Результаты такие:

[root@new /data1]# dd if=/dev/random of=5G bs=1024 count=5123600
5123600+0 records in
5123600+0 records out
5246566400 bytes transferred in 255.912170 secs (20501434 bytes/sec)
[root@new /data1]# dd if=5G of=/dev/null bs=1024
5123600+0 records in
5123600+0 records out
5246566400 bytes transferred in 147.344312 secs (35607526 bytes/sec)
[root@new /data1]#
Скорость стала заметно ниже и на чтении и на записи. Эх... что не сделаешь ради безопасности данных. :)

Запуск системы с zfs пулом из шифрованных дисков.
Я сомневался, что данные будут доступны в пуле raidz, если один из двух дисков будет недоступен. Поэтому до установки в бой решил провести тест.


Создал в пуле файл, сохранил его md5 сумму.
Перегрузил сервер с пулом data1 (см. выше).
После старта запустил команды:
[root@new ~]# geli attach /dev/gpt/0disk2t
[root@new ~]# zfs mount data1
и посмотрел на содержимое пула.
Файл с правильной суммой был на месте! Ура!
Однако zpool status ругался:
[root@new ~]# zpool status
  pool: data1
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://www.sun.com/msg/ZFS-8000-2Q
 scan: none requested
config:

        NAME                 STATE     READ WRITE CKSUM
        data1                DEGRADED     0     0     0
          raidz1-0           DEGRADED     0     0     0
            gpt/0disk2t.eli  ONLINE       0     0     0
            gpt/1disk2t.eli  UNAVAIL      0     0     0  cannot open

errors: No known data errors


Я ввел правильно пароль и подключил шифрованный диск 1disk2t.eli.
Дал команду:
[root@new ~]# zpool online  data1 gpt/1disk2t.eli
И пул у меня стал снова ONLINE!

Ура!
Можно не боятся потери бойцадиска даже с raidz!
Попробую сервер в тестовый бой поставить и посмотреть результаты.

Всем привет! :)

Привет!
Теперь и я в блоге. :)

Замерял скорость записи и чтения в zfs/mfs

Привет!
Довелось мне собрать сервер FreeBSD 8.2-STABLE за сентябрь 2011 года для одной организации. Было свободное время для теста.
Решил провести измерения скорости чтения и записи с дисков в разных вариантах создания пула zfs.

Диски, которые я использовал:
ad5: 1907729MB <Seagate ST32000641AS CC13> at ata2-slave UDMA100 SATA
ad7: 1907729MB <Seagate ST32000641AS CC13> at ata3-slave UDMA100 SATA

Материнка на этом сервере старая, поэтому и не включено и не используется ahci и поэтому диски adX, а не adaX.

Процессор и память на сервере:
Intel(R) Core(TM)2 Duo CPU     E4600  @ 2.40GHz (2402.36-MHz K8-class CPU)
real memory  = 4294967296 (4096 MB)
avail memory = 4093345792 (3903 MB)

Сперва я создал два диска в системе для простого пула zfs со всем доступным объемом и создаю пул:
[root@new /]# gpart create -s gpt ad5
ad5 created
[root@new /]# gpart create -s gpt ad7
ad7 created
[root@new /]# gpart add -t freebsd-zfs -l 0disk2t ad5

ad5p1 added

[root@new /]# gpart add -t freebsd-zfs -l 1disk2t ad7

ad7p1 added

[root@new /]# zpool create data1 /dev/gpt/0disk2t /dev/gpt/1disk2t
[root@new /]# zpool status data1
  pool: data1
 state: ONLINE
 scan: none requested
config:

        NAME           STATE     READ WRITE CKSUM
        data1          ONLINE       0     0     0
          gpt/0disk2t  ONLINE       0     0     0
          gpt/1disk2t  ONLINE       0     0     0

errors: No known data errors
[root@new /]#

Далее в пул данных я решил записать и прочитать 5Гб данных из /dev/random (для полноты теста) одинаковыми блоками по 1024 байт:
[root@new /data1]# dd if=/dev/random of=5G bs=1024 count=5123600
5123600+0 records in
5123600+0 records out
5246566400 bytes transferred in 153.215957 secs (34242950 bytes/sec)
[root@new /data1]# dd if=/dev/random of=5G bs=1024 count=5123600
5123600+0 records in
5123600+0 records out
5246566400 bytes transferred in 154.269003 secs (34009207 bytes/sec)
[root@new /data1]# dd if=5G of=/dev/null bs=1024
5123600+0 records in
5123600+0 records out
5246566400 bytes transferred in 55.372681 secs (94750088 bytes/sec)
[root@new /data1]# dd if=5G of=/dev/null bs=1024
5123600+0 records in
5123600+0 records out
5246566400 bytes transferred in 51.155295 secs (102561551 bytes/sec)
[root@new /data1]#
Таким образом средняя скорость записи получилась 34126078.5 байт в секунду, а чтения 98655819.5 байт в секунду.

Далее я создал пул mirror с этих же дисков и провел точно такие же эксперименты. Средняя скорость за два запуска dd вышла для записи 33746148.5 байт в секунду, а для чтения 75503666.0 байт в секунду.

Я попробовал пул из одного диска, средние скорости записи и чтения вышли 33665851.5 и 97765927.0 байт в секунду.


Потом сделал пул с одним из дисков, а второй диск отдал под log. Опять провел два запуска для записи и для чтения. Средняя скорость в этот раз вышла для записи 34071757.5 байт в секунду, а для чтения
 96930171.0 байт в секунду.

Еще сделал пул с одним диском, а второй отдал под cache. Средняя скорость записи 33854437.5, а чтения - 49479337.0 байт в секунду.

Создал пул raidz из двух дисков. Средние скорости записи и чтения вышли: 33169249.0 и 84283989.0 байт в секунду.

Создал пул raidz с кэшем в RAM:
[root@new /]# mdconfig -a -t malloc -s 128M
md0
[root@new /]# zpool create data1  raidz /dev/gpt/0disk2t /dev/gpt/1disk2t cache /dev/md0

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

Попробовал еще 128М из памяти добавить для log. Итого, пул получился raidz с cache и log по 128М. Средняя скорость записи вышла 32503220.0, а чтения - 84458088.0 байт в секунду.

Попробовал создать пул raidz с кешем 1024М. Существенного отличия в скоростях не получил.

Примонтировал /dev/md0 в /mnt. Попробовал там на размере в 900М те же тесты. И получил среднюю скорость записи 50817911.0, а чтения - 531232665.5 байт в секунду. Вау! :)

Выводы, которые я сделал.
Скорость записи на диски SATA в режиме UDMA100 не будет выше 32-34МБ в секунду. Хоть тресни! А вот скорость чтения в режиме работы mirror оказалась не такой высокой, как ожидалось. Скорость чтения в обычном пуле из двух дисков вышла самая высокая. Но мне для работы нужен надежный пул, который бы смог пережить потерю бойца диска. Поэтому остается mirror или raidz. Я выбрал второй вариант - raidz. Тем, кому нужен пул без всякой надежности на случай выхода из строя диска(-ов), то лучше всего использовать простой пул из дисков, он дает полный объем всех дисков и высокую скорость. Тем, кто создает надежный пул лучше использовать raidz и несколько дисков. Для быстрых файловых систем остается только использовать memory disk из RAM, минус которой пока только один - не сохраняется ничего после перезагрузки.