บีบอัดไฟล์ขนาดใหญ่จำนวนมากอย่างรวดเร็ว


16

ฉันมีการสร้างข้อมูลบันทึกข้อมูลประมาณ 200 GB ต่อวันกระจายอยู่ในไฟล์บันทึกต่างๆประมาณ 150 ไฟล์

ฉันมีสคริปต์ที่ย้ายไฟล์ไปยังตำแหน่งชั่วคราวและทำ tar-bz2 ในไดเรกทอรีชั่วคราว

ฉันได้รับผลลัพธ์ที่ดีเนื่องจากมีการบีบอัดบันทึก 200 GB ถึงประมาณ 12-15 GB

ปัญหาคือมันใช้เวลาตลอดไปในการบีบอัดไฟล์ cronงานทำงานที่ 02:30 ทุกวันและยังทำงานต่อไปจนถึง 5: 00-6: 12:00

มีวิธีปรับปรุงความเร็วของการบีบอัดและทำให้งานเสร็จเร็วขึ้นหรือไม่ ความคิดใด ๆ

ไม่ต้องกังวลกับกระบวนการอื่น ๆ ทั้งหมดตำแหน่งที่มีการบีบอัดเกิดขึ้นบนNASและฉันสามารถเรียกใช้ NAS บนVMเฉพาะและเรียกใช้สคริปต์การบีบอัดจากที่นั่น

นี่คือการส่งออกของด้านบนสำหรับการอ้างอิง:

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

2
หากคุณมี CPU หลายตัวและคุณมีหรือสามารถแบ่งออกเป็นหลายไฟล์ tar คุณสามารถเรียกใช้การบีบอัดหลาย ๆ
Jeff Schaller

@JeffSchaller เป็นไปได้หรือไม่ที่จะทำให้กระบวนการ bzip2 หลายรายการบีบอัดไฟล์ต่างกัน แต่เขียนไปยังtar.bz2ไฟล์เดียวกัน
anu

2
ไฟล์บันทึกถูกสร้างขึ้นบนโลคัลดิสก์ก่อนที่จะย้ายไปที่ NAS หรือไม่ ถ้าเป็นเช่นนั้นบีบอัดแล้วย้าย; ด้วยวิธีนี้คุณจะส่งข้อมูลเพียง 15Gb ผ่านเครือข่ายมากกว่า 100 (ย้าย) และ 115 (100read + 15write) เมื่อทำการบีบอัด ดูเหมือนว่าคุณอาจใช้ CPU ในกระบวนการ bzip2 นั้นดังนั้นการรันหลาย ๆ ตัวในแบบขนาน (หนึ่งต่อ CPU) อาจช่วยได้ (จนกว่าคุณจะถึงขีด จำกัด I / O) หรือใช้การบีบอัดที่เรียบง่ายกว่า (เช่น "gzip -1") มันจะไม่ประหยัดพื้นที่ดิสก์มาก แต่มันจะทำงานได้เร็วขึ้น
Stephen Harris

@Sukminder ฉันจะลองทำสิ่งนี้และเห็นความแตกต่างของขนาด ขอบคุณ
anu

topผลลัพธ์ของคุณแสดงให้เห็นว่าbzip2กระบวนการแบบเธรดเดี่ยวของคุณนั้นใช้งานได้สูงสุดหนึ่งคอร์ แต่คุณกำลังรันบนระบบควอดคอร์ (หนึ่งกระบวนการที่ใช้ CPU 100% -> 25.1%เวลา CPU ของพื้นที่ผู้ใช้และ 74% ที่ไม่ได้ทำงาน) ดังนั้นเมื่อมีการเปลี่ยนแปลงเล็กน้อยคุณสามารถเปลี่ยนได้เร็วขึ้น 4 เท่าเว้นแต่จะมีบางอย่างกลายเป็นคอขวด อ่านคำตอบของ Gilles อย่างระมัดระวัง พิจารณาใช้ CPU ในกล่องเดียวกันกับดิสก์ที่เก็บข้อมูลเพื่อทำการบีบอัด (คุณอาจบีบอัดไฟล์บางไฟล์ของคุณในกล่องเดียวและอีกไฟล์ในอีกไฟล์หนึ่งและเก็บถาวรหลังจากนั้นจึงใช้งาน CPU ทั้งคู่)
Peter Cordes

คำตอบ:


25

ขั้นตอนแรกคือการค้นหาว่าคอขวดคืออะไร: เป็นดิสก์ I / O, เครือข่าย I / O หรือ CPU หรือไม่

หากคอขวดเป็น I / O ของดิสก์คุณจะไม่สามารถทำอะไรได้มากมาย ตรวจสอบให้แน่ใจว่าดิสก์ไม่ตอบสนองการร้องขอแบบขนานจำนวนมากเนื่องจากสามารถลดประสิทธิภาพได้เท่านั้น

หากคอขวดคือ I / O เครือข่ายให้เรียกใช้กระบวนการบีบอัดบนเครื่องที่จัดเก็บไฟล์: การเรียกใช้บนเครื่องที่มี CPU แบบ beefier จะช่วยได้ก็ต่อเมื่อ CPU เป็นคอขวดเท่านั้น

หากคอขวดเป็นซีพียูสิ่งแรกที่ต้องพิจารณาคือใช้อัลกอริทึมการบีบอัดที่เร็วขึ้น Bzip2 ไม่จำเป็นต้องเป็นตัวเลือกที่แย่ - จุดอ่อนหลักคือความเร็วในการบีบอัด - แต่คุณสามารถใช้ gzip และเสียสละขนาดสำหรับความเร็วในการบีบอัดหรือลองใช้รูปแบบอื่นเช่น lzop หรือ lzma คุณอาจปรับระดับการบีบอัด: ค่าเริ่มต้น bzip2 เป็น-9(ขนาดบล็อกสูงสุดดังนั้นการบีบอัดสูงสุด แต่เวลาการบีบอัดที่ยาวที่สุด); ตั้งค่าตัวแปรสภาพแวดล้อมBZIP2เป็นค่าที่ต้องการ-3ลองระดับการบีบอัด 3 เธรดนี้และเธรดนี้พูดถึงอัลกอริธึมการบีบอัดทั่วไป โดยเฉพาะการโพสต์บล็อกที่อ้างถึงโดย Derobert ให้เกณฑ์มาตรฐานบางอย่างที่แนะนำgzip -9หรือbzip2bzip2 -9ที่มีระดับต่ำอาจจะมีการประนีประนอมที่ดีเมื่อเทียบกับ เกณฑ์มาตรฐานอื่นซึ่งรวมถึง lzma (อัลกอริทึมของ 7zip ดังนั้นคุณอาจใช้7zแทนtar --lzma) แนะนำว่าlzmaในระดับต่ำสามารถเข้าถึงอัตราส่วนการบีบอัด bzip2 ได้เร็วขึ้น ตัวเลือกอื่น ๆ นอกเหนือจาก bzip2 จะปรับปรุงเวลาในการคลายการบีบอัด โปรดทราบว่าอัตราส่วนการบีบอัดขึ้นอยู่กับข้อมูลและความเร็วในการบีบอัดขึ้นอยู่กับเวอร์ชันของโปรแกรมบีบอัดวิธีการรวบรวมและ CPU ที่ใช้งาน

ตัวเลือกอื่นถ้าคอขวดคือ CPU และคุณมีหลายคอร์คือการบีบอัดแบบขนาน มีสองวิธีในการทำเช่นนั้น สิ่งหนึ่งที่ใช้ได้กับอัลกอริธึมการบีบอัดใด ๆ คือการบีบอัดไฟล์แยกกัน (แยกทีละตัวหรือเป็นสองสามกลุ่ม) และใช้parallelเพื่อรันคำสั่งการเก็บถาวร / บีบอัดแบบขนาน สิ่งนี้อาจลดอัตราส่วนการบีบอัด แต่เพิ่มความเร็วในการดึงไฟล์แต่ละไฟล์และทำงานกับเครื่องมือใด ๆ อีกวิธีหนึ่งคือการใช้เครื่องมือการบีบอัดแบบขนาน หัวข้อนี้จะแสดงหลายรายการ


4
"ถ้าคอขวดเป็น I / O ของดิสก์คุณก็สามารถทำได้ไม่มาก" นั่นอาจเป็นจริงที่นี่เนื่องจากอัตราส่วนการบีบอัดอยู่ในระดับที่ดีอยู่แล้ว แต่โดยทั่วไปเมื่อ I / O เป็นคอขวดมันอาจคุ้มค่าที่จะใช้ CPU มากขึ้นเพื่อให้ได้อัตราส่วนการอัดที่ดีกว่า (โดยใช้การตั้งค่าการบีบอัดที่แตกต่างกัน .. คุณไม่สามารถลด "ฉัน" ได้ (เพราะคุณจำเป็นต้องอ่านข้อมูลทั้งหมด) แต่บางครั้งคุณสามารถลด "O" :-) ได้อย่างมาก
psmears

1
ถ้าคุณบอกว่า7zจะไม่สร้างไฟล์เก็บถาวร "solid" หรือ จำกัด ขนาดของบล็อก "solid" มันจะรันเธรด LZMA แบบหลายส่วนพร้อมกัน IIRC ข้อมูลล็อกไฟล์เป็นกรณีพิเศษสำหรับการบีบอัดเนื่องจากมีแนวโน้มที่จะซ้ำซ้อนสูง (มีความคล้ายคลึงกันมากระหว่างบรรทัด) มันคุ้มค่าแน่นอนทดสอบgzip, bzip2และxzในล็อกไฟล์ที่เฉพาะเจาะจงของ OP มากกว่าแค่มองไปที่มาตรฐานการบีบอัดทั่วไปที่จะออกกฎตัวเลือกใด ๆ คอมเพรสเซอร์รวดเร็วแม้จะมีมูลค่าการพิจารณา ( lzop, lz4, snappy)
Peter Cordes

คอมเพรสเซอร์ LZMA xzที่แนะนำวันนี้คือ ใช้tar -Jหรือ--xzไม่ --lzma .lzmaถือว่าเป็น "มรดก" รูปแบบไฟล์ การทำซ้ำหลายรูปแบบของไฟล์สำหรับการบีบอัด LZMA นั้นค่อนข้างน่าละอายและสิ่งที่ควรได้รับในครั้งแรก แต่ AFAIK เป็นสิ่งที่ดีในขณะนี้และ. xz ไม่ได้ถูกแทนที่ด้วยรูปแบบไฟล์อื่นสำหรับสตรีมการบีบอัดเดียวกัน
Peter Cordes

7z มีการบีบอัดที่ดีเยี่ยมและมีหลายเธรด แต่เนื่องจากรูปแบบการเก็บถาวร (ต้องการดัชนีหรืออาจเป็นข้อบกพร่อง) ฉันไม่คิดว่ามันจะสามารถใช้งานได้ในช่วงกลางของท่อส่ง - มันจะไม่ใช้ stdin และ stdout ในเวลาเดียวกัน
Xen2050

สิ่งนี้มีประโยชน์และลึกซึ้งจริงๆ ทีมของฉันคิดว่าการดำเนินการผ่าน NFS เป็นคอขวดขนาดใหญ่
anu

16

คุณสามารถติดตั้งpigzขนาน gzip และใช้ tar ด้วยการบีบอัดแบบมัลติเธรด ชอบ:

tar -I pigz -cf file.tar.gz *

ในกรณีที่-Iตัวเลือกคือ:

-I, --use-compress-program PROG
  filter through PROG

แน่นอนถ้า NAS ของคุณไม่มี CPU หลายคอร์ / ทรงพลังคุณก็ถูก จำกัด ด้วยพลังซีพียู

ความเร็วของฮาร์ดดิสก์ / อาเรย์ที่ VM และการบีบอัดกำลังทำงานสามารถเป็นคอขวดได้เช่นกัน


1
และถ้าคุณต้องการที่จะใช้ bzip2 คุณสามารถใช้หรือpbzip2 lbzip2
Radovan Garabík

2
นี่คือคำตอบที่ดีที่สุดของคุณ แต่ก่อนอื่นตรวจสอบให้แน่ใจว่าการย้ายครั้งแรกของคุณไปยังตำแหน่งที่อยู่ในระบบไฟล์เดียวกับไฟล์ต้นฉบับ มิฉะนั้น "ย้าย" ของคุณเป็นไบต์คัดลอกแล้วลบ ในระบบไฟล์เดียวกันการย้ายคือการจัดเรียงใหม่ของการเชื่อมโยงระบบไฟล์ นั่นคือคำสั่งของขนาดเร็วกว่า สำหรับ logfiles ของฉันที่มีขนาดใหญ่หลายร้อยกิกะไบต์, pigz สร้างความแตกต่าง คุณสามารถบอกได้ว่ามีเธรดแบบขนานกี่ตัวที่จะเรียกใช้ ตราบใดที่ซีพียูของคุณมีหลายคอร์ฉันจะไม่ใช้เวลาในการตรวจสอบมากนัก คุณอาจต้องการ pigz ในทุกกรณี คุณสามารถเร่งความเร็วได้ทันที
Mike S

เมื่อคุณ pigz'ing ให้ดูที่ htop และ iostat ของคุณและสังเกตประสิทธิภาพของระบบหากคุณต้องการตรวจสอบระบบของคุณเพิ่มเติม แต่อีกครั้งฉันจะไม่ลองและบีบอัดไฟล์ขนาดใหญ่โดยไม่ต้อง pigz ในระบบมัลติคอร์ที่ทันสมัยเพียงแค่โง่ที่จะไม่ใช้มัน มันช่างเป็นชัยชนะที่คุณจะได้เห็นทันที
Mike S

7

วิธีการบีบอัดข้อมูลที่เร็วและมีประสิทธิภาพที่สุดคือการสร้างข้อมูลให้น้อยลง

คุณกำลังสร้างบันทึกชนิดใด ฟังทุกวัน 200GB ฟังดูค่อนข้างเยอะ (ยกเว้นว่าคุณเป็น google หรือ ISP ... ) ให้พิจารณาว่าข้อความ 1MB นั้นมีประมาณ 500 หน้าดังนั้นคุณสร้างข้อความได้เทียบเท่า 100 ล้านหน้าต่อวัน เติมห้องสมุดของรัฐสภาในหนึ่งสัปดาห์

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


1
นี่เป็นวิธีแก้ปัญหาทางปรัชญาที่น่าสนใจ ทางออกของปัญหาชีวิตส่วนใหญ่คือการหลีกเลี่ยงปัญหาทั้งหมด จนกระทั่งคนหนึ่งตรวจสอบข้อเสนอแนะอย่างใกล้ชิดและตระหนักว่ามีคน 100 คนและได้รับการอนุมัติ 1,000 ครั้งที่เราต้องผ่านเพื่อให้บรรลุสิ่งนี้
anu

1
@anu ไม่มีการตั้งคำถามดังนั้นฉันจึงไม่คิดว่าจะเป็นใคร และคุณช่วยบอกฉันทีว่าคุณได้รับการอนุมัติจำนวน 1,000 รายการจากที่ไหน สำหรับฉันดูเหมือนว่าคุณเพิ่งทำมันขึ้นมา
Emily L.

ฉันจะโหวตสิ่งนี้ นี่เป็นวิธีที่มักถูกมองข้าม แต่เมื่อสังเกตเห็นว่าทางออกที่ยอดเยี่ยมสำหรับปัญหามากมายในชีวิต
jrw32982 รองรับ Monica

1
อืม .. ตอนนี้ที่ฉันไม่ทำงานอีกต่อไปฉันก็สามารถเปิดเผยได้ว่านี่เป็นปัญหาของ Apple โดยเฉพาะอย่างยิ่งในสแต็กบริการที่ให้บริการร้านค้าออนไลน์ ... ดังนั้นการอนุมัติ 1,000 รายการนั้นเป็นเรื่องจริงเพราะพวกเขามีไมโครไซต์ 1000 รายการและแต่ละรายการจะสร้างบันทึกที่ต้องบีบอัดและจะต้องลงชื่อออกจากการเปลี่ยนแปลง ระดับการบันทึก ฯลฯ ... ต่อไป ... เราคิดหาวิธีแก้ปัญหาสำหรับ btw ในห้องนี้ .. ซึ่งเทียบเท่ากับ gzip แบบขนานที่ให้ offloaded ไปยัง microservices อื่น
anu

3

คุณสามารถลดจำนวนการบีบอัด (ในแง่ของการประหยัดพื้นที่) เพื่อให้เร็วขึ้น ในการเริ่มต้น bzip2 นั้นช้ากว่า gzip มากแม้ว่ามันจะบีบขนาดเล็กลง นอกจากนี้คุณยังสามารถเปลี่ยนระดับการบีบอัดของ bzip2, gzip หรือโปรแกรมบีบอัดส่วนใหญ่เป็นขนาดการแลกเปลี่ยนสำหรับความเร็ว

หากคุณไม่ต้องการแลกเปลี่ยนขนาดของความเร็วคุณยังคงสามารถรับขนาดเดียวกันหรือเล็กกว่าในขณะที่ยังคงได้รับการปรับปรุงความเร็วโดยใช้คอมเพรสเซอร์ที่ใช้ LZMA (xz เป็นต้น)

คุณจะพบเกณฑ์มาตรฐานหากคุณค้นหา แต่ทางออกที่ดีที่สุดของคุณคือทำการทดสอบกับไฟล์ของคุณเองบนฮาร์ดแวร์เป้าหมายของคุณ


3

หากข้อกำหนดเดียวคือการบีบอัดข้อมูลรวดเร็วฉันขอแนะนำlz4อย่างมาก

มันถูกใช้ในหลาย ๆ ที่ที่ความเร็วในการบีบอัดสำคัญกว่าอัตราส่วนการบีบอัด (เช่นระบบไฟล์ที่มีการบีบอัดแบบโปร่งใสเช่น ZFS)


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