начало изменения

Сжатие данных с помощью библиотеки zlibNX

Библиотека zlibNX представляет собой расширенную версию библиотеки сжатия данных zlib, которая поддерживает сжатие и распаковку данных с применением сопроцессоров, называемых встроенными ускорителями (NX), на серверах с процессорами IBM® POWER9™. Библиотека zlibNX доступна в IBM AIX® 7.2 с пакетом расширения Technology Level 4 и выше.

Библиотека zlibNX соответствует следующим стандартам RFC:

  • RFC 1950 (спецификация формата сжатых данных zlib)
  • RFC 1951 (спецификация формата сжатых данных DEFLATE)
  • RFC 1952 (спецификация формата файла gzip)

Стандарты RFC обеспечивают совместимость между разными реализациями библиотеки zlib. Данные, сжатые с помощью библиотеки zlibNX, могут быть распакованы стандартной библиотекой zlib. Данные, сжатые с помощью стандартной библиотеки zlib, могут быть распакованы библиотекой zlibNX.

Настройка приложений для использования интерфейса zlibNX

Наличие возможности использовать интерфейс zlibNX в приложении зависит от того, как приложение компонуется с библиотеками libz.so.1 или libz.a:
  • Если приложение не компонуется с библиотекой libz.a или libz.so.1, его необходимо перекомпилировать или перекомпоновать с архивным файлом zlibNX и заголовочными файлами zlibNX из каталога /usr/opt/zlibNX/include/.
  • В случае статической компоновки приложения с библиотекой libz.a для доступа к интерфейсу zlibNX можно использовать путь /usr/opt/zlibNX/static/lib/libz.a.
  • В случае динамической компоновки приложения с библиотекой libz.a можно использовать путь /usr/opt/zlibNX/lib/libz.a. Динамически компонуемые приложения могут обеспечить компоновку с библиотекой zlib, поддерживающей аппаратный ускоритель, одним из следующих способов:
    • Настроив переменную LDR_PRELOAD или LDR_PRELOAD64 для загрузки библиотеки zlib с поддержкой аппаратного ускорителя перед загрузкой стандартной библиотеки zlib одним из следующих способов:
      # LDR_PRELOAD="/usr/opt/zlibNX/lib/libz.a(libz.so.1)" <32-разрядное приложение>
      # LDR_PRELOAD64="/usr/opt/zlibNX/lib/libz.a(libz.so.1)" <64-разрядное приложение>
    • Настроив переменную LD_LIBRARY_PATH, как показано в следующем примере:
      # LD_LIBRARY_PATH=/usr/opt/zlibNX/lib:$LD_LIBRARY_PATH <приложение>
    • Настроив переменную LIBPATH, как показано в следующем примере:
      # LIBPATH=/usr/opt/zlibNX/lib:$LIBPATH <приложение>
      Недостаток настройки переменной LD_LIBRARY_PATH заключается в том, что загрузчик сначала пытается найти все требуемые библиотеки в указанном каталоге.
    Если приложение загружает библиотеку libz.so.1 динамически, используя функцию dlopen, то необходимо обновить приложение, указав в нем путь к библиотеке zlib с поддержкой аппаратного ускорителя.

Оптимизация библиотеки zlibNX

В большинстве случаев существующие приложения zlib не используют большой буфер ввода-вывода для оптимизации производительности zlibNX. Ниже приведены рекомендации по увеличению размера буфера ввода-вывода, применяемого приложениями:

  • В случае распаковки данных с использованием аппаратного ускорителя буфер вывода может быть в N раз больше буфера ввода, где N - ожидаемый коэффициент сжатия. Значение N зависит от степени произвольности данных. Для того чтобы добиться максимальной скорости сжатия, необходимо предоставлять достаточный объем сжатых входных данных функции inflate.
  • Для сжатия данных с использованием аппаратного ускорителя можно использовать буферы ввода-вывода одинакового размера.

Переменные среды для библиотеки zlibNX

Библиотека zlibNX использует указанные ниже переменные среды для сбора информации об ошибках и отладочной информации. Значения по умолчанию следующих переменных среды можно переопределить.
ZLIB_VERBOSE
Позволяет сохранять в файле протокола низкоуровневую отладочную информацию с разными уровнями подробности. Значение 0 запрещает запись отладочной информации в файл протокола. Значение 3 позволяет записывать в файл протокола подробную отладочную информацию. Значение по умолчанию равно 0.
ZLIB_LOGFILE
Выводит отладочную информацию в указанный файл протокола. Если переменная среды ZLIB_LOGFILE не задана, отладочная информация записывается в поток stderr.
ZLIB_COMPRESS_ACCEL
Позволяет включить или выключить распаковку данных с аппаратным ускорением с помощью функции deflate в библиотеке zlibNX. Значение 0 выключает сжатие данных с аппаратным ускорением. Значение 1 включает сжатие данных с аппаратным ускорением. Значение по умолчанию равно 1.
ZLIB_DECOMPRESS_ACCEL
Позволяет включить или выключить распаковку данных с аппаратным ускорением с помощью функции inflate в библиотеке zlibNX. Значение 0 выключает распаковку данных с аппаратным ускорением. Значение 1 включает распаковку данных с аппаратным ускорением. Значение по умолчанию равно 1.

Поддерживаемые функции zlib

Ниже приведен список функций zlib, применяемых ускорителем GZIP NX. Некоторые функции zlib нельзя выполнять с помощью ускорителя NX. В таких случаях сжатие и распаковка данных выполняются программным образом.
zlibVersion
Возвращает версию библиотеки zlibNX. Например: 1.2.11.1-AIX_NX.
deflateInit(z_streamp strm, int level)
Инициализирует операцию сжатия. Значение, указанное пользователем в параметре level, игнорируется, и вместо него при выполнении операции сжатия используется значение Z_DEFAULT_COMPRESSION.
deflate(z_streamp strm, int flush)

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

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

Для параметра flush допустимы следующие значения:

Z_NO_FLUSH
Определяет объем данных, который должен накопиться в буфере ввода операции сжатия, прежде чем будет сгенерирован сжатый вывод.
Z_SYNC_FLUSH
Отправляет весь ожидающий вывод операции сжатия в буфер вывода. Вывод заканчивается на границе байта. Граница байта - это конец байта памяти.
Z_PARTIAL_FLUSH

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

По своему принципу работы функция Z_PARTIAL_FLUSH аналогична функции Z_SYNC_FLUSH.

Z_BLOCK
Указывает, что выполнено сжатие блока данных. В случае передачи значения Z_BLOCK API zlibNX переключается обратно на стандартный API zlib.
Z_FULL_FLUSH
Отправляет весь ожидающий вывод операции сжатия в буфер вывода. Вывод заканчивается на границе байта. Сбрасывает состояние сжатия.
Z_FINISH
Передает ожидающие данные ввода функции deflate и выгружает ожидающий вывод функции deflate. Если для вывода достаточно памяти, функция deflate возвращает значение Z_STREAM_END. Если функция deflate возвращает значение Z_OK или Z_BUF_ERROR, то ее нужно вызвать еще раз, указав значение Z_FINISH в параметре flush и предоставив дополнительную память для вывода, но не передавая других данных ввода, и так до тех пор, пока функция deflate не вернет значение Z_STREAM_END или код ошибки.
deflateEnd(z_streamp strm)
Освобождает память, выделенную для информации о состоянии операции сжатия.
deflateInit2
deflateInit2(z_streamp strm,int level, int method,
int windowBits, int memLevel, int strategy)
Инициализирует операцию сжатия. В этой функции можно задать следующие параметры:
level
Для параметра level допустимы следующие значения:
Z_NO_COMPRESSION
Переключиться на программный способ сжатия.
Z_BEST_SPEED
В настоящее время этот уровень является аналогом уровня Z_DEFAULT_COMPRESSION и применяется по умолчанию.
Z_BEST_COMPRESSION
Уровни 1 - 9 рассматриваются как уровень 6, а именно уровень Z_DEFAULT_COMPRESSION, который применяется по умолчанию.
method
Для параметра method допустимы следующие значения:
Z_DEFLATED
При любом значении параметра method, кроме Z_DEFLATED, происходит переключение на программный способ распаковки данных.
windowBits
Задает размер внутреннего буфера хронологии. Принимает значения логарифма по основанию 2. Размер буфера хронологии (размер окна) должен находиться в пределах от 256 байт до 32 КБ. Параметр windowBits влияет на то, какой объем памяти выделяется для внутреннего буфера ввода. В параметре windowBits можно задать значение из следующих диапазонов:
8 - 15
Задает формат zlib.
-8 - -15
Задает формат простой распаковки. Формат простой распаковки - это формат сжатых данных.
24 - 31
Задает формат GZIP.
Функция deflateInit2 принимает данные в запрошенном формате, но всегда использует окно (буфер хронологии) размером 32 КБ.
MemLevel
Задает объем памяти, выделяемый для внутреннего состояния сжатия данных. Внутреннее состояние сжатия данных - это структура данных, используемая в библиотеке для отслеживания информации о сжатии. Допустимы значения из диапазона 1 - 9. Значение по умолчанию равно 8. В настоящее время это значение игнорируется. API zlibNX всегда выделяет большой объем памяти для внутреннего состояния сжатия (примерно 1 МБ).
strategy
Задает алгоритм, используемый для операции сжатия. Для параметра strategy допустимы следующие значения:
Z_DEFAULT_STRATEGY
Используется динамический алгоритм Хаффмана с алгоритмом сравнения строк.
Z_FIXED
Динамический алгоритм Хаффмана не используется.
Z_HUFFMANONLY
Используется только алгоритм Хаффмана без алгоритма сравнения строк. Операция сжатия переключается в режим программного сжатия.
Z_FILTERED
Входными данными функции deflate являются данные, полученные в результате фильтрации или применения прогнозирующего параметра. Операция сжатия переключается в режим программного сжатия.
Z_RLE
Применяется алгоритм кодировки Хаффмана с ограниченным расстоянием для сравнения строк. Операция сжатия переключается в режим программного сжатия.
inflateInit(z_streamp strm)
Инициализирует операцию распаковки.
inflate(z_streamp, int flush)
Распаковывает данные, пока не станет пустым буфер ввода или не заполнится буфер вывода. Аппаратный ускоритель применяется при условии наличия достаточно большого буфера ввода у операции сжатия. В противном случае сжатие выполняется программным образом. По умолчанию пороговый размер буфера ввода составляет 4 КБ.
Для параметра flush допустимы следующие значения:
Z_NO_FLUSH
Выполняет распаковку данных, пока не будет достигнут конец буфера ввода или буфера вывода.
Z_SYNC_FLUSH
Отправляет вывод операции распаковки в буфер вывода, пока он не достигнет максимального размера.
Z_FINISH
Пытается распаковать все данные за один прогон операции распаковки.
Z_BLOCK
Останавливает операцию распаковки при достижении границы следующего блока функции deflate. Под границей понимается то место, где блок заканчивается.
InflateEnd
Функция InflateEnd поддерживается API zlibNX.
deflateSetDictionary
deflateSetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength)
Инициализирует словарь сжатия с помощью значений, указанных в последовательности байт (параметре dictionary). Словарь сжатия должен состоять из строк, которые в дальнейшем могут встречаться в сжимаемых данных.
deflateGetDictionary
deflateGetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength)
Возвращает скользящий словарь (буфер хронологии), используемый функцией deflate. Скользящий словарь - это буфер памяти, содержащий несжатые данные.
deflateCopy
deflateCopy(z_streamp dest, z_streamp source)
Копирует поток и дублирует внутреннее состояние сжатия. У целевого потока не будет доступа к ускорителю.
deflateReset
deflateReset(z_streamp strm)
Выполняет сброс состояния потока, не освобождая и не перераспределяя память, выделенную для внутреннего состояния сжатия.
deflateParams
deflateParams(z_streamp strm, int level, int strategy)
Обеспечивает поддержку функции deflate из библиотеки zlibNX с указанными входными параметрами. Уровень сжатия не меняется.
deflateTune
deflateTune(z_streamp strm, int good_length, int max_lazy,int nice_length, int max_chain)
Позволяет изменить внутренние параметры сжатия функции deflate. Операция сжатия переключается в режим программного сжатия.
deflateBound(z_streamp strm, uLong sourceLen)
Возвращает максимальный размер сжатых данных после выполнения операции deflate для sourceLen байт данных, переданных функции deflateBound.
deflatePending
deflatePending(z_streamp strm, unsigned *pending, int *bits)

Возвращает вывод, который сгенерирован, но еще не отражен в выводе операции сжатия.

deflatePrime
deflatePrime(z_streamp strm, int bits, int value)
Операция сжатия переключается в режим программного сжатия.
deflateSetHeader(z_streamp strm, gz_headerp head)
Возвращает информацию о заголовке GZIP для указанного потока GZIP.
inflateInit2
inflateInit2(z_streamp strm, int windowBits)
Аналогична функции inflateinit, но принимает дополнительный параметр windowBits.
windowBits
Принимает значения логарифма по основанию 2. Размер буфера хронологии (размер окна) должен находиться в пределах от 256 байт до 32 КБ. Функция deflateInit2 принимает данные в запрошенном формате, но всегда использует окно (буфер хронологии) размером 32 КБ. В параметре windowBits можно задать значение из следующих диапазонов:
8 - 15
Задает формат zlib.
24 - 31
Задает формат GZIP
40 - 47
Задает автоматическое обнаружение заголовка.
-8 - -15
Задает формат простой распаковки.
Функция inflateInit2 принимает данные в запрошенном формате, но всегда использует окно (буфер хронологии) размером 32KB КБ.
inflateSetDictionary
inflateSetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength)
Инициализирует словарь распаковки с использованием указанной последовательности распакованных байтов.
inflateGetDictionary
inflateGetDictionary(z_streamp strm, Bytef *dictionary, uInt *dictLength)
Возвращает словарь распаковки, заданный в параметре dictionary.
inflateSync
inflateSync(z_streamp strm)
Пропускает сжатые данные при выполнении операции распаковки, пока не будет достигнута возможная точка полной выгрузки. Если точки полной выгрузки невозможно достичь, операция распаковки пропускает все доступные данные ввода. Точка полной выгрузки - это точка в сжатых данных, сгенерированная при вызове функции deflate() с параметром flush, имеющим значение Z_FULL_FLUSH.
inflateCopy
inflateCopy(z_streamp dest, z_streamp source)
Задает целевой поток как копию исходного потока.
inflateReset
inflateReset(z_streamp strm)
Сбрасывает состояние сжатия без его освобождения.
inflateReset2
inflateReset2(z_streamp strm, int windowBits)
Функция inflateReset2 аналогична функции inflateReset, но позволяет изменять размер wrap и размер окна. Параметр windowBits используется так же, как в функции inflateInit2. Размер буфера хронологии (размер окна) фиксирован и составляет 32 КБ, однако windowBits задает формат, который используется при распаковке.
inflatePrime
inflatePrime(z_streamp strm, int bits, int value)
Вставляет биты во входной поток распаковки. Эта функция позволяет начать операцию распаковки с определенного бита в байте. Операция сжатия переключается в режим программной распаковки.
inflateMark
inflateMark(z_streamp strm)
Помечает точку для произвольного доступа к данным в потоке ввода, заданную как смещение в битах внутри потока данных. Возвращает два 16-битных значения - две половины 32-разрядных входных данных.
inflateGetHeader
inflateGetHeader(z_streamp strm, gz_headerp head)
Сохраняет информацию о заголовке GZIP и указанной структуре заголовка.
inflateBackInit
inflateBackInit()
Инициализирует внутренний поток операции распаковки путем вызова функции inflateBack. Операция распаковки переключается в режим программной распаковки. Эта функция поддерживается только в начале потока.
inflateBack
inflateBack(z_streamp strm,in_func in,
void FAR *in_desc,out_func out,void FAR *out_desc)
Выполняет простую распаковку, используя интерфейс обратного вызова для данных ввода и вывода. Операция распаковки переключается в режим программной распаковки. Эту функцию можно вызывать только после функции inflateBackInit.
inflateBackEnd
inflateBackEnd(z_streamp strm)
Освобождает всю память, выделенную функцией inflateBackInit. Операция распаковки переключается в режим программной распаковки.
конец изменения