การใช้มัลติคอร์สำหรับการบีบอัด / คลายการบีบอัด tar + gzip / bzip


225

ปกติฉันบีบอัดโดยใช้tar zcvfและคลายการบีบอัดโดยใช้tar zxvf(ใช้ gzip เนื่องจากนิสัย)

เมื่อเร็ว ๆ นี้ฉันได้รับซีพียู Quad คอร์ที่มีไฮเปอร์เธรดดังนั้นฉันมี 8 คอร์แบบลอจิคัลและฉันสังเกตเห็นว่าหลายคอร์ไม่ได้ใช้ในระหว่างการบีบอัด / คลายการบีบอัด

มีวิธีใดบ้างที่ฉันสามารถใช้ประโยชน์จากแกนที่ไม่ได้ใช้เพื่อทำให้เร็วขึ้น?


วิธีแก้ปัญหาที่เสนอโดย Xiong Chiamiov ทำงานได้อย่างสวยงาม ฉันเพิ่งสำรองข้อมูลแล็ปท็อปด้วย. tar.bz2 และใช้เวลา 132 นาทีโดยใช้ cpu thread เพียงอันเดียว จากนั้นฉันรวบรวมและติดตั้ง tar จากแหล่งที่มา: gnu.org/software/tarฉันรวมตัวเลือกที่กล่าวถึงในขั้นตอนการกำหนดค่า: ./configure --with-gzip = pigz --with-bzip2 = lbzip2 --with-lzip = plzip ฉันสำรองข้อมูลอีกครั้งและใช้เวลาเพียง 32 นาที ดีกว่าการปรับปรุง 4X! ฉันเฝ้าดูการตรวจสอบระบบและเก็บไว้ทั้งหมด 4 ซีพียู (8 เธรด) แบนที่ 100% ตลอดเวลา นั่นคือทางออกที่ดีที่สุด
Warren Severin

คำตอบ:


309

คุณสามารถใช้pigzแทน gzip ซึ่งทำการบีบอัด gzip ในหลายคอร์ แทนที่จะใช้ตัวเลือก -z คุณจะใช้มันผ่าน pigz:

tar cf - paths-to-archive | pigz > archive.tar.gz

โดยค่าเริ่มต้น pigz ใช้จำนวนแกนที่มีอยู่หรือแปดถ้าไม่สามารถสอบถามได้ คุณสามารถขอเพิ่มเติมได้ด้วย -pn เช่น -p 32. pigz มีตัวเลือกเหมือนกับ gzip ดังนั้นคุณสามารถร้องขอการบีบอัดที่ดีกว่าด้วย -9 เช่น

tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz

3
คุณจะใช้ pigz ในการขยายขนาดแบบเดียวกันได้อย่างไร? หรือมันใช้งานได้กับการบีบอัดเท่านั้น?
user788171

42
pigz ใช้หลายแกนสำหรับการบีบอัด แต่มีการปรับปรุง จำกัด เหนือแกนเดี่ยวเท่านั้น รูปแบบที่ไม่ยุบไม่ให้ตัวเองบีบอัดแบบขนาน ส่วนการบีบอัดข้อมูลจะต้องทำตามลำดับ แกนอื่น ๆ สำหรับการบีบอัด pigz ใช้สำหรับการอ่านการเขียนและการคำนวณ CRC เมื่อบีบอัดบนมืออื่น ๆ ที่ได้รับ pigz ใกล้กับปัจจัยของnปรับปรุงกับnแกน
Mark Adler

7
ยัติภังค์ที่นี่คือ stdout (ดูหน้านี้ )
Garrett

3
ใช่. เข้ากันได้ 100% ทั้งสองทิศทาง
Mark Adler

4
ไม่มีประสิทธิภาพของ CPU ที่ใช้เวลาในการแสดงผลดังนั้นจึงไม่ช่วยอะไรมาก รูปแบบ tar เป็นเพียงสำเนาของไฟล์อินพุตที่มีส่วนหัวบล็อกอยู่ระหว่างไฟล์
Mark Adler

324

นอกจากนี้คุณยังสามารถใช้การตั้งค่าสถานะ tar "--use-compress-program =" เพื่อบอก tar โปรแกรมบีบอัดที่จะใช้

ตัวอย่างการใช้:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 

21
นี่เป็นนักเก็ตเล็ก ๆ ที่มีความรู้และสมควรได้รับการโหวตมากขึ้น ฉันไม่รู้เลยว่าตัวเลือกนี้มีอยู่จริงและฉันอ่านหน้าสองสามครั้งในช่วงหลายปี
Randall Hunt

2
@ValerioSchiavoni: ไม่ได้อยู่ที่นี่ฉันได้รับการโหลดเต็มทั้ง 4 แกน (Ubuntu 15.04 'Vivid')
bovender

8
ฉันชอบtar - dir_to_zip | pv | pigz > tar.filepv ช่วยฉันประเมินคุณสามารถข้ามมันได้ แต่ก็ยังง่ายต่อการเขียนและจดจำ
Offenso

@ NathanS.Watson-Haigh ใช่แล้ว เพียงใส่ชื่อโปรแกรมและอาร์กิวเมนต์ในเครื่องหมายคำพูด man tarกล่าวว่าดังนั้นเช่นเดียวนี้
Marc.2377

1
ในปี 2020 zstdเป็นเครื่องมือที่เร็วที่สุดในการทำเช่นนี้ การเร่งความเร็วที่สังเกตเห็นได้ชัดเจนขณะบีบอัดและคลายการบีบอัด ใช้tar -cf --use-compress-program=zstdmtเพื่อทำกับหลายเธรด
jadelord

112

วิธีการทั่วไป

มีตัวเลือกสำหรับtarโปรแกรม:

-I, --use-compress-program PROG
      filter through PROG (must accept -d)

คุณสามารถใช้ยูทิลิตี้ Archiver หรือ Compressor เวอร์ชั่นหลายเธรดได้

ผู้จัดเก็บมัลติเธรดที่ได้รับความนิยมมากที่สุดคือpigz (แทนที่จะเป็น gzip) และpbzip2 (แทนที่จะเป็น bzip2) ตัวอย่างเช่น

$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive

Archiver ต้องยอมรับ -d หากยูทิลิตี้ทดแทนของคุณไม่มีพารามิเตอร์นี้และ / หรือคุณต้องการระบุพารามิเตอร์เพิ่มเติมให้ใช้ไพพ์ (เพิ่มพารามิเตอร์หากจำเป็น):

$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz

อินพุตและเอาต์พุตของเธรดเดี่ยวและมัลติเธรดเข้ากันได้ คุณสามารถบีบอัดโดยใช้รุ่นมัลติเธรดและคลายการบีบอัดโดยใช้รุ่นเดียวและในทางกลับกัน

p7zip

สำหรับ p7zip สำหรับการบีบอัดคุณจำเป็นต้องมีเชลล์สคริปต์ขนาดเล็กดังต่อไปนี้:

#!/bin/sh
case $1 in
  -d) 7za -txz -si -so e;;
   *) 7za -txz -si -so a .;;
esac 2>/dev/null

บันทึกเป็น 7zhelper.sh นี่คือตัวอย่างการใช้งาน:

$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z

XZ

เกี่ยวกับการรองรับ XZ แบบมัลติเธรด หากคุณกำลังใช้เวอร์ชัน 5.2.0 หรือสูงกว่าของ XZ Utils คุณสามารถใช้หลายคอร์สำหรับการบีบอัดโดยการตั้งค่า-Tหรือค่า--threadsที่เหมาะสมผ่านตัวแปรสภาพแวดล้อม XZ_DEFAULTS (เช่นXZ_DEFAULTS="-T 0")

นี่คือส่วนของผู้ชายสำหรับรุ่น 5.1.0phala:

การบีบอัดและการคลายการบีบอัดแบบมัลติเธรดยังไม่ได้ใช้งานดังนั้นตัวเลือกนี้จึงไม่มีผลกระทบในตอนนี้

อย่างไรก็ตามสิ่งนี้จะไม่ทำงานสำหรับการคลายการบีบอัดไฟล์ที่ยังไม่ได้รับการบีบอัดด้วยการเปิดใช้งานเธรด จากคนสำหรับรุ่น 5.2.2:

ยังไม่ได้ใช้การบีบอัดเธรด มันจะทำงานกับไฟล์ที่มีหลายบล็อกที่มีข้อมูลขนาดในส่วนหัวของบล็อก ไฟล์ทั้งหมดที่บีบอัดในโหมดมัลติเธรดเป็นไปตามเงื่อนไขนี้ แต่ไฟล์ที่บีบอัดในโหมดเธรดเดียวจะไม่ใช้แม้ว่า --block-size = size จะถูกใช้

คอมไพล์ด้วยการเปลี่ยน

หากคุณสร้าง tar จากแหล่งข้อมูลคุณสามารถคอมไพล์ใหม่ด้วยพารามิเตอร์

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip

หลังจากคอมไพล์ tar ใหม่ด้วยตัวเลือกเหล่านี้คุณสามารถตรวจสอบผลลัพธ์ของความช่วยเหลือของ tar:

$ tar --help | grep "lbzip2\|plzip\|pigz"
  -j, --bzip2                filter the archive through lbzip2
      --lzip                 filter the archive through plzip
  -z, --gzip, --gunzip, --ungzip   filter the archive through pigz

1
นี่เป็นคำตอบที่ดีที่สุดแน่นอน ฉันจะสร้าง tar ของฉันขึ้นมาใหม่!

1
ฉันเพิ่งพบpbzip2และmpibzip2 mpibzip2 ดูมีแนวโน้มมากสำหรับกลุ่มหรือถ้าคุณมีแล็ปท็อปและคอมพิวเตอร์ตั้งโต๊ะแบบมัลติคอร์เช่น

นี่เป็นคำตอบที่ยอดเยี่ยมและซับซ้อน อาจเป็นการดีที่จะกล่าวถึงว่าการบีบอัดมัลติเธรด (เช่นกับpigz) เปิดใช้งานเฉพาะเมื่อมันอ่านจากไฟล์ การประมวลผล STDIN อาจช้ากว่าปกติ
oᴉɹǝɥɔ

3
บวก 1 สำหรับxzตัวเลือก มันเป็นวิธีที่ง่ายที่สุด แต่มีประสิทธิภาพ
selurvedu

2
export XZ_DEFAULTS="-T 0"ก่อนที่จะโทรtarด้วยตัวเลือก-Jสำหรับการบีบอัด xz ทำงานเหมือนมีเสน่ห์
SCAI

13

คุณสามารถใช้ช็อตคัท-Iสำหรับ--use-compress-programสวิตช์ของ tar และเรียกใช้pbzip2การบีบอัด bzip2 ในหลายคอร์ได้:

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/

ดี TL; DR สำหรับ @ MaximSuslov ของคำตอบ
einpoklum

ส่งคืนtar: home/cc/ziptest: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors`
Arash

1

หากคุณต้องการความยืดหยุ่นมากขึ้นด้วยชื่อไฟล์และตัวเลือกการบีบอัดคุณสามารถใช้:

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec \
tar -P --transform='s@/my/path/@@g' -cf - {} + | \
pigz -9 -p 4 > myarchive.tar.gz

ขั้นตอนที่ 1: find

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec

คำสั่งนี้จะมองหาไฟล์ที่คุณต้องการที่จะเก็บในกรณีนี้และ/my/path/*.sql /my/path/*.logเพิ่มมาก-o -name "pattern"เท่าที่คุณต้องการ

-execจะรันคำสั่งถัดไปโดยใช้ผลลัพธ์ของfind:tar

ขั้นตอนที่ 2: tar

tar -P --transform='s@/my/path/@@g' -cf - {} +

--transformเป็นพารามิเตอร์การแทนที่สตริงแบบง่าย มันจะตัดเส้นทางของไฟล์จากไฟล์เก็บถาวรเพื่อให้รูทของ tarball กลายเป็นไดเรกทอรีปัจจุบันเมื่อทำการแตกไฟล์ โปรดทราบว่าคุณไม่สามารถใช้-Cตัวเลือกในการเปลี่ยนไดเรกทอรีเนื่องจากคุณจะสูญเสียผลประโยชน์find: ไฟล์ทั้งหมดของไดเรกทอรีจะถูกรวมไว้ด้วย

-Pบอกtarให้ใช้พา ธ สัมบูรณ์ดังนั้นจึงไม่เรียกใช้คำเตือน "การลบนำหน้า` / 'ออกจากชื่อสมาชิก " ชั้นนำ '/' กับลบออกได้โดย--transformอยู่แล้ว

-cf -บอกtarให้ใช้ชื่อ tarball ที่เราจะระบุในภายหลัง

{} +ใช้ทุกไฟล์ที่findพบก่อนหน้านี้

ขั้นตอนที่ 3: pigz

pigz -9 -p 4

ใช้พารามิเตอร์ได้มากเท่าที่คุณต้องการ ในกรณีนี้-9คือระดับการบีบอัดและ-p 4เป็นจำนวนคอร์ที่ใช้สำหรับการบีบอัด หากคุณใช้งานบนเว็บเซิร์ฟเวอร์ที่โหลดจำนวนมากคุณอาจไม่ต้องการใช้แกนประมวลผลที่มีอยู่ทั้งหมด

ขั้นตอนที่ 4: ชื่อไฟล์เก็บถาวร

> myarchive.tar.gz

ในที่สุด


0

A (DE) เครื่องมือการบีบอัดค่อนข้างใหม่คุณอาจต้องการที่จะต้องพิจารณาคือzstandard มันใช้งานได้อย่างยอดเยี่ยมในการใช้คอร์สำรองและทำให้การแลกเปลี่ยนที่ยอดเยี่ยมเมื่อเทียบกับอัตราการบีบอัดเทียบกับเวลาในการบีบอัด (de) นอกจากนี้ยังสามารถปรับแต่งได้ตามความต้องการของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.