सीपीयू और हार्ड ड्राइव के प्रदर्शन को अधिकतम नहीं किए जाने के बावजूद gzip धीमा क्यों है?


14

मेरे पास कुछ JSON फाइलें हैं, 20 GB प्रत्येक, जिसे मैं इसके साथ कंप्रेस करना चाहता हूं gzip:

gzip file1.json

यह एक पूर्ण सीपीयू कोर लेता है, सब ठीक है।

यह लगभग 25 एमबी / एस (चेक इन atop) की प्रक्रिया करता है , मेरी हार्ड ड्राइव 125 एमबी / एस पढ़ सकती है और मेरे पास 3 मुक्त प्रोसेसर कोर हैं, इसलिए मैं समानांतर में कई फ़ाइलों को संपीड़ित करने पर गति प्राप्त करने की उम्मीद करता हूं। इसलिए मैं अन्य टर्मिनलों में दौड़ता हूं:

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

हैरानी की बात है, मेरा थ्रूपुट नहीं बढ़ता है; CPU प्रत्येक कोर पर लगभग 25% है, और मेरा HD अभी भी केवल 25 एमबी / एस पर पढ़ता है।

इसे क्यों और कैसे संबोधित करें?

जवाबों:


17

मुझे यह पता चला:

कारण यह है कि gzip(इन दिनों सीपीयू की गति बनाम एचडी की गति की तलाश में) बेहद कम बफर आकारों पर काम कर रहा है

यह इनपुट फ़ाइल से कुछ KB पढ़ता है, इसे संपीड़ित करता है, और इसे आउटपुट फ़ाइल पर फ़्लश करता है। इस तथ्य को देखते हुए कि इसके लिए हार्ड ड्राइव की आवश्यकता है, प्रति सेकंड कुछ ही ऑपरेशन किए जा सकते हैं।

मेरे प्रदर्शन का पैमाना नहीं था क्योंकि पहले से ही gzipपागलों की तरह चाह रहा था।


मैंने यूनिक्स bufferउपयोगिता का उपयोग करके इसके चारों ओर काम किया :

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

गज़िप में भेजने से पहले बहुत सारे इनपुट को बफ़र करके, छोटे सीक की संख्या को नाटकीय रूप से कम किया जा सकता है। विकल्प:

  • -sऔर -mबफ़र का आकार निर्दिष्ट करने के लिए हैं (मेरा मानना है कि यह KB में है, लेकिन निश्चित नहीं है)
  • -p 100 सुनिश्चित करें कि बफर 100% भर जाने के बाद डेटा केवल gzip को पास किया जाता है

समानांतर में इनमें से चार को चलाने पर, मुझे उम्मीद के मुताबिक 4 * 25 एमबी / एस थ्रूपुट मिल सकता है।


मुझे अभी भी आश्चर्य है कि क्यों gzip बफर आकार को बढ़ाने की अनुमति नहीं देता है - इस तरह, यह एक बेकार डिस्क पर चलाने पर बहुत बेकार है।

संपादित करें : मैंने कुछ और संपीड़न कार्यक्रमों के व्यवहार की कोशिश की:

  • bzip2 केवल 2 एमबी / एस को इसके मजबूत / अधिक सीपीयू गहन संपीड़न के कारण संसाधित करता है
  • lzop लगता है कि बड़े बफ़र्स की अनुमति है: 70 एमबी / एस प्रति कोर, और 2 कोर अधिक मांग के बिना मेरे एचडी को अधिकतम कर सकते हैं

ddवही कर सकते हैं?
साइमन कुआंग

@SimonKuang मुझे संदेह है कि ddइसके bs=विकल्प के साथ भी ऐसा कर सकते हैं , हाँ।
nh2

एक दिलचस्प संयोग की तरह लगता है कि एक एकल फ़ाइल के लिए ब्लॉक आकार पूरी तरह से एक एकल CPU कोर और एक ड्राइव IOPS दोनों का उपयोग करने के लिए हुआ।
डेव एल।

3

6.172 के लिए एमआईटी ओपनकोर्सवेयर में पहले पांच या तो व्याख्यान को देखने के बाद: "सॉफ्टवेयर सिस्टम के प्रदर्शन इंजीनियरिंग", मैंने मामूली बड़े परीक्षण फ़ाइल पर लिनक्स प्रदर्शन विश्लेषक 'पूर्ण' को चलाया। परिणाम पाइपलाइन स्टालों को दिखाने के लिए दिखाई देता है जहां एक निर्देश को एक पूर्ववर्ती परिणाम के लिए इंतजार करना पड़ता है।

       │         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रजिस्टर में डेटा का उपयोग करने के लिए तैयार न हो। यह पाइप लाइन स्टॉल युक्त लूप रखती है।

यह कुछ वास्तव में अस्पष्ट 'पुराने-स्कूल' सी प्रोग्रामिंग शैली का परिणाम है।


1

एक टिप जो इसे मल्टी-कोर / हाइपरथ्रेडिंग सीपीयू पर अभी तक एक और गति ले सकती है:
(उबंटू मानकर)

sudo apt-get install अधिक जानकारी

moreutils में अन्य चीजों के अलावा "ग्नू पैरेलल" शामिल है - जिसमें आपके सीपीयू के अधिक उपयोग में मदद करने के लिए बहुत सारे विकल्प हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.