Сжатие можно включить для отдельных табличных пространств. При этом системные отношения не сжимаются в любом случае. В настоящее время изменить характеристику сжатия табличного пространства невозможно — то есть нельзя сжать существующее табличное пространство или наоборот, сделать сжатое пространство несжатым.
Поэтому, чтобы использовать сжатие/шифрование, необходимо создать табличное пространство с параметром compression=true. Вы можете сделать это табличное пространство пространством по умолчанию — в этом случае все таблицы будут неявно создаваться в нём:
postgres=# create tablespace zfs location '/var/data/cfs' with (compression=true);
postgres=# set default_tablespace=zfs;
Шифрование на данный момент поддерживается только со сжатием: использовать шифрование без сжатия невозможно. Чтобы включить шифрование, нужно задать для параметра cfs_encryption значение true и задать ключ шифрования в переменной окружения PG_CIPHER_KEY.
CFS имеет следующие конфигурационные параметры:
cfs_encryption (boolean) Включает шифрование сжимаемых страниц. По умолчанию отключён.
cfs_gc_workers (integer) Число фоновых процессов сборки мусора CFS (по умолчанию: 1).
cfs_gc_threshold (integer) Процент мусора в файле, при котором нужно дефрагментировать его содержимое (по умолчанию: 50%).
cfs_gc_period (integer) Пауза между проходами сборщика мусора CFS, в миллисекундах (по умолчанию: 5 секунд)
cfs_gc_delay (integer) Задержка в миллисекундах после операции дефрагментации файла (по умолчанию: 0)
cfs_level (integer) Уровень сжатия CFS (по умолчанию: 1). Значение 0 отключает сжатие, 1 включает самое быстрое сжатие. Максимальный уровень сжатия зависит от конкретного алгоритма: это 9 для zlib, 19 для zstd...
По умолчанию CFS использует для сборки мусора один рабочий процесс. Сборщик мусора проходит по каталогу табличного пространства, находит в нём файлы отображений и проверяет в них процент мусора. Если отношение неиспользуемого объёма к общему превышает значение cfs_gc_threshold, этот файл дефрагментируется. На время дефрагментации файл блокируется, в результате чего ни к какой его части нельзя обратиться. По завершении фрагментации сборщик мусора ждёт cfs_gc_delay миллисекунд и продолжает проход по каталогу. Завершив проход, он ждёт дополнительно cfs_gc_period миллисекунд и начинает новый проход. Если для CFS настроено несколько процессов сборки мусора, они разделяют свою работу по хешу дескриптора файла (inode).
Также возможно запустить сборку мусора вручную, воспользовавшись функцией cfs_start_gc(n_workers). Эта функция возвращает число рабочих процессов, которые были фактически запущены. Заметьте, что если параметр cfs_gc_workers отличен от нуля, сборка мусора выполняется в фоне и функция cfs_start_gc ничего не делает, а просто возвращает 0.
Эффект от сжатия таблицы можно оценить предварительно, воспользовавшись функцией cfs_estimate(relation). Эта функция считывает первые десять блоков отношения, пытается сжать их и возвращает средний коэффициент сжатия. Так, если она возвращает значение 7.8, это означает, что сжатая таблица будет занимать почти в 8 раз меньше места, чем исходная.
Функция cfs_compression_ratio(relation) позволяет проверить, насколько точной была оценка, выданная функцией cfs_estimate(relation). Она возвращает фактический коэффициент сжатия для всех сегментов сжатого отношения. Коэффициент сжатия рассчитывается как результат деления общей суммы виртуальных размеров всех сегментов отношения (числа блоков, умноженного на 8 Кбайт) на сумму физических размеров его файлов сегментов.
Как было сказано ранее, CFS всегда добавляет изменённые строки в конец сжатого файла. Поэтому физический размер файла может быть больше объёма полезных данных в нём. Другими словами, файл CFS становится фрагментированным и поэтому сборщик мусора CFS периодически проводит в нём дефрагментацию. Функции cfs_fragmentation(relation) возвращают средний коэффициент фрагментации файлов отношения, который вычисляется как результат деления суммы физических размеров файлов минус используемый объём в этих файлах на сумму физических размеров данных файлов.
Дефрагментировать отдельное отношение можно с помощью функции cfs_gc_relation(relation). Эта функция может использоваться, только если неактивны рабочие процессы сборки мусора (cfs_gc_workers равняется нулю). Она возвращает число дефрагментированных сегментов отношения. Если отношение с таким OID не находится или оно не сжато, либо активен другой процесс, возвращается 0.
Для наблюдения за активностью, связанной со сборкой мусора, предлагаются следующие функции: cfs_gc_activity_scanned_files (возвращает число файлов, просканированных при сборке мусора), cfs_gc_activity_processed_files (возвращает число файлов, сжатых при сборке мусора), cfs_gc_activity_processed_pages (возвращает число страниц, перемещённых сборщиком мусора в процессе дефрагментации файлов) и cfs_gc_activity_processed_bytes (возвращает общий объём перемещённых страниц). Все эти функции подсчитывают значения с момента запуска системы.