我正在从快速 SMB 网络源(达到 1 GB/s(不是 Gb/s))传输 lz4 压缩的磁盘映像(压缩级别 1),但解压速度相对较慢,远没有达到宣传的几 GB/s/core。对于我的应用程序,我希望解压速度运行得更快。CPU 是英特尔 9900x(10 核),系统运行的是 Ubuntu 21.04,磁盘是英特尔 905p。我的问题是:如何让我的 lz4 文件解压得更快,最好接近网络带宽?
我运行了一系列时间基准测试,显示了网络、磁盘等的速度。下面是:
网络复制速度快:
time pv -bae /mnt/test/part3.ntfs.lz4 > part3.ntfs.lz4 7,85GiB [1,06GiB/s] real 0m9,304s
但是从网络共享解压文件的速度还不到这个速度的一半:
time pv -bae /mnt/test/part3.ntfs.lz4 | lz4 -c -d > part3.ntfs 7,85GiB [ 462MiB/s] real 0m18,131s
这似乎并不是因为该文件是通过网络访问的,因为从本地磁盘解压几乎没有任何更快的速度:
time pv -bae part3.ntfs.lz4 | lz4 -c -d > part3.ntfs 7,85GiB [ 534MiB/s] real 0m16,192s
这可能是关于磁盘访问模式的问题,所以让我们尝试使用 ramdisk,sudo mount -t tmpfs -o size=25g tmpfs /mnt/ramdisk
复制到 ramdisk 非常快:
time pv -bae part3.ntfs.lz4 > /mnt/ramdisk/part3.ntfs.lz4 7,85GiB [3,05GiB/s] real 0m2,575s
但是,解压到 ramdisk 并不比解压到普通磁盘快多少,并且(重要的是)比通过网络直接复制文件慢:
time pv -bae part3.ntfs.lz4 | lz4 -c -d > /mnt/ramdisk/part3.ntfs 7,85GiB [ 725MiB/s] real 0m11,082s
从网络解压文件到 ramdisk 比从本地磁盘解压文件慢:
time pv -bae /mnt/test/part3.ntfs.lz4 | lz4 -c -d > /mnt/ramdisk/part3.ntfs 7,85GiB [ 580MiB/s] real 0m13,856s
并且,将文件从 ramdisk 解压到本地磁盘的速度与从本地磁盘解压和将文件解压到本地磁盘的速度一样快(参见上面的 3.):
time pv -bae /mnt/ramdisk/part3.ntfs.lz4 | lz4 -c -d > part3.ntfs 7,85GiB [ 514MiB/s] real 0m16,518s
从磁盘解压到/dev/null:
time pv -bae part3.ntfs.lz4 | lz4 -c -d > /dev/null 7,85GiB [1,01GiB/s] real 0m7,773s
从网络解压到/dev/null:
time pv -bae /mnt/test/part3.ntfs.lz4 | lz4 -c -d > /dev/null 7,85GiB [ 713MiB/s] real 0m11,275s
从 ramdisk 解压到 /dev/null:
time pv -bae /mnt/ramdisk/part3.ntfs.lz4 | lz4 -c -d > /dev/null 7,85GiB [1003MiB/s] real 0m8,017s
我从中得出的结论是,数据写入磁盘的方式可能是最大的瓶颈(比较 3 和 7),同时读取模式也不理想(比较 5 和 4)。网络增加了一些额外的开销(比较 2 和 3、5 和 6、8 和 9),但支持的性能比我目前观察到的要快得多(比较 9 和 2)。
为了确保万无一失,下面是使用同一文件进行的内存基准测试:
lz4 -b1 part3.ntfs
File(s) bigger than LZ4's max input size; testing 2016 MB only...
1#part3.ntfs :2113929216 ->1403663863 (1.506), 992.3 MB/s ,4881.8 MB/s
我可以做些什么来加快减压速度?
更新
经过以下讨论,我发现蜥蜴算法在多线程运行时提供更好的性能。由于 Lizard 存储库本身不提供此功能,因此我不得不从 7zip_21.02 分支构建最新的 7zip这里. 使用级别 11 压缩文件后我得到的性能:
time pv -bae /mnt/test/part3.ntfs.7z | ./7zz e -si -so -tlizard > /dev/null
7,70GiB [1,05GiB/s]
real 0m7,888s
但是,当写入磁盘而不是时/dev/null
,性能并不比以前更好:
time pv -bae /mnt/test/part3.ntfs.7z | ./7zz e -si -so -tlizard > part3.ntfs
7,70GiB [ 405MiB/s]
real 0m20,392s
使用更高的压缩级别 (-mx=29) 时也会出现同样的情况,写入 /dev/null 时,我们会发现它会再次填满整个网络管道,但解压到磁盘时所需的总时间大致相同。解压到 ramdisk 时,它再次达到更好的性能。这是磁盘写入问题吗?
time pv -bae /mnt/test/part3-29.ntfs.7z | ./7zz e -si -so -tlizard > /dev/null
6,24GiB [1,05GiB/s]
real 0m5,961s
time pv -bae /mnt/test/part3-29.ntfs.7z | ./7zz e -si -so -tlizard > part3.ntfs
6,24GiB [ 331MiB/s]
real 0m20,338s
time pv -bae /mnt/test/part3-29.ntfs.7z | ./7zz e -si -so -tlizard > /mnt/ramdisk/part3.ntfs
6,24GiB [ 684MiB/s]
real 0m9,776s