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