Shell-Script

快速壓縮大量大文件

  • August 10, 2018

我每天生成大約 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 -9bzip2bzip2 -9. 另一個包含 lzma(7zip 的算法,因此您可以使用而不是)的基準表明,在低級別可以更快地達到 bzip2 壓縮率。除了 bzip2 之外,幾乎任何選擇都可以縮短解壓縮時間。請記住,壓縮率取決於數據,而壓縮速度取決於壓縮程序的版本、編譯方式以及執行它的 CPU。7z``tar --lzma``lzma

如果瓶頸是 CPU 並且您有多個核心,則另一個選擇是並行化壓縮。有兩種方法可以做到這一點。一種適用於任何壓縮算法的方法是單獨壓縮文件(單獨或在幾個組中)並用於parallel並行執行歸檔/壓縮命令。這可能會降低壓縮率,但會提高單個文件的檢索速度,並且可以與任何工具一起使用。另一種方法是使用壓縮工具的並行實現;這個執行緒列出了幾個。

引用自:https://unix.stackexchange.com/questions/281158