ทำไม gzip ถึงช้าทั้งๆที่ซีพียูและประสิทธิภาพของฮาร์ดไดรฟ์ไม่ได้ถูก maxed?


14

ฉันมีไฟล์ JSON บางไฟล์ 20 GB แต่ละไฟล์ที่ฉันต้องการบีบอัดด้วยgzip:

gzip file1.json

นี่ใช้ซีพียูเต็มแกนหนึ่งตัว

มันประมวลผลประมาณ 25 MB / s (ตรวจสอบในatop), ฮาร์ดไดรฟ์ของฉันสามารถอ่าน 125 MB / s และฉันมี 3 คอร์โปรเซสเซอร์ฟรีดังนั้นฉันคาดว่าจะได้รับความเร็วเมื่อบีบอัดหลายไฟล์ในแบบคู่ขนาน ดังนั้นฉันจึงวิ่งในอาคารอื่น ๆ :

gzip file2.json
gzip file3.json
gzip file4.json

น่าแปลกที่ปริมาณงานของฉันไม่เพิ่มขึ้น CPU อยู่ที่ประมาณ 25% ของแต่ละคอร์และ HD ของฉันยังคงอ่านที่ 25 MB / s เท่านั้น

ทำไมและวิธีการที่อยู่หรือไม่

คำตอบ:


17

ฉันพบมัน:

เหตุผลก็คือว่าgzipทำงานบน (ในแง่ของความเร็วของ CPU VS HD ความเร็วแสวงหาวันนี้) ขนาดบัฟเฟอร์ที่ต่ำมาก

มันอ่านไม่กี่ KB จากไฟล์อินพุตบีบอัดและฟลัชไปยังไฟล์เอาต์พุต ด้วยความจริงที่ว่าสิ่งนี้ต้องการฮาร์ดไดรฟ์แสวงหาการดำเนินการเพียงไม่กี่สามารถทำได้ต่อวินาที

เหตุผลที่ทำให้การแสดงของฉันไม่ได้เพิ่มขึ้นเพราะมีอยู่คนหนึ่งที่gzipแสวงหาอย่างบ้าคลั่ง


ฉันทำงานนี้โดยใช้bufferยูทิลิตี้ยูนิกซ์:

buffer -s 100000 -m 10000000 -p 100 < file1.json | gzip > file1.json.gz

โดยการบัฟเฟอร์อินพุตจำนวนมากก่อนส่งไปยัง gzip จำนวนของการค้นหาขนาดเล็กสามารถลดลงอย่างมาก ตัวเลือก:

  • -sและ-mจะระบุขนาดของบัฟเฟอร์ (ฉันเชื่อว่ามันเป็น KB แต่ไม่แน่ใจ)
  • -p 100 ตรวจสอบให้แน่ใจว่าข้อมูลถูกส่งผ่านไปยัง gzip เมื่อบัฟเฟอร์เต็ม 100%

เมื่อใช้สี่สิ่งเหล่านี้พร้อมกันฉันสามารถรับปริมาณงานได้ 4 * 25 MB / s ตามที่คาด


ฉันยังสงสัยว่าทำไม gzip ไม่อนุญาตให้เพิ่มขนาดบัฟเฟอร์ - ด้วยวิธีนี้มันไม่มีประโยชน์เลยหากใช้กับดิสก์ที่หมุน

แก้ไข : ฉันลองใช้ลักษณะการทำงานของโปรแกรมบีบอัดเพิ่มเติมอีกสองสามข้อ:

  • bzip2 ประมวลผล 2 MB / s เท่านั้นเนื่องจากมีการบีบอัด CPU มากขึ้น
  • lzop ดูเหมือนว่าจะอนุญาตให้มีบัฟเฟอร์ขนาดใหญ่กว่า: 70 MB / s ต่อหนึ่งคอร์และ 2 คอร์สามารถเพิ่มความคมชัดสูงสุดของฉันได้โดยไม่ต้องค้นหามากเกินไป

สามารถddทำเช่นเดียวกันหรือไม่
Simon Kuang

@SimonKuang ฉันสงสัยว่าddสามารถทำเช่นเดียวกันกับbs=ตัวเลือกของมันใช่
nh2

ฟังดูเป็นเรื่องบังเอิญที่น่าสนใจสำหรับไฟล์เดียวขนาดบล็อกเกิดขึ้นเพื่อใช้ประโยชน์อย่างเต็มที่ทั้งซีพียูคอร์เดี่ยวและ IOPS ของไดรฟ์
Dave L.

3

หลังจากดูการบรรยายห้าครั้งแรกใน MIT OpenCourseware สำหรับ 6.172: "วิศวกรรมประสิทธิภาพของระบบซอฟต์แวร์" ฉันใช้งานตัววิเคราะห์ประสิทธิภาพของ Linux 'สมบูรณ์' ในไฟล์ทดสอบขนาดใหญ่พอสมควร ผลลัพธ์ปรากฏขึ้นเพื่อแสดงแผงลอยไปป์ไลน์ซึ่งคำสั่งเดียวต้องรอผลลัพธ์ของคำสั่งก่อนหน้า

       │         while (lookahead != 0) {                                                                
       │             /* Insert the string window[strstart .. strstart+2] in the                          
       │              * dictionary, and set hash_head to the head of the hash chain:                     
       │              */                                                                                 
       │             INSERT_STRING(strstart, hash_head);                                                 
  2.07 │       movzbl 0x8096d82(%edx),%eax                                                               
  3.99 │       mov    %edx,%ebp                                                                          
       │       shl    $0x5,%ecx                                                                          
  0.03 │       and    $0x7fff,%ebp                                                                       
  1.94 │       xor    %ecx,%eax                                                                          
  1.43 │       and    $0x7fff,%eax                                                                       
  2.01 │       mov    %eax,0x805e588                                                                     
  2.40 │       add    $0x8000,%eax                                                                      
  0.88 │       movzwl 0x8062140(%eax,%eax,1),%ecx                                                        
 23.79 │       movzwl %cx,%edi                                                                           
       │             /* Find the longest match, discarding those <= prev_length.  

คำสั่งสุดท้ายที่สองกำลังคัดลอก%ecxและสุดท้ายต้องรอ (ถ่วงไปป์ไลน์) จนกว่าการ%cxลงทะเบียนจะมีข้อมูลพร้อมใช้งาน ไปป์ไลน์ไปป์ไลน์นี้บรรจุวงที่บรรจุ

นี่เป็นผลจากรูปแบบการเขียนโปรแกรม C 'แบบเก่า' ที่คลุมเครือจริงๆ


1

เคล็ดลับที่อาจนำไปสู่อีกระดับของความเร็วใน CPU แบบมัลติคอร์ / ไฮเปอร์เธรด:
(สมมติว่า Ubuntu)

sudo apt-get installututils มากขึ้น

moreutils ประกอบด้วยสิ่งอื่น ๆ "gnu parallel" - ซึ่งมีตัวเลือกมากมายที่จะช่วยให้ใช้ CPU ของคุณได้มากขึ้น

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