[О блоге]
[наверх]
[пред]
[2018-02-16 11:01:08+03:00]
[b4fa50437340751e9dc0a6837a526ef2ea30ab1e]
Темы: [nncp][zfs]
Попробовал дедупликацию в ZFS
И всё оказалось не так просто как, не задумываясь, ожидалось.
Нужно мне это для NNCP. В нём есть возможность посылать файлы разбитыми
на куски. В итоге на приёмной стороне оказывается file.part0,
file.part1, итд. nncp-reass команда учитывая файл с метаинформацией и
хэшами, просто делает фактически: cat file.part0 file.part1 ... > file.
То есть копирование файлов as-is. Идеальный вариант для dedup.
Сделал я временный файл с рандомом внутри:
dd if=/dev/zero bs=1M count=100 | gohpenc -psk ... > out
Копирую его:
for i in `seq 100`; do cp out out$i ; done
Вижу что zfs list показывает что занято 1 гигабайт (а не 100 мегабайт),
однако свободное место практически не тронуто. zpool get dedup
показывает что дофига данных дедуплицировано. Всё хорошо.
Но сделав аналог cat file.part* > file:
for i in `seq 100`; do cat out >> out2 ; done
я вижу что дедуплицировано почти ничего: жалкий 1%.
Проблема в том какие данные попадают в блоки. Выхлоп gohpenc оказался
кратен только одному килобайту, но не кратен даже двум или, тем более,
128 килобайт. При копировании файла блоки действительно будут созданы
точно такие же.
| 128 KiB | 128 KiB | 128 KiB |
|---BlockA-------+---BlockB-------+-BlockC-|
и дедупликация работает на 100%. Но если я их сконкатенирую, то будет
следующее:
| 128 KiB | 128 KiB | 128 KiB | 128 KiB | ...
|---BlockA-------+---BlockB-------+-BlockC-+--BlockA-------+---BlockB-...
то есть совпадёт только N-1 блоков этого out файла, а дальше ничего,
возможно местами только будут совпадения.
Что делать и как быть? Знать свои данные. Делать данные кратными
recordsize или его выставлять чтобы был кратный данным. В случае с NNCP
это значит надо выставлять размер chunk-а соответствующий (например
кратный 128 килобайтам).
[оставить комментарий]