使用 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.1 或 libz.a 库的方式使用 zlibNX 接口,如下所示:- 必须将未链接到
libz.a或libz.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_PRELOAD 或 LDR_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 变量,如以下样本中所示:
设置 LD_LIBRARY_PATH 变量的缺点是装入器尝试先在指定目录中查找所有必需的库。# LIBPATH=/usr/opt/zlibNX/lib:$LIBPATH <application>
dlopen子例程动态装入 libz.so.1 库,那么必须使用硬件加速的zlib库的路径来更新应用程序。 - 设置 LDR_PRELOAD 或 LDR_PRELOAD64 变量以在装入标准
优化 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值,那么zlibNXAPI 将回退到标准zlibAPI。 - Z_完全刷新
- 将压缩操作的所有暂挂输出发送到输出内存缓冲区,并在字节边界上输出结束。 重置压缩状态。
- Z_finish
- 将暂挂输入数据传输到 deflate 函数,并从 deflate 函数中清空暂挂输出。 如果输出内存足够,那么
deflate函数将返回Z_STREAM_END值。 如果deflate函数返回the Z_OK或Z_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。 当前已忽略此值。
zlibNXAPI 始终分配大型内部压缩状态 (大约 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
zlibNXAPI 支持InflateEnd函数。- deflateSetDictionary
使用字节序列 (dictionary 参数) 中指定的值来初始化压缩字典。 压缩字典必须包含稍后在必须压缩的数据中可能迂到的字符串。deflateSetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength)- 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
在解压操作期间跳过压缩数据,直到达到可能的 完全清空点 。 如果未达到 完全清空点 ,那么扩充操作将跳过所有可用的输入数据。 完全清空点 是指在将 flush 参数设置为inflateSync(z_streamp strm)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
标记位置以从输入流随机访问数据,该输入流被指定为数据流中的位位置。 返回两个 16 位值,即 32 位输入数据的上半部分和下半部分。inflateMark(z_streamp strm)- inflateGetHeader
将 GZIP 头信息存储在指定的头结构中。inflateGetHeader(z_streamp strm, gz_headerp head)- 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函数分配的所有内存。 解压操作会回退到基于软件的解压。