gzip压缩测试

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处理压缩/解压缩的性能.

优化案例1 : https://www.intel.com/content/dam/www/public/us/en/documents/white-papers/zlib-compression-whitepaper-copy.pdf

使用这篇文字中提供的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 )

你可能感兴趣的:(gzip压缩测试)