使用 zlibNX 库进行数据压缩

zlibNX 库是 zlib 压缩库的增强版本,通过在基于 IBM® POWER9™ 处理器的服务器上使用称为 Nest 加速器 (NX) 的协处理器,支持硬件加速的数据压缩和解压。 zlibNX 库在 IBM AIX® 7.2 with Technology Level 4 Expansion Pack 和更高版本中可用。 从 IBM AIX® 7.2 Technology Level 5 Service Pack 2 开始,除了扩展包之外, AIX 基本介质上还提供了 zlibNX 安装包。

zlibNX 库符合以下 "请求注释" (RFC) 标准:

  • RFC 1950 (zlib 压缩数据格式规范)
  • RFC 1951 (DEFLATE 压缩数据格式规范)
  • RFC 1952 (gzip 文件格式规范)

RFC 标准确保不同 zlib 库实现之间的兼容性。 可以使用标准 zlib 库来解压缩使用 zlibNX 库压缩的数据。 同样,可以使用 zlibNX 库来解压缩使用标准 zlib 库压缩的数据。

使应用程序能够使用 zlibNX 接口

应用程序可以根据应用程序链接到 libz.so.1libz.a 库的方式使用 zlibNX 接口,如下所示:
  • 必须将未链接到 libz.alibz.so.1 库的应用程序重新编译或重新链接到 /usr/opt/zlibNX/include/ 路径中指定的 zlibNX 归档文件和 zlibNX 头文件。
  • 静态链接到 libz.a 库的应用程序可以使用 /usr/opt/zlibNX/static/lib/libz.a 路径来访问 zlibNX 接口。
  • 动态链接到 libz.a 库的应用程序可以使用 /usr/opt/zlibNX/lib/libz.a 路径。 动态链接的应用程序可以使用下列其中一种方法链接到硬件加速的 zlib 库:
    • 设置 LDR_PRELOADLDR_PRELOAD64 变量以在装入标准 zlib 库之前装入硬件加速的 zlib 库,如以下方法中所示:
      # LDR_PRELOAD="/usr/opt/zlibNX/lib/libz.a(libz.so.1)" <32-bit application>
      # LDR_PRELOAD64="/usr/opt/zlibNX/lib/libz.a(libz.so.1)" <64-bit application>
    • 设置 LD_LIBRARY_PATH 变量,如以下样本中所示:
      # LD_LIBRARY_PATH=/usr/opt/zlibNX/lib:$LD_LIBRARY_PATH <application>
    • 设置 LIBPATH 变量,如以下样本中所示:
      # LIBPATH=/usr/opt/zlibNX/lib:$LIBPATH <application>
      设置 LD_LIBRARY_PATH 变量的缺点是装入器尝试先在指定目录中查找所有必需的库。
    如果应用程序使用 dlopen 子例程动态装入 libz.so.1 库,那么必须使用硬件加速的 zlib 库的路径来更新应用程序。

优化 zlibNX 库

大多数现有 zlib 应用程序都未使用大型 I/O 内存缓冲区来实现最佳 zlibNX 性能。 您可以使用以下准则来增加应用程序所使用的 I/O 缓冲区的大小:

  • 对于硬件加速的数据解压,输出内存缓冲区可以是输入内存缓冲区的 N 倍,其中 N 表示期望的压缩率。 N 的值取决于数据的随机性。 要获得最佳压缩性能,必须向 inflate 函数提供足够的压缩输入数据。
  • 对于硬件加速的数据压缩,可以选择大小相同的 I/O 内存缓冲区。

zlibNX 库的环境变量

zlibNX 库使用以下环境变量来收集错误和调试信息。 可以覆盖以下环境变量的缺省值。
ZLIB_VERBOSE
启用打印到日志文件的不同级别的低级别调试信息。 值 0 不会将调试信息写入日志文件。 值 3 将详细调试信息写入日志文件。 缺省值为 0。
ZLIB日志文件
将调试信息打印到指定的日志文件中。 如果未设置 ZLIB_LOGFILE 环境变量,那么会将调试信息打印到 stderr 流。
ZLIB_COMPRESS_ACCEL
zlibNX 库中使用 deflate 函数来启用或禁用硬件加速的数据解压。 值 0 将禁用硬件加速的数据压缩。 值 1 表示启用硬件加速的数据压缩。 缺省值为 1。
ZLIB_DECOMPRESS_ACCEL
zlibNX 库中使用 inflate 函数来启用或禁用硬件加速的数据解压。 值 0 将禁用硬件加速的数据解压。 值 1 将启用硬件加速的数据解压。 缺省值为 1。

受支持的 zlib 函数

以下列表描述了 NX GZIP 加速器使用的 zlib 函数。 无法使用 NX 加速器来执行某些 zlib 函数。 在这些情况下,压缩或解压会回退到基于软件的操作。
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_部分刷新

压缩可用输入数据并发送压缩操作的暂挂输出。 输出不以字节边界结束,即,将空的内存块附加到输出数据。

Z_PARTIAL_FLUSH 函数的功能类似于 Z_SYNC_FLUSH 函数。

Z_BLOCK
指示数据块的压缩已完成。 如果传递了 Z_BLOCK 值,那么 zlibNX API 将回退到标准 zlib API。
Z_完全刷新
将压缩操作的所有暂挂输出发送到输出内存缓冲区,并在字节边界上输出结束。 重置压缩状态。
Z_finish
将暂挂输入数据传输到 deflate 函数,并从 deflate 函数中清空暂挂输出。 如果输出内存足够,那么 deflate 函数将返回 Z_STREAM_END 值。 如果 deflate 函数返回 the Z_OKZ_BUF_ERROR 值,那么必须使用 flush 参数的 Z_FINISH 值再次调用 deflate 函数,该函数具有更多输出空间但没有更多输入数据,直到 deflate 函数返回 Z_STREAM_END 值或错误为止。
deflateEnd(z_streamp strm)
释放压缩操作的分配状态信息。
deflateInit2
deflateInit2(z_streamp strm,int level, int method,
int windowBits, int memLevel, int strategy)
初始化压缩操作。 可以使用此函数指定以下参数:
级别
可以为 level 参数指定下列其中一个值:
Z_无压缩
压缩回退到基于软件的压缩。
Z_最佳速度
目前,此级别被视为 Z_DEFAULT_COMPRESSION 级别,并且是缺省级别。
Z_最佳压缩
级别 1-9 被视为级别 6 ,即 Z_DEFAULT_COMPRESSION 级别,这是缺省级别。
method
可以为 method 参数指定下列其中一个值:
Z_DEFLATED
如果 method 参数的值不是 Z_DEFLATED,那么压缩将回退到基于软件的解压。
windowBits
指示内部历史记录缓冲区的大小。 接受以 2 为底的对数的值。 历史记录缓冲区的大小 (窗口大小) 可以在 256 字节-32 KB 范围内。 windowBits 参数会影响为内部输入内存缓冲区分配的内存。 可以为 windowBits 参数指定以下范围内的值:
8 - 15
指示 zlib 格式。
-8 至 -15
指示原始 deflate 格式。 原始 deflate 格式表示压缩数据格式。
24 - 31
指示 GZIP 格式。
deflateInit2 函数接受请求的格式,但始终使用 32 KB 窗口或历史记录缓冲区。
MemLevel
指示必须为内部压缩状态分配的内存量。 内部压缩状态是在软件库中用于跟踪压缩相关信息的数据结构。 该值可以在 1-9 范围内。 缺省值为 8。 当前已忽略此值。 zlibNX API 始终分配大型内部压缩状态 (大约 1 MB)。
策略
指示必须用于压缩操作的算法。 可以为 strategy 参数指定下列其中一个值:
Z_DEFAULT_STRATEGY
使用具有字符串匹配算法的动态 Huffman 算法。
Z_fixed
不使用动态 Huffman 算法。
仅 Z_HUFFMANONLY
仅使用没有字符串匹配的 Huffman 算法。 压缩操作将回退到基于软件的压缩。
Z_FILTER
过滤器或预测变量生成的数据是 deflate 函数的输入。 压缩操作将回退到基于软件的压缩。
Z_RLE
使用具有有限字符串匹配距离的 Huffman 编码算法。 压缩操作将回退到基于软件的压缩。
inflateInit(z_streamp strm)
初始化解压操作。
扩充 (z_streamp , int flush)
解压缩数据,直到输入内存缓冲区变为空或输出内存缓冲区变为满为止。 基于硬件的加速取决于压缩操作所使用的足够大的输入内存缓冲区。 否则,将使用基于软件的压缩操作。 输入内存缓冲区的缺省阈值为 4 KB。
flush 参数可以采用下列其中一个值:
Z_NO_FLUSH
解压缩数据,直到到达输入结束或输出内存缓冲区结束。
Z_SYNC_FLUSH
将解压操作的输出发送到输出内存缓冲区,直到达到输出内存缓冲区的最大容量为止。
Z_finish
尝试在解压操作的单个迭代中解压所有数据。
Z_BLOCK
如果达到下一个 deflate 块边界,那么停止解压缩操作。 块边界是指 deflate 块结束的位置。
InflateEnd
zlibNX API 支持 InflateEnd 函数。
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)
支持 zlibNX 库中基于输入参数的 deflate 函数。 压缩级别不会更改。
deflateTune
deflateTune(z_streamp strm, int good_length, int max_lazy,int nice_length, int max_chain)
优化 deflate 函数的内部压缩参数。 压缩操作将回退到基于软件的压缩。
deflateBound(z_streamp strm, uLong sourceLen )
返回对传递到 deflateBound 函数的 sourceLen 字节执行 deflate 操作后压缩数据的最大大小。
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 KB 范围内。 deflateInit2 函数接受请求的格式,但始终使用 32 KB 窗口或历史记录缓冲区。 可以为 windowBits 参数指定以下范围内的值:
8 - 15
指示 zlib 格式。
24 - 31
指示 GZIP 格式
40 - 47
指示自动头检测。
-8 至 -15
指示原始 deflate 格式。
inflateInit2 函数接受请求的格式,但始终使用 32KB 窗口或历史记录缓冲区。
inflateSetDictionary
inflateSetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength)
从指定的解压缩字节序列初始化解压字典。
inflateGetDictionary
inflateGetDictionary(z_streamp strm, Bytef *dictionary, uInt *dictLength)
返回在字典参数中设置的解压字典。
inflateSync
inflateSync(z_streamp strm)
在解压操作期间跳过压缩数据,直到达到可能的 完全清空点 。 如果未达到 完全清空点 ,那么扩充操作将跳过所有可用的输入数据。 完全清空点 是指在将 flush 参数设置为 Z_FULL_FLUSH 值的情况下调用 deflate() 函数时生成的压缩数据中的位置。
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 KB 处是静态的,但 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 函数分配的所有内存。 解压操作会回退到基于软件的解压。