快速壓縮大量大文件
我每天生成大約 200 GB 的日誌數據,分佈在大約 150 個不同的日誌文件中。
我有一個將文件移動到臨時位置並在臨時目錄上執行 tar-bz2 的腳本。
我得到了很好的結果,因為 200 GB 日誌被壓縮到大約 12-15 GB。
問題是壓縮文件需要很長時間。cron作業每天凌晨 2:30 執行,並持續執行到下午 5:00-6:00 。
有沒有辦法提高壓縮的速度,更快地完成工作?有任何想法嗎?
不用擔心其他程序,壓縮發生的位置在NAS上,我可以在專用VM上執行掛載 NAS並從那裡執行壓縮腳本。
以下是top的輸出供參考:
top - 15:53:50 up 1093 days, 6:36, 1 user, load average: 1.00, 1.05, 1.07 Tasks: 101 total, 3 running, 98 sleeping, 0 stopped, 0 zombie Cpu(s): 25.1%us, 0.7%sy, 0.0%ni, 74.1%id, 0.0%wa, 0.0%hi, 0.1%si, 0.1%st Mem: 8388608k total, 8334844k used, 53764k free, 9800k buffers Swap: 12550136k total, 488k used, 12549648k free, 4936168k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7086 appmon 18 0 13256 7880 440 R 96.7 0.1 791:16.83 bzip2 7085 appmon 18 0 19452 1148 856 S 0.0 0.0 1:45.41 tar cjvf /nwk_storelogs/compressed_logs/compressed_logs_2016_30_04.tar.bz2 /nwk_storelogs/temp/ASPEN-GC-32459:nkp-aspn-1014.log /nwk_stor 30756 appmon 15 0 85952 1944 1000 S 0.0 0.0 0:00.00 sshd: appmon@pts/0 30757 appmon 15 0 64884 1816 1032 S 0.0 0.0 0:00.01 -tcsh
第一步是弄清楚瓶頸是什麼:是磁碟 I/O、網路 I/O 還是 CPU?
如果瓶頸是磁碟 I/O,那麼您無能為力。確保磁碟不提供許多並行請求,因為這只會降低性能。
如果瓶頸是網路 I/O,則在儲存文件的機器上執行壓縮過程:在 CPU 更強大的機器上執行它只有在 CPU 是瓶頸時才有幫助。
如果瓶頸是 CPU,那麼首先要考慮的是使用更快的壓縮算法。Bzip2 不一定是一個糟糕的選擇——它的主要弱點是解壓縮速度——但你可以使用 gzip 並犧牲一些大小來提高壓縮速度,或者嘗試其他格式,例如 lzop 或 lzma。您還可以調整壓縮級別:bzip2 預設為
-9
(最大塊大小,因此最大壓縮,但也是最長壓縮時間);將環境變數設置為BZIP2
類似-3
嘗試壓縮級別 3的值。此執行緒和此執行緒討論常見的壓縮算法;特別是 derobert 引用的這篇博文給出了一些基準,這些基準表明gzip -9
或bzip2
與bzip2 -9
. 另一個包含 lzma(7zip 的算法,因此您可以使用而不是)的基準表明,在低級別可以更快地達到 bzip2 壓縮率。除了 bzip2 之外,幾乎任何選擇都可以縮短解壓縮時間。請記住,壓縮率取決於數據,而壓縮速度取決於壓縮程序的版本、編譯方式以及執行它的 CPU。7z``tar --lzma``lzma
如果瓶頸是 CPU 並且您有多個核心,則另一個選擇是並行化壓縮。有兩種方法可以做到這一點。一種適用於任何壓縮算法的方法是單獨壓縮文件(單獨或在幾個組中)並用於
parallel
並行執行歸檔/壓縮命令。這可能會降低壓縮率,但會提高單個文件的檢索速度,並且可以與任何工具一起使用。另一種方法是使用壓縮工具的並行實現;這個執行緒列出了幾個。