ZFS и iSCSI на FreeBSD


Поигрался немного с iSCSI и добавлением iSCSI устройств в zpool. Все хорошо, все работает, но к сожалению, ровно до тех пор, пока iSCSI не отваливается.

Как только отваливается iSCSI устройство, любой процесс обратившийся к пулу вешается навеки до перезагрузки или до восстановления устройства. Система не может нормально сообщить, что устройство в дауне и zfs ожидает ответа до упора. Как выяснилось позжее, на самом деле это зависает инициатор при потери связи с сервером. И все процессы пытающиеся подключиться к /dev/daX получают хардлок. Вроде, в каких-то случаях получается снять процес iscontrol, но не всегда.

В процессе эксплуатации возник еще один момент. При подключении iSCSI ресурса к FreeBSD в zpool с другого сервера FreeBSD оно очень медленно работало, до 1 мб/сек. После некоторых поисков нашел у человека такую же проблему:

был дико расстроен, оценив производительность фришного iscsi инициатора.
solaris10 (zfs, share_iscsi=on) -> freebsd (da0, поверх него еще раз zfs для удобства работы со снапшотами).
на бсд был запущен неткат с перенаправлением в zfs receive.
копирование 80 гигов мейлдиров показало скорость записи в районе 1 (одного) мегабайта в секунду. убийственно медленно.

Решение:

camcontrol tags daX -N128

После этого скорость поднялась до 10-15 мбайт/сек. Это на виртуальной машине. На физической пошло до 40мбайт/сек. Это при условии, что iSCSI сервер слабенькая машинка, ресурс лежит на ZFS со включеным сжатием, и устройство на котором создан pool шифруется и занятость процессора системой достигает 93%.

Параметры сервера:

FreeBSD 10.0-RELEASE amd64
hw.machine: amd64
Intel(R) Pentium(R) Dual  CPU  E2140  @ 1.60GHz
hw.physmem: 1038934016

Параметры клиента:

FreeBSD 9.0-RELEASE amd64
hw.machine: amd64
hw.model: Intel(R) Core(TM) i5 CPU         750  @ 2.67GHz
hw.physmem: 8559054848