সিপিইউ এবং হার্ড ড্রাইভের পারফরম্যান্স সর্বাধিক আউট না হওয়া সত্ত্বেও কেন জিজিপ ধীর?


14

আমার কয়েকটি জেএসওএন ফাইল রয়েছে, প্রতিটি 20 জিবি, যা আমি সংকোচন করতে চাই gzip:

gzip file1.json

এটি একটি সম্পূর্ণ সিপিইউ কোর গ্রহণ করে, সব ঠিক আছে।

এটি প্রায় 25 এমবি / সেকেন্ড (চেক ইন করা atop) প্রক্রিয়াকরণ করে , আমার হার্ড ড্রাইভটি 125 এমবি / সেকেন্ড পড়তে পারে এবং আমার কাছে 3 টি ফ্রি প্রসেসরের কোর রয়েছে, তাই আমি সমান্তরালে একাধিক ফাইল সংকোচনের সময় গতি অর্জনের প্রত্যাশা করি। সুতরাং আমি অন্যান্য টার্মিনালগুলিতে চালিত:

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

আশ্চর্যের বিষয় হল, আমার থ্রুপুট বাড়েনি; প্রতিটি কোরে সিপিইউ প্রায় 25%, এবং আমার এইচডি এখনও কেবল 25 এমবি / সেকেন্ডে পড়ে।

কেন এবং কিভাবে এটি সম্বোধন করবেন?

উত্তর:


17

আমি এটি খুঁজে পেয়েছি:

কারণটি হ'ল gzip(সিপিইউ স্পিডের তুলনায় এইচডি এইচডি গতি শর্তাবলী) অত্যন্ত কম বাফার আকারে কাজ করে

এটি ইনপুট ফাইল থেকে কয়েক কেবি পড়ে, সংক্ষেপ করে এবং আউটপুট ফাইলে ফ্লাশ করে। এটির জন্য একটি হার্ড ড্রাইভের সন্ধান প্রয়োজন এই বিষয়টি বিবেচনা করে, প্রতি সেকেন্ডে কয়েকটি অপারেশন করা যেতে পারে।

আমার অভিনয়টি স্কেল না করার কারণ হ'ল ইতিমধ্যে একজন gzipপাগলের মতো খুঁজছিলেন।


আমি ইউনিক্স bufferইউটিলিটি ব্যবহার করে এটি ঘিরে কাজ করেছি :

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

জিপিতে পাঠানোর আগে প্রচুর ইনপুট বাফার করে, ছোট সন্ধানীর সংখ্যা নাটকীয়ভাবে হ্রাস করা যায়। বিকল্পগুলি:

  • -sএবং -mবাফারের আকার নির্দিষ্ট করতে হবে (আমি বিশ্বাস করি এটি কেবিতে রয়েছে তবে নিশ্চিত নয়)
  • -p 100 বাফার 100% ভরাট হয়ে যাওয়ার পরে তা নিশ্চিত হয়ে যায় যে ডেটা কেবল জিৎপিতে চলে গেছে

সমান্তরালে এর মধ্যে চারটি চালানো, আমি প্রত্যাশার মতো 4 * 25 এমবি / এস থ্রুটপুট পেতে পারি।


আমি এখনও আশ্চর্য হই যে কেন জিজিপ বাফার আকার বাড়াতে দেয় না - এইভাবে, কোনও স্পিনিং ডিস্কে চালানোয় এটি বেশ বেহুদা।

সম্পাদনা : আমি আরও কয়েকটি সংক্ষেপণ প্রোগ্রামের আচরণের চেষ্টা করেছি:

  • bzip2 তার শক্তিশালী / আরও সিপিইউ নিবিড় সংকোচনের কারণে কেবল 2 এমবি / গুলি প্রক্রিয়া করে
  • lzop বৃহত্তর বাফারগুলিকে মঞ্জুরি দেয় বলে মনে হচ্ছে: প্রতি পিছু 70 এমবি / সেকেন্ড এবং 2 কোর অতিরিক্ত অনুসন্ধান না করে আমার এইচডি সর্বাধিক বের করতে পারে

ddএকই কাজ করতে পারেন?
সাইমন কুয়াং 30:51

@ সিমনকুয়াং আমার সন্দেহ হয় যে হ্যাঁ, ddএর bs=অপশনটি দিয়ে এটি একই কাজ করতে পারে ।
nh2

একটি আকর্ষণীয় কাকতালীয় মত মনে হচ্ছে যে কোনও একক ফাইলের জন্য ব্লক আকারটি একটি সিপিইউ কোর এবং একটি ড্রাইভের আইওপিএস উভয়কে পুরোপুরি ব্যবহার করতে পারে।
ডেভ এল।

3

Software.১72২: এমআইটি ওপেনকোর্সওয়্যারের প্রথম পাঁচটি বা তার পরে বক্তৃতাগুলি দেখার পরে: "সফটওয়্যার সিস্টেমগুলির পারফরম্যান্স ইঞ্জিনিয়ারিং", আমি লিনাক্স পারফরম্যান্স বিশ্লেষককে 'পারফ' মাঝারি আকারের বড় টেস্ট ফাইলটিতে চালিত করেছি। ফলাফলটি পাইপলাইন স্টলগুলি দেখায় বলে মনে হচ্ছে যেখানে একটি নির্দেশ পূর্ববর্তীগুলির ফলাফলের জন্য অপেক্ষা করতে হবে।

       │         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 moreutils ইনস্টল করুন

মুর্টিলগুলিতে অন্যান্য জিনিসের মধ্যে রয়েছে "gnu সমান্তরাল" - এতে আপনার সিপিইউ ব্যবহার করার জন্য অনেকগুলি বিকল্প রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.