gzip文件格式
2 bytes GZIP标志字节:0x1f, 0x8b (\037 \213)
1 byte 压缩方法: (0..7 reserved, 8 = deflate)
1 byte 标志位:
bit 0 set: 文件可能是ASCII文本文件
bit 1 set: 附加多个gzip文件部分
bit 2 set: 存在有可选的附加 内容
bit 3 set: 提供了原始的文件名称
bit 4 set: 则提供有一个O-终结的文件内容
bit 5 set: 文件被加密
bit 6,7: 保留
4 bytes 文件更改时间(Unix时间)
1 byte 额外的标志,决定了压缩方法。 2:使用最大的压缩,最慢的算法 4:采用最快的算法
1 byte 这个标志指明了进行压缩时系统的类型。
0 - FAT filesystem (MS-DOS, OS/2, NT/Win32)
1 - Amiga
2 - VMS (or OpenVMS)
3 - Unix
4 - VM/CMS
5 - Atari TOS
6 - HPFS filesystem (OS/2, NT)
7 - Macintosh
8 - Z-System
9 - CP/M
10 - TOPS-20
11 - NTFS filesystem (NT)
12 - QDOS
13 - Acorn RISCOS
255 - unknown
2 bytes optional part number (second part=1) 可选的序号
2 bytes optional extra field length 可选的附加内容的长度
? bytes optional extra field 可选的附加内容
? bytes optional original file name, zero terminated 可选的原始文件名称,以'\0'结束
? bytes optional file comment, zero terminated 可选文件内容(这部分不被解释,而是可读的供人使用的,以'\0'结束
12 bytes optional encryption header
? bytes compressed data
4 bytes crc32 这个是未压缩数据的循环冗余校验值。
4 bytes uncompressed input size modulo 2^32 这是原始数据的长度以2的32次方为模的值。
示例
1f8b 08 00 0000 0000 04 03 // 头
cb48 cdc9 c957 28cf 2fca 4951 e002 00 // 压缩流
f59e cc18 0d00 0000 // 尾
gzip压缩测试
在csms中使用libz提供算法对数据进行压缩/解压缩.
将数据压缩成gz文件可以直接使用libz提供的gzwrite等API. 也可以通过封装其提供的deflate算法实现压缩数据的API. gziphelp就是通过封装deflate算法, 对外提供压缩数据的功能, 其优势在于:
1.) 对压缩参数的控制更加直接,
2.) 可以控制输出文件的大小. 这个功能是直接使用gzwrite等函数压缩数据所不能实现的.
以下通过测试, 对比两种压缩方法.
测试时将压缩线程绑定到10核心, libz 版本使用1.2.7. 结果如下:
系统信息
[root@localhost week31]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 24
On-line CPU(s) list: 0-23
Thread(s) per core: 2
Core(s) per socket: 6
座: 2
NUMA 节点: 1
厂商 ID: GenuineIntel
CPU 系列: 6
型号: 63
型号名称: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
步进: 2
CPU MHz: 1201.031
BogoMIPS: 4804.75
虚拟化: VT-x
L1d 缓存: 32K
L1i 缓存: 32K
L2 缓存: 256K
L3 缓存: 15360K
NUMA 节点0 CPU: 0-23
运行测试程序
[root@localhost week31]# ./gt alldump__core00_000_0000.pcap 1
gzip api:
use 4583 ms, origin size = 184829494, compress_size = 127411977 rate = 0.689349, speed = 40.329368
gzip help:
use 4088 ms, origin size = 184829494, compress_size = 127525463 rate = 0.689963, speed = 45.212694
[root@localhost week31]# ./gt alldump__core00_000_0000.pcap 2
gzip api:
use 5053 ms, origin size = 184829494, compress_size = 126247778 rate = 0.683050, speed = 36.578170
gzip help:
use 4273 ms, origin size = 184829494, compress_size = 126224228 rate = 0.682923, speed = 43.255206
[root@localhost week31]# ./gt alldump__core00_000_0000.pcap 3
gzip api:
use 5400 ms, origin size = 184829494, compress_size = 125256169 rate = 0.677685, speed = 34.227684
gzip help:
use 4732 ms, origin size = 184829494, compress_size = 125302681 rate = 0.677937, speed = 39.059487
[root@localhost week31]# ./gt alldump__core00_000_0000.pcap 4
gzip api:
use 6371 ms, origin size = 184829494, compress_size = 127068456 rate = 0.687490, speed = 29.011065
gzip help:
use 5134 ms, origin size = 184829494, compress_size = 123212863 rate = 0.666630, speed = 36.001070
[root@localhost week31]# ./gt alldump__core00_000_0000.pcap 6
gzip api:
use 7764 ms, origin size = 184829494, compress_size = 125248024 rate = 0.677641, speed = 23.805963
gzip help:
use 6648 ms, origin size = 184829494, compress_size = 121397541 rate = 0.656808, speed = 27.802270
[root@localhost week31]# ./gt alldump__core00_000_0000.pcap 8
gzip api:
use 11236 ms, origin size = 184829494, compress_size = 124747600 rate = 0.674933, speed = 16.449759
gzip help:
use 10906 ms, origin size = 184829494, compress_size = 120960929 rate = 0.654446, speed = 16.947505
压缩级别与压缩率
压缩率 | 速度(MB/s) | 压缩级别 |
---|---|---|
0.689963 | 45.212694 | 1 |
0.682923 | 43.255206 | 2 |
0.677937 | 39.059487 | 3 |
0.666630 | 36.001070 | 4 |
0.656808 | 27.802270 | 6 |
0.654446 | 16.947505 | 8 |
libz需要优化
理由: 通过测试可知gzip压缩/解压缩速度较慢, 且非常消耗CPU. 系统中存在多处压缩/解压缩的处理. 所以libz优化有助于提升csms处理压缩/解压缩的性能.
使用这篇文字中提供的libz库, 运行之前本文测试使用的测试程序.单核压缩文件速率可达到 50MB/sec 左右, 较原有速率提升20% 左右.
参考
[1] (https://tools.ietf.org/html/rfc1952)
[2] (http://www.zlib.net/manual.html)
[3] (https://en.wikipedia.org/wiki/Gzip )