Изменения

Перейти к: навигация, поиск

Простой FTL для флешек

4050 байтов добавлено, 22:18, 4 июня 2013
м
Запись
В-третьих, нужен и фоновый сборщик мусора, хотя бы с жадной стратегией.
 
=== TRIM ===
 
При нашей простейшей структуре хранилища TRIM — некоторая проблема, ибо метаданные жёстко связаны с данными, а при TRIM новую версию метаданных нужно сохранять, не сохраняя сами данные.
 
Что можно сделать: добавить в структуру информации о кластере флаг trim и сохранять в сегменте пустой trim’нутый кластер с увеличенной версией. Причём, кластеры, содержащие trim’нутые данные, пустыми можно считать не раньше, чем либо trim’нутые данные будут перезаписаны новой версией, либо (!) будут перезаписаны все также находящиеся на диске предыдущие версии этих данных. Чтобы отслеживать второе условие — в оперативной памяти потребуется хранить ещё и счётчик «живых» предыдущих версий каждого блока.
 
Далее — TRIM легче реализовать, если длина данных блока не считается постоянной — например, если мы также применяем сжатие на уровне блочного устройства. В этом случае сегмент можно делать любого размера, писать в него данные, начиная с начала, и метаданные, начиная с конца. То есть, в последнем 512-байтном блоке сегмента будет содержаться 16-байтный заголовок блока метаданных (самое интересное в котором — это сколько ещё блоков метаданных есть перед этим блоком), и 31 структура метаданных сегментов, с 1-го по 31-ый (тоже по 16 байт = 32 бита номер блока, 32 бита номер версии, 1 бит TRIM, 31 бит размер, 32 бита контрольная сумма). Если при этом в сегменте есть ещё кластеры, то в предпоследнем блоке сегмента хранится информация о кластерах с 32-го по 62-ой; в предпредпоследнем — с 63-го по 93-й, и так далее. TRIM’нутый блок, очевидно, имеет размер 0. Кстати, флаг TRIM можно даже не хранить, а просто считать TRIM’нутым кластер с размером 0; зато, возможно, будет полезно хранить флаг сжатия и давать сохранять несжатые данные.
 
Тут и приходит осознание — сколько же места потенциально тратится «впустую» в SSD’шках на контроллерах SandForce (у них прозрачное сжатие), и сколько оперативной памяти тратится в SSD’шках в целом…
 
=== Барьеры / сброс данных на диск ===
 
Всякая хрень типа СУБД может иногда (при коммите транзакций) требовать гарантированной отправки данных на диск. Если сегмент при этом ещё не заполнился, его нужно записать неполным, а когда заполнится — перезаписать ещё раз. Это гораздо дешевле, чем оставлять фрагментированный сегмент.
== Locking ==

Навигация