CentOS 6.5 x86-64上的Linux壓縮工具大比拼
譯文【51CTO精選譯文】今年,我想為各位讀者轉發Gionatan Danti所寫的一篇饒有意思的文章,這篇文章***發表于其個人博客http://www.ilsistemista.net/,但愿大家也與我一樣很喜歡這篇文章。
文件壓縮是老把戲:***能夠壓縮文章的軟件之一是“SQ”,其歷史可以追溯到上世紀80年代初期,而***款廣泛使用、眾所周知的壓縮工具恐怕非1989年發布的ZIP莫屬。
換句話說,壓縮文件以節省存儲空間不是什么新鮮事;雖然目前TB級別的低成本磁盤提供了龐大空間,但有時壓縮還是頗受歡迎,因為加密不僅縮減了存儲數據所需的空間,由于減少了寫入到存儲子系統或從存儲子系統讀取的數據量,甚至還能提升輸入/輸出性能。如果將越來越快的處理器速度與多少停滯不前的機械磁盤性能(當然固態硬盤是另一碼事)相比較,更是如此。
雖然壓縮算法和軟件各不一樣,但我們基本上可以分成兩大類:普通的無損壓縮工具和專門的有損壓縮工具。
后一類包括壓縮系數相當高的壓縮工具,只有當你想保護整個一般的信息,你又沒有興趣想準確呈現原始數據的每個比特,才通常使用它們。換句話說,你可以使用有損壓縮工具,用來存儲高分辨率照片或歌曲,而不是用來將壓縮后的可執行文件存儲到磁盤上(可執行文件需要逐個比特地***存儲),或者用來存儲文本日志文件(我們不想丟失文本文件方面的信息,是吧?)。
所以,如果是一般的使用場合,無損壓縮工具是不二的選擇。但是面對那么多可用的壓縮工具,該選擇哪個是好?有時候,不同的壓縮軟件使用同一種基本算法,或者甚至同一種庫實現方法,于是到底使用哪一種壓縮工具是相對不大重要的選擇。不過,在比較使用不同壓縮算法的壓縮工具時,選擇勢必是加權的選擇:你看重的是高壓縮比還是壓縮速度?換句話說,你是需要一種速度快、壓縮比低的算法,還是一種速度快,但壓縮比高的算法?
我們在本文中將介紹多款基于幾種不同壓縮庫的不同壓縮工具:
•lz4:一種新的高速壓縮軟件和算法。
•lzop:基于快速的lzo庫,實現了LZO算法。
•gzip和pigz(多線程gzip):基于zip庫,實現了ZIP算法。
•bzip2和pbzip2(多線程bzip2):基于libbzip2庫,實現了Burrows–Wheeler壓縮方法。
•7-zip:主要(但不是完全)基于LZMA算法。
•xz:另一種基于LZMA的軟件。
軟件、實現、庫和算法
在講解壓縮未經處理的原始數據之前,不妨先闡述一下相關術語。
無損壓縮算法是一種數學算法,它定義了如何將特定的數據集縮減(壓縮)成比較小的數據集,但又不丟失信息。換句話說,它需要使用比原始版本更少的比特編碼信息,但又不丟失信息。要想做到有用,壓縮算法必須是可逆的――它應該讓我們能夠還原壓縮后的數據集,獲得原始源數據集的精確副本。不難看到基本功能(壓縮、壓縮比和壓縮速度)如何根源于算法本身,而不同算法的壓縮結果和適應范圍大不一樣。
下一步就是算法實現――簡而言之,用來表示壓縮算法的數學行為的實際代碼。這是另一個關鍵的步驟:比如說,向量化代碼或多線程代碼的速度比普通的單線程代碼要快得多。
如果某種代碼實現被認為足夠好,它常常以一種獨立的方式來封包化,形成壓縮庫。以一種獨立的庫來分化算法實現的優點在于,你可以編寫好多不同的壓縮軟件,而不需要多次重新實現基本的算法。
***,我們有了壓縮軟件本身。壓縮軟件提供了命令行接口(CLI)或圖形用戶界面(GUI),把用戶和壓縮庫“結合”起來。
有時候,算法、庫和程序有同一個名稱(比如:zip)。而有時候,我們沒有獨立的庫,但它完全是在壓縮軟件里面編制的。雖然這有點讓人混淆,但上述內容仍然適用。
總而言之,我們的基準測試將涵蓋算法、庫和軟件,如下所示:
測試平臺和方法
基準測試在搭載如下配置的系統上進行:
•PhenomII 940處理器(四核@ 3.0 GHz,1.8 GHz北橋和6 MB三級緩存)
•8 GB DDR2-800 DRAM(雙通道內存模式)
•華碩M4A78 Pro主板(采用AMD 780G + SB700芯片組)
•4只500 GB硬盤(1只西部數據綠盤,3只希捷魚子醬),4只硬盤采用高級主機控制器接口(AHCI)模式,配置方式采用了軟件RAID 10“near”布局。
•操作系統CentOS 6.5 x64
我對兩種不同數據集的壓縮和解壓縮進行了計時:
1.含有未經壓縮的CentOS 6.5 最小安裝/(root)映像(/boot不包括在內)的tar文件
2.含有Linux 3.14.1穩定內核的tar文件
為了避免磁盤子系統帶來的任何影響,我將兩個數據集都移到了使用內存作為后備存儲器的/dev/shm目錄(你可以將它視作內存虛擬盤)。
如果可能,我盡量將單線程結果與多線程結果分開來。不過,7-zip似乎沒有線程選擇選項;默認情況下,處理器提供多少硬件線程,它就能生成多少線程。于是,我用星號(*)來標記7-zip的結果。
許多壓縮工具可以進行某種調優――比如說,選擇“-1”通常意味著比“-9”更快(但效果較差)的壓縮。我還在適用的地方試用了這些標記。
壓縮CentOS 6.5根映像文件
不妨先壓縮主要含有大量可執行文件的數據集:最小的CentOS 6.5根映像文件來開始我們的分析。可執行文件和二進制文件常常可以縮減,盡管壓縮低有點偏低。
如你所見,無論是壓縮還是解壓縮,lz4和lzop都兌現了速度很快這一承諾――不過lz4是絕對的贏家。另一方面,它們的壓縮系數比較低。不過,要求它們提高壓縮比(通過“-9”參數選項符),它們的速度就會大幅慢下來,并不生成明顯更小的文件。
Gzip、尤其是bzip2的表現不是很好;雖然它們的壓縮系列更高(3X),但它們存在性能嚴重下降的不足。
7-zip和xz都有非常慢的壓縮速度,但有著很高的壓縮比和尚可接受的解壓縮速度。
切記:這些是單線程結果??梢允褂靡恍┒嗑€程壓縮軟件,讓擁有多核的現代處理器充分利用起來:
壓縮縮放:
Pigz、pbzip2和pxz得到的結果都遠勝于它們的單線程結果。不過,雖然壓縮縮放常常非常好,但只有pbzip2也能夠解壓縮加快。
#p#
壓縮linux內核3.14.1源文件
源文件是文本文件,而文本文件一般有著非常好的壓縮比。不妨看一下這些壓縮軟件在壓縮linux內核3.14.1 tar源文件時各自的表現如何:
雖然相對排名仍然一樣,但我們可以看到兩處區別:
1.不出所料,壓縮比更高一點。
2.與上一輪測試相比,lzop在壓縮時速度快得多。
現在看看多線程測試部分:
壓縮縮放:
壓縮縮放仍然很出色,而pxz名列末位。
結束語
從上述基準測試可以清楚地看出,每個壓縮軟件有其特定的使用場合:
•lz4和lzop非常適合實時壓縮或近實時壓縮,以非??斓乃俣龋峁┝舜蠓澥】臻g的優點。
•gzip、尤其是多線程pgiz版本,非常適合一般的使用場合:它既有相當高的壓縮比,速度也不慢。
•普通的單線程bzip2表現不是非常好:壓縮系數和速度都不如xz。只有出色的pbzip2多線程實現多少有所彌補。
•xz是壓縮比方面明顯的贏家,但它卻是壓縮和解壓縮方面速度較慢的軟件之一。如果你主要擔心的是壓縮比,而不是速度(比如在線存檔文件下載),那么選擇它不會有錯。
•7zip基本上是xz的衍生版本,但它的主要實現屬于窗口生態系統。在Linux下,只要使用xz,而不是7-zip。