SandForce (2)
А работает этот SandForce, скорее всего, так: у него внутри неонка и N мегабайт буфера, в котором лежат последние N мегабайт приехавших в накопитель данных.
В следующий момент в накопитель приходит блок данных некоторого размера, который велено положить по LBA-адресу X. Этот блок сравнивается с содержимым буфера, внезапно обнаруживается, что там уже есть такой же блок, ранее положенный по LBA-адресу Y в реальный флэшовый адрес Z (обозначим это как «Y→Z») — после чего новые данные просто выбрасываются, а в lookup-таблицу пишется «X→Z». То есть, запись нового блока происходит практически мгновенно.
Выяснить здесь остаётся две вещи: размер блока данных и размер буфера сравнения. Первый, подозреваю, равен LBA’шному сектору (чисто потому что возни с последующим пересчётом «кто где лежал» меньше), а второй завтра узнаем.
P.S. При этом понятно, что ту же память можно одновременно использовать и как обычный буфер чтения-записи.


Не лучше ли хранить и сравнивать хеши?
Часть памяти под хеши, часть под буфер чтения/записи.
Смотря что накладнее, держать больше памяти или считать хеши.
Ну и да, то, что ушло под хеши, в качестве буфера использовать уже нельзя. А при хранении исходных данных вся эта память может быть использована как буфер, потому как хранится фактически то же, что в обычном буфере, только ещё лучше — без дублирования.
Такой алгоритм череповат тем, что при наличии двух записей на один физический блок, может возникнуть ситуация, когда одну из записей надо будет модифицировать. Впринципе никто не мешает откопировать его и переписать индекс, но всё же...
Я тут смотрел презенташки по SF, и обнаружил интересный слайд, с примером, что при установке Win7 + Office, логически записывается 25 Гб, а физически только 11 Гб. Т.е. как бы износ памяти уменьшается. Ну так вот, возможен альтернативный вариант. Контроллер каким-то образом индексирует логически пустое место диска, ведь данные не затираются наглухо в ноль при удалении, и при обнаружении уже готового блока, скажем полностью забитого нулями, присваивает ему индекс, не записывая в память ничего. Смущает только, что вроде как размер блока у флэш памяти что-то около 128 Кб, и вероятность таких совпадений крайне мала.
Ну и надо понять загадочно сильную производительность с 4К секторами, производительность даже с рандомным заполнением падает несущественно.
Не надо ничего никуда копировать. Новая запись пишется по новому физическому адресу и для него пишется новый индекс, а счётчик количества ссылок на первый физадрес уменьшается на 1.
интересно кто кого забодает по патентам, сан или сэндфорс zfs_dedup
Полагаю, у одних патенты на «файловую систему с...», а у других — на «контроллер SSD-накопителя...».