Сжатие JFS

Все данные могут перед записью на диск автоматически сжиматься с помощью алгоритма Lempel-Zev (LZ), а при чтении - автоматически разворачиваться. Алгоритм LZ основан на замене встречающихся последовательностей символов на указатель на первое вхождение последовательности. Применение этого алгоритма позволяет сэкономить в среднем около 50 процентов дискового пространства.

Данные файловых систем сжимаются на уровне отдельных логических блоков. Сжатие данных в более крупных блоках (например, во всей совокупности логических блоков выбранного файла) привело бы к менее эффективному использованию дискового пространства. Сжатие отдельных логических блоков файла позволяет существенно ускорить выполнение операций неупорядоченного поиска и обновления данных.

Алгоритм сжимает данные блоками по 4096 байт (1 страница) и сохраняет сжатые данные в виде минимально необходимой последовательности непрерывных участков. Очевидно, что если в файловой системе используются непрерывные участки дискового пространства по 4 КБ, сжатие данных не приведет к экономии дискового пространства. Таким образом, при использовании сжатия данных в файловой системе должны применяться фрагменты размером менее 4096 байт.

Несмотря на то, что сжатие данных в общем случае позволяет более эффективно использовать место на диске, в файловой системе все же может оставаться неиспользуемое пространство:

  • В связи с тем, что степень сжатия блоков размером 4096 байт заранее неизвестна, файловая система резервирует для данных полный блок. Ненужные участки диска освобождаются после сжатия, однако такая процедура предварительного выделения памяти может привести к более раннему появлению сообщений о нехватке места.
  • Свободное место необходимо для работы команды defragfs.

Помимо увеличения числа операций ввода-вывода и фрагментации свободного пространства, при использовании файловых систем со сжатием данных следует также учитывать следующие факторы, влияющие на производительность:

  • Низкая скорость работы с файловой системой может быть прямым следствием использования алгоритмов сжатия/разворачивания данных. Если время сжатия и разворачивания данных сравнительно велико, то применение функций сжатия может оказаться нецелесообразным, особенно в коммерческой среде, когда данные должны предоставляться очень быстро.
  • При первом изменении для всех логических блоков файловой системы со сжатием выделяется по 4096 байт дискового пространства; после записи логического блока на диск это пространство перераспределяется. Такое перераспределение требует затрат дополнительных ресурсов, которых можно избежать в файловых системах без сжатия данных.
  • Для сжатия каждого байта данных необходимо в среднем 50 циклов CPU, а для разворачивания - в среднем 10 циклов. Таким образом, сжатие данных увеличивает нагрузку на процессор.
  • Процесс сжатия JFS (jfsc) kproc работает с фиксированным приоритетом, равным 30, поэтому ресурсы CPU, на котором работает kproc, во время сжатия могут оказаться недоступными для процессов, работающих с меньшим приоритетом.