Fluent Bit 仓库内嵌 Zstandard 1.5.7 命令行工具完整指南:zstd.1 手册全解与源码级实践
【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit
导读
本文以 Fluent Bit 仓库内嵌的 Zstandard(zstd)1.5.7 官方手册 programs/zstd.1.md 为绝对主体,系统讲解zstd/zstdmt/unzstd/zstdcat命令行工具的全部操作模式、压缩级别体系、高级参数、字典训练与基准测试功能,并对照仓库内 lib/zstd-1.5.7 源码树与 src/flb_zstd.c、cmake/zstd.cmake 等实现,说明 zstd 如何作为 Fluent Bit 的压缩/解压缩能力被真实落地。读完本文,你将能够独立完成 zstd 的压缩、解压、校验、字典训练、基准测试与调优,并理解 Fluent Bit 各插件(HTTP 输出、Forward 输入、AWS 服务等)中 zstd 压缩的底层调用链。
一、zstd 是什么:快速无损压缩算法与工具
zstd是一种快速的无损压缩算法及数据压缩工具,命令行语法与gzip(1)、xz(1) 类似。它基于LZ77家族,并在其后叠加了 FSE(Finite State Entropy)与 huff0 两个熵编码阶段,实现了压缩速度与压缩比的双重可配置性:
- 快速模式可达到每核心 200 MB/s 以上的压缩吞吐;
- 强压缩模式能获得出色的压缩比;
- 解压速度极快,每核心可达 500 MB/s 以上,且在不同压缩设置下基本保持稳定。
以上性能表述来自官方手册原文;实际数值与机器、数据内容强相关,应以实测为准。在 Fluent Bit 仓库中,zstd 以 lib/zstd-1.5.7 子模块形式随仓库分发,头文件 lib/zstd-1.5.7/lib/zstd.h 中定义的版本号为ZSTD_VERSION_MAJOR=1、ZSTD_VERSION_MINOR=5、ZSTD_VERSION_RELEASE=7(见 lib/zstd-1.5.7/lib/zstd.h#L112-L114)。
与 gzip 的几个关键差异
zstd 命令行整体风格接近 gzip,但存在以下差异:
- 源文件默认保留。如需自动删除,需显式使用
--rm。 - 压缩单个文件时,默认显示进度通知与结果摘要,可用
-q关闭。 - 命令行出错时显示简短帮助页,同样可用
-q关闭。 - 不接受来自控制台的输入;但当标准输入不是控制台时,接受
stdin。 - 不存储输入文件的文件名与属性,只保存内容本身。
zstd按所选操作模式逐个处理文件。若未指定文件或文件名为-,则从标准输入读取、向标准输出写出。若标准输出是终端,zstd 会拒绝向其写入压缩数据并报错跳过;同理,若标准输入是终端,zstd 也拒绝读取。
输出文件命名规则
除非指定--stdout或-o,输出文件命名遵循:
- 压缩:在源文件名后追加
.zst后缀得到目标文件名; - 解压:从源文件名移除
.zst后缀得到目标文件名。
多文件拼接
多个.zst文件可以简单地拼接(concatenate)在一起,zstd 会把这种聚合文件当作单个.zst文件整体解压。这一特性对日志归档、流式追加写入等场景非常实用。
二、SYNOPSIS:四种命令形态
手册给出的命令原型为:
zstd [<OPTIONS>] [-|<INPUT-FILE>] [-o <OUTPUT-FILE>]并提供三个等价别名命令:
| 命令 | 等价形式 | 用途 |
|---|---|---|
zstdmt | zstd -T0 | 自动探测并使用物理 CPU 核心数进行多线程压缩 |
unzstd | zstd -d | 解压 |
zstdcat | zstd -dcf | 解压并输出到标准输出(强制模式) |
整数后缀与特殊值
在绝大多数期望整数参数的位置,都支持可选后缀以方便表达大数(整数与后缀之间不允许有空格):
KiB:乘以 1024(2^10)。Ki、K、KB均视为KiB的同义词;MiB:乘以 1,048,576(2^20)。Mi、M、MB均视为MiB的同义词。
例如--memory=128MiB、--maxdict=100KB都是合法写法。
三、操作模式(Operation Mode)
多个操作模式同时给出时,以最后一个为准。
| 选项 | 说明 |
|---|---|
-z,--compress | 压缩。当未指定任何操作模式、且命令名不隐含其他模式(如unzstd隐含--decompress)时,这是默认模式 |
-d,--decompress,--uncompress | 解压 |
-t,--test | 校验压缩文件完整性,等价于--decompress --stdout > /dev/null:解压数据被丢弃并做校验和检查,不创建也不删除任何文件 |
-b# | 使用压缩级别#对文件做基准测试(见后文 BENCHMARK 章节) |
--train FILES | 使用 FILES 作为训练集生成字典。训练集应包含大量小文件(建议 > 100 个) |
-l,--list | 显示 zstd 压缩文件相关信息(大小、压缩比、校验和等),部分字段可能不可用;可加-v增强输出 |
四、操作修饰符(Operation Modifiers)
压缩级别与速度
-#:选择压缩级别#,范围 [1-19],默认 3。级别越高通常压缩比越高,但速度与内存开销越大。经验法则:压缩速度大约每 2 级减半。每个级别内部会被映射为一组高级参数(可用--show-default-cparams查看映射结果);由于压缩行为高度依赖数据内容,级别间并不保证平滑递增。--ultra:解锁 20+ 级(最高 22)的超高压缩级别,内存占用显著增加;注意解压这些级别产生的文件同样需要更多内存。--fast[=#]:切换到超快速压缩级别。不带=#时默认取 1;值越大压缩越快、压缩比越低。此设置会覆盖先前设置的压缩级别,反之在其后设置的压缩级别也会覆盖它。-T#,--threads=#:使用#个工作线程压缩(默认 1)。#为 0 时自动探测并使用物理 CPU 核心数;线程数上限为ZSTDMT_NBWORKERS_MAX,32 位环境为 64,64 位环境为 256。未编译多线程支持的 zstd 忽略此修饰符。--single-thread:I/O 与压缩共用单线程。由于压缩与 I/O 串行化,可能略慢,但内存占用显著更低,适合 32 位等内存受限系统。注意它与-T1不同(-T1会额外派生 1 个压缩线程与 I/O 并行),最终压缩结果也与-T1略有差异。--auto-threads={physical,logical}(默认 physical):当通过-T0使用默认线程数时,决定基于物理核还是逻辑核数量。
自适应与长距离匹配
--adapt[=min=#,max=#]:根据感知到的 I/O 状况动态调整压缩级别。可用-v实时观察调整过程;可限定在min与max级别之间。该特性需配合多线程与--long模式使用,不兼容--single-thread;默认将窗口大小设为 8 MiB(可用wlog修改)。由于动态调整具有混沌性,压缩结果不可复现。手册同时提示:与多个工作线程(>=2)组合时,--adapt可能卡在低速度。--long[=#]:启用长距离匹配,#为windowLog(窗口大小对数),缺省为 27。这会增大窗口大小与压缩/解压双方的内存占用,用于改善大距离长匹配数据的压缩比。注意:若windowLog大于 27,解压时必须显式传入--long=windowLog或--memory=windowSize。--max:将高级参数设为最大压缩。警告:非常慢且消耗大量资源,不适用于 32 位模式(该模式下禁用)。
字典与差分
-D DICT:使用DICT作为字典压缩或解压文件。--patch-from FILE:指定文件作为 zstd 差分引擎的参考点,本质上是带便捷参数选择的字典压缩(要求windowSize > srcSize)。约束:- 不能与
-D同时使用; - 若
chainLog < fileLog(fileLog指覆盖整个文件所需的windowLog),--long模式会被自动激活,也可手动强制; - 级别 ≤ 15 时,可在
--single-thread下用--patch-from以速度换取略高压缩比;级别 > 15 用--single-thread反而会降低压缩比; - 级别 19 下,指定较大的
--zstd=targetLength=(如 4096)与较大的--zstd=chainLog=可在牺牲速度的情况下提升压缩比。
- 不能与
--rsyncable:周期性同步压缩状态,使压缩文件更利于 rsync 增量同步。对压缩比影响可忽略,但对高速场景(如与多并行线程组合)可能有速度影响;不兼容--single-thread,一般也不建议与长距离模式同用。
帧头与完整性
-C,--[no-]check:添加基于未压缩数据计算的完整性校验(默认启用)。--[no-]content-size:控制是否把原始文件大小写入压缩文件头部。默认--content-size(写入)。--no-dictID:不在帧头存储字典 ID。解码器将只能依赖对字典的隐式认知,无法校验字典是否正确。
内存与流式输入
-M#,--memory=#:设置内存使用上限。解压默认上限128 MiB,可上下调整。此参数同时作用于:- 与
--patch-from=组合时,覆盖字典允许的最大尺寸(128 MiB); - 字典训练时,覆盖默认 2 GiB 的样本加载上限(加载至内存上限的样本,其余忽略)。
- 与
--stream-size=#:声明流式输入的承诺源大小,必须精确,因为会被写入帧头;错误值将导致报错。该信息有助于优化压缩参数,对小源尤其能带来更好且可能更快的压缩。--size-hint=#:流式输入下,zstd 需猜测源大小以优化参数;小流时猜测不佳可能导致压缩比异常。此选项允许人为控制猜测:精确估计压缩比最好,高估略损压缩比,低估可能显著劣化。--target-compressed-block-size=#:尝试生成约此大小的压缩块(将大块拆分逼近目标),对接收方能利用提前到达的不完整数据的场景(低延迟)尤其有用。这是宽松目标——块"平均"接近该尺寸,个体可大可小。级别 1 下开启该特性最多使压缩速度下降约 10%,级别越高速度回退越小。
输入输出控制
-f,--force:禁用输入输出检查,允许覆盖已有文件、从控制台输入、向 stdout 输出、操作链接与块设备等。解压且输出目标是 stdout 时,将未识别格式原样透传。-c,--stdout:写入标准输出(即使是控制台);保留原文件(禁用--rm)。-o FILE:将结果保存到FILE。与-c冲突时,命令行中后出现的生效。--[no-]sparse:启用/禁用稀疏文件支持,让含大量零字节的文件在磁盘上更小;创建稀疏文件可节省磁盘并减少磁盘 I/O、加速解压。默认:输出到文件时启用,输出到 stdout 时禁用;此设置可覆盖默认并强制 stdout 也使用稀疏模式。--[no-]pass-through:启用/禁用未压缩文件的透传。解压时若启用透传,未识别格式会原样从输入复制到输出。默认仅在输出目标为 stdout 且设置了-f时透传。--rm:压缩/解压成功后删除源文件。输出为 stdout 时静默忽略;与-o组合时触发确认提示(可用-f静默),因为这是破坏性操作。-k,--keep:操作成功后保留源文件。这是默认行为。-r:递归处理目录,选中目录内及所有子目录的全部文件。可减少命令行输入,也能规避 shell 展开对命令行长度的限制。--filelist FILE:从FILE读取待处理文件列表,格式与ls输出兼容(每行一个文件)。--output-dir-flat DIR:输出文件统一存入DIR,而非源文件所在目录。不同目录的同名文件可能冲突:默认保留先出现的文件,与-f组合时保留最后出现的文件。--output-dir-mirror DIR:类似--output-dir-flat,但会在DIR下复刻输入目录层级。含..的输入目录会被忽略;绝对路径输入(如/var/tmp/abc)会存入output-dir/var/tmp/abc;多输入冲突处理规则同--output-dir-flat。--format=FORMAT:以其他格式压缩/解压。编译支持时可选zstd、gzip、xz、lzma、lz4;缺省为zstd。
信息与日志
-h/-H,--help:显示帮助/长帮助并退出。-V,--version:显示版本号并立即退出(其后的参数被忽略)。进阶用法:-vV同时显示支持的格式;-vvV同时显示 POSIX 支持;-qV只输出版本号,适合机器读取。-v,--verbose:详细模式,显示更多信息。-q,--quiet:抑制警告、交互与通知;指定两次可连错误一起抑制。--no-progress:不显示进度条,保留其他消息。--show-default-cparams:显示基于给定压缩级别与输入大小为特定文件选定的默认压缩参数;若输入不是常规文件(如管道),输出未知大小输入所用的参数。--exclude-compressed:只压缩尚未被压缩过的文件。--:其后的所有参数一律视为文件。
gzip 兼容修饰符
当通过gzip符号链接调用 zstd 时,额外支持以下 gzip 式选项:
-n,--no-name:压缩时不保存原始文件名与时间戳。这是默认行为,因此实际为空操作。--best:-9的别名。
环境变量
手册明确指出:用环境变量设置参数存在安全隐患,因此该途径被有意限制,目前仅支持两个变量,且均可被命令行参数(-#与-T#)覆盖:
| 变量 | 作用 | 说明 |
|---|---|---|
ZSTD_CLEVEL | 默认压缩级别 | 仅接受 1-19 的"常规"区间;非法整数会被忽略并告警;只是替换默认级别 3 |
ZSTD_NBTHREADS | 压缩线程数 | 非法无符号整数会被忽略并告警;默认值为max(1, min(4, nbCores/4)),上限ZSTDMT_NBWORKERS_MAX==200;需编译多线程支持才生效 |
五、高级压缩选项:22 个常规级别背后的精细旋钮
zstd 提供22 个预定义常规压缩级别加上快速级别。每个级别内部会被翻译成一组高级参数(可用--show-default-cparams观察),这些参数可通过高级压缩选项单独覆盖。
--zstd[=options]:逐参数调优
--zstd的 options 以逗号分隔列表给出,只写需要改动的项,其余沿用所选(或默认)级别的取值。全部可选参数如下:
| 参数(别名) | 含义 | 取值范围与说明 |
|---|---|---|
strategy(strat) | 匹配查找器使用的策略 | 共 9 种,1-9 由快到强:1=ZSTD_fast、2=ZSTD_dfast、3=ZSTD_greedy、4=ZSTD_lazy、5=ZSTD_lazy2、6=ZSTD_btlazy2、7=ZSTD_btopt、8=ZSTD_btultra、9=ZSTD_btultra2 |
windowLog(wlog) | 匹配距离的最大位数 | 最小 10(1 KiB),最大 30(1 GiB,32 位)/ 31(2 GiB,64 位)。越大越易找到匹配、压缩比越高,但压缩/解压内存都增大;>27 时解压需--long或--memory |
hashLog(hlog) | 哈希表最大位数 | 最小 6(64 项/256 B),最大 30(10 亿项/4 GiB)。表越大冲突越少、压缩越快,但压缩内存更大 |
chainLog(clog) | 次级搜索结构(形式取决于 strategy)最大位数 | 最小 6(64 项/256 B),最大 29(32 位)/ 30(64 位)。位数越高越易命中、压缩比越高,但更慢且更耗内存;对只有主哈希表的ZSTD_fast无效 |
searchLog(slog) | 哈希链/二叉树中最大搜索次数(对数刻度) | 最小 1,最大windowLog - 1。搜索越多压缩比越高、速度越慢 |
minMatch(mml) | 哈希表中匹配的最小搜索长度 | 最小 3,最大 7。越大通常压缩比略降但解压更快 |
targetLength(tlen) | 影响因 strategy 而异 | 对ZSTD_btopt/btultra/btultra2:触发匹配查找器停止搜索的最小匹配长度,越大压缩比越高、速度越慢;对ZSTD_fast:>0 时触发超快模式(值为匹配采样间的跳过数据量),越大越快、压缩比越低;其余策略无影响。最小 0,最大 128 KiB |
overlapLog(ovlog) | 从上一 job 重载的数据量(overlapSize),仅多线程可用 | 最小 0,最大 9。1="无重叠",9="完全重叠"(最多重载windowSize);每减 1 重载量减半(8=windowSize/2,6=windowSize/8);0 为特殊值表示"默认",由 zstd 根据 strat 在 6-9 间自动确定 |
ldmHashRateLog(lhrlog) | 长距离匹配哈希表插入条目的频率 | 仅在启用长距离匹配时生效。越大压缩越快,偏离默认值过远通常压缩比下降;默认随 strategy 在 4-7 间变化 |
ldmHashLog(lhlog) | 长距离匹配哈希表最大尺寸 | 仅在启用长距离匹配时生效。最小 6,最大 30(默认windowLog - ldmHashRateLog)。表越大压缩比越高,但压缩内存与耗时增加 |
ldmMinMatch(lmml) | 长距离匹配的最小搜索长度 | 仅在启用长距离匹配时生效。最小 4,最大 4096(默认随 strategy 在 32-64 间)。过大/过小通常都会降低压缩比 |
ldmBucketSizeLog(lblog) | 长距离匹配哈希表每个桶的大小 | 仅在启用长距离匹配时生效。最小 1,最大 8(默认随 strategy 在 4-8 间)。桶越大冲突解决越好,但压缩更慢 |
官方示例
以下参数组合将高级压缩选项设置为接近"对大于 256 KB 的文件使用预定义级别 19"的效果:
--zstd=wlog=23,clog=23,hlog=22,slog=6,mml=3,tlen=48,strat=6-B#:压缩 job 大小
指定每个压缩 job 的大小,仅多线程模式下可用。每个 job 并行执行,因此该值间接影响活跃线程数。默认 job 大小随压缩级别变化(通常为4 * windowSize)。job 大小必须满足透明强制执行的最小值:512 KB 与overlapSize中的较大者。不同的 job 大小会产生不完全一致的压缩帧。
六、字典构建器(Dictionary Builder)
zstd 提供字典压缩能力,可大幅提升小文件与小消息的压缩效率:先用一批样本"训练"出字典文件,压缩与解压时通过-D dictionaryFileName引用同一字典,与样本集相似的小文件压缩效果将显著提升。
--train训练
--train FILEs:用 FILEs 作为训练集生成字典。训练集理想情况下应包含大量样本(> 100),总重量约为目标字典大小的100 倍(例如 100 KB 字典约需 10 MB 样本)。可与-r组合指定目录,规避 shell 展开限制。- 字典压缩主要针对小文件,因此期望训练集只含小文件;若存在大样本,每个样本仅前 128 KiB 参与训练。
--train在编译支持线程时默认启用多线程。- 三个构建器变体:默认
--train等价于--train-fastcover=d=8,steps=4;--train-cover为较慢的 cover 构建器;--train-legacy为传统构建器。
训练相关选项
| 选项 | 说明 |
|---|---|
-o FILE | 字典保存到FILE(默认名dictionary) |
--maxdict=# | 限制字典大小(默认 112640 字节),支持KB/MB等后缀 |
-# | 训练时使用压缩级别#(可选),生成的统计更贴合该级别,带来小幅压缩比提升 |
-B# | 将输入文件拆分为#大小的块(默认不拆分) |
-M#,--memory=# | 限制训练加载的样本数据量(默认 2 GB,同时也是上限)。训练速度与样本集大小直接相关,小样本集训练更快;训练集超过内存预算时,CLI 会在预算内随机挑选样本(随机过程确定性强:同参数同文件列表训练结果一致),以缓解按修改时间或字母序排序导致的样本聚集偏差 |
--dictID=# | 字典 ID 是本地唯一 ID,解码器用它校验字典是否正确。默认生成 4 字节随机 ID,也可显式指定;短 ID 有优势:ID < 256 在帧头仅占 1 字节,ID < 65536 占 2 字节(对比默认 4 字节)。注意 RFC 8878 保留小于 32768 及大于等于 2^31 的 ID,不应在公开场合使用 |
三种构建器算法
--train-cover[=k#,d=#,steps=#,split=#,shrink[=#]]:默认字典构建算法 cover。d未指定时尝试 6 与 8;k未指定时在 [50, 2000] 区间尝试steps个值(steps默认 40);split未指定或 ≤0 时默认 100;要求d <= k;shrink未使用时shrinkDict默认 0,shrink未指定时shrinkDictMaxRegression默认 1。- 原理:选出得分最高的
k大小片段放入字典,片段得分 = 其所有d大小子片段频率之和。一般d在 [6,8](偶尔到 16,但d <= 8运行更快);k的安全范围 [2*d, 2000];split=100时全部样本同时用于训练与测试以寻找最优d/k。启用shrink时,从最小截断字典开始倍增,直到截断字典的压缩比不比最大字典差超过shrinkDictMaxRegression%。 - 示例:
zstd --train-cover FILEs zstd --train-cover=k=50,d=8 FILEs zstd --train-cover=d=8,steps=500 FILEs zstd --train-cover=k=50 FILEs zstd --train-cover=k=50,split=60 FILEs zstd --train-cover=shrink FILEs zstd --train-cover=shrink=2 FILEs
- 原理:选出得分最高的
--train-fastcover[=k#,d=#,f=#,steps=#,split=#,accel=#]:与 cover 相同但多了f与accel参数,且split默认值不同(未指定时尝试 75)。f未指定时尝试 20,要求 0 < f < 32;accel未指定时尝试 1,要求 0 < accel <= 10;要求d = 6或d = 8。f是记录d大小子片段频率的数组大小的对数(子片段哈希到 [0, 2^f - 1] 区间,不同子片段可能哈希到同一索引而被视为同一子片段);f越大冲突越少但耗时更长。- 示例:
zstd --train-fastcover FILEs zstd --train-fastcover=d=8,f=15,accel=2 FILEs
- 示例:
--train-legacy[=selectivity=#]:传统构建器,接受字典选择性参数(默认 9,--train-legacy=s=#亦可)。选择性越小字典越稠密,效率越高但可达最大尺寸越小。- 示例:
zstd --train-legacy FILEs zstd --train-legacy=selectivity=8 FILEs
- 示例:
七、基准测试模式(Benchmark)
zstd CLI 内置基准测试模式,可用于快速寻找合适的压缩参数,或评估机器性能。
zstd -b [FILE(s)]:使用默认压缩级别同时基准压缩与解压。结果高度依赖被压缩内容;可传多文件,目录需配合-r DIRECTORY;未提供 FILE 时,使用程序化生成的 lorem ipsum 文本。- 基准测试默认使用
max(1, min(4, nbCores/4))个工作线程,以匹配常规 CLI 的 I/O 行为。
| 选项 | 说明 |
|---|---|
-b# | 使用压缩级别#基准测试 |
-e# | 从-b#到-e#(含)多个级别依次基准 |
-d | 仅基准解压速度(需提供 zstd 压缩内容) |
-i# | 单次最小评估时长(秒,默认 3s),仅基准模式 |
-B#,--block-size=# | 将文件切为#大小的独立块(默认不切块) |
-S | 每个输入文件输出一条基准结果(默认合并结果) |
-D dictionary | 使用字典基准 |
--priority=rt | 将进程优先级设为实时(Windows) |
基准模式同样兼容线程数(-T#)、高级参数(--zstd=###)、字典(-D)等组合,甚至可关闭校验和验证。
- 输出格式:
CompressionLevel#Filename: InputSize -> OutputSize (CompressionRatio), CompressionSpeed, DecompressionSpeed - 测量方法:速度测量时整个输入在内存中完成压缩/解压;单次运行至少持续 1 秒,小文件会被重复压缩/解压多次以提高测量精度。
八、仓库内的 zstd:从命令行工具到 Fluent Bit 压缩引擎
zstd 在 Fluent Bit 仓库中不仅是随附的第三方库,更是被深度集成的压缩能力。以下源码证据帮助你将命令行概念与仓库实现对应起来。
1. 构建集成
cmake/zstd.cmake 控制 zstd 的编译方式:
set(ZSTD_BUILD_STATIC ON) set(ZSTD_BUILD_SHARED OFF) set(ZSTD_BUILD_COMPRESSION ON) set(ZSTD_BUILD_DECOMPRESSION ON) set(ZSTD_BUILD_DICTBUILDER OFF) set(ZSTD_BUILD_DEPRECATED OFF)可见 Fluent Bit 只静态链接 zstd 的压缩/解压部分,未启用字典构建器(ZSTD_BUILD_DICTBUILDER OFF),产物为libzstd_static。
2. 核心封装层
src/flb_zstd.c 与 include/fluent-bit/flb_zstd.h 提供了对 zstd 原生 API 的封装:
flb_zstd_compress:通过ZSTD_compressBound估算输出上限,以固定压缩级别 1调用ZSTD_compress;flb_zstd_uncompress:先用ZSTD_getFrameContentSize探测帧内容大小,区分ZSTD_CONTENTSIZE_ERROR(报错)与ZSTD_CONTENTSIZE_UNKNOWN(走流式解压路径);zstd_uncompress_unknown_size:未知大小时以 64 KB(FLB_ZSTD_DEFAULT_CHUNK)起步、倍增扩容,上限100 MB(FLB_ZSTD_DECOMPRESS_MAX),使用ZSTD_decompressStream流式解压;flb_zstd_decompressor_dispatch/flb_zstd_decompression_context_create/flb_zstd_decompression_context_destroy:面向流式解压场景的上下文化接口,通过ZSTD_findFrameCompressedSize定位帧边界,并把srcSize_wrong视为"数据未到齐"的可恢复状态而非致命错误。
3. 在插件与核心模块中的调用点
- HTTP 内容协商:src/flb_http_common.c 中
uncompress_zstd与compress_zstd直接调用flb_zstd_uncompress/flb_zstd_compress,与 gzip、snappy 并列组成 HTTP 层的内容编码处理。 - out_http 输出插件:plugins/out_http/http.c 在
compress_zstd == FLB_TRUE时对 payload 调用flb_zstd_compress,并随后设置Content-Encoding: zstd(见 plugins/out_http/http.c#L260-L262);该插件的Compress配置项明确列出可取值gzip、snappy、zstd(见 plugins/out_http/http.c#L854)。 - in_forward 输入插件:plugins/in_forward/fw_prot.c 解析 Forward 协议的
compressed=zstd选项,返回FLB_COMPRESSION_ALGORITHM_ZSTD,并通过统一的解压上下文完成流式解压,支持按帧边界渐进式处理(见 plugins/in_forward/fw_prot.c#L1780-L1927)。 - AWS 服务:src/aws/flb_aws_compress.c 将
flb_zstd_compress注册进 AWS 压缩分发表,供 Kinesis Streams / Firehose / S3 等 AWS 输出插件选用。
从源码结构看,zstd 在 Fluent Bit 内承担着"HTTP 内容编码、Forward 协议压缩帧、AWS 负载压缩"三类角色,其 CLI 手册中关于级别、线程、字典、校验与内存控制的全部概念,在库 API 层面(ZSTD_compress、ZSTD_decompressStream、ZSTD_findFrameCompressedSize等)都有对应实现可查。
九、格式规范与其他工具
- 手册指出 Zstandard 帧格式由RFC 8878("Zstandard Compression and the 'application/zstd' Media Type",2021 年 2 月发布)定义,字典 ID 保留区间的约定同样来自该规范。
- 相关工具还包括
zstdgrep(1)、zstdless(1),以及风格相近的gzip(1)、xz(1)。 - 完整、可随时查阅的官方手册源文件即 programs/zstd.1.md,建议读者在深入调优时直接对照原文;库级 API 文档见 lib/zstd-1.5.7/lib/zstd.h,其中包含全部函数原型、常量与错误码说明。
十、实战速查:常用命令组合
最后给出几组覆盖日常与进阶场景的速查命令(默认源文件保留,需删除时追加--rm):
# 压缩单个文件(默认级别 3) zstd bigfile.log # 指定级别与多线程压缩 zstd -19 -T0 bigfile.log # 超快速压缩(--fast 默认 =1) zstd --fast=5 bigfile.log # 解压并保留源文件 zstd -d bigfile.log.zst # 解压到标准输出 zstd -dc bigfile.log.zst # 完整性校验(不产生输出) zstd -t bigfile.log.zst # 查看压缩文件信息 zstd -lv bigfile.log.zst # 用字典压缩/解压小文件 zstd --train -r samples/ -o dict zstd -D dict small_msg.txt zstd -d -D dict small_msg.txt.zst # 基准测试级别 1 到 9 zstd -b1 -e9 -i5 data.bin # 查看某输入在该级别下将使用的默认压缩参数 zstd --show-default-cparams data.bin结合本文对 zstd.1.md 手册的逐节解读,以及 src/flb_zstd.c 等仓库源码的佐证,你已具备从命令行调优到理解 Fluent Bit 内部 zstd 压缩链路的完整知识闭环。
【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考