बड़ी संख्या में बड़ी फ़ाइलों को तेजी से संपीड़ित करें


16

मेरे पास लगभग 200 जीबी लॉग डेटा प्रतिदिन उत्पन्न होता है, लगभग 150 विभिन्न लॉग फ़ाइलों के बीच वितरित किया जाता है।

मेरे पास एक स्क्रिप्ट है जो फ़ाइलों को एक अस्थायी स्थान पर ले जाती है और अस्थायी निर्देशिका पर एक टार-बज़ 2 करती है।

मुझे अच्छे परिणाम मिलते हैं क्योंकि 200 जीबी लॉग लगभग 12-15 जीबी तक संकुचित होते हैं।

समस्या यह है कि यह फ़ाइलों को संपीड़ित करने के लिए हमेशा के लिए लेता है। क्रॉन नौकरी दैनिक पर 2:30 पूर्वाह्न चलाता है और 5 तक चलाने के लिए जारी है: 00-6: 00 PM।

क्या संपीड़न की गति में सुधार करने और तेजी से काम पूरा करने का एक तरीका है? कोई विचार?

अन्य प्रक्रियाओं और सभी के बारे में चिंता न करें, वह स्थान जहां संपीड़न होता है एक NAS पर है , और मैं एक समर्पित VM पर NAS माउंट कर सकता हूं और वहां से संपीड़न स्क्रिप्ट चला सकता हूं ।

यहाँ संदर्भ के लिए शीर्ष का उत्पादन है :

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 हैं और आप इसे कई टार फ़ाइलों में विभाजित कर सकते हैं, तो आप कई कंप्रेशन चला सकते हैं।
जेफ स्कालर

@JeffSchaller क्या कई bzip2 प्रक्रियाओं को अलग-अलग फ़ाइलों को संपीड़ित करना संभव होगा लेकिन एक ही tar.bz2फ़ाइल पर लिखें ?
अनु ०

2
एनएएस में जाने से पहले स्थानीय डिस्क पर लॉग फाइल उत्पन्न होती हैं? यदि ऐसा है तो संकुचित करें; इस तरह से आप केवल 100G (नेटवर्क) के बजाय नेटवर्क पर 15Gb डेटा भेज रहे हैं, फिर 115 (100read + 15write) को कंप्रेस करके। वैकल्पिक रूप से ऐसा लगता है कि आप उस एक bzip2 प्रक्रिया पर सीपीयू से बंधे हो सकते हैं, इसलिए समानांतर में कई (एक प्रति सीपीयू) चलाने में मदद मिल सकती है (जब तक आप आई / ओ सीमा को हिट नहीं करते)। या एक सरल संपीड़न (उदाहरण के लिए "gzip -1") का उपयोग करें। यह उतना डिस्क स्थान नहीं बचाएगा, लेकिन यह तेजी से चलेगा।
स्टीफन हैरिस

@Sukminder मैं निश्चित रूप से यह कोशिश करूंगा और आकार में अंतर देखूंगा। धन्यवाद।
अनु ०

आपका topआउटपुट दिखाता है कि आपकी एकल-थ्रेडेड bzip2प्रक्रिया एक कोर को अधिकतम कर रही है, लेकिन यह कि आप इसे क्वाड-कोर सिस्टम पर चला रहे हैं (एक प्रक्रिया 100% सीपीयू -> 25.1%उपयोगकर्ता-स्पेस सीपीयू समय, 74% निष्क्रिय)। इसलिए मामूली बदलावों के साथ, आप 4 गुना तेजी से जा सकते हैं, जब तक कि कुछ और अड़चन न बने। गाइल्स उत्तर को ध्यान से पढ़ें। संपीड़न करने के लिए डेटा रखने वाले डिस्क के रूप में उसी बॉक्स में सीपीयू का उपयोग करने पर विचार करें। (आप अपनी कुछ फ़ाइलों को एक बॉक्स पर, दूसरे पर दूसरों को और बाद में संग्रहित कर सकते हैं, इसलिए दोनों CPU का उपयोग किया जाता है।)
पीटर कॉर्ड्स

जवाबों:


25

पहला कदम यह पता लगाना है कि अड़चन क्या है: क्या यह डिस्क I / O, नेटवर्क I / O या CPU है?

अगर अड़चन डिस्क I / O है, तो बहुत कुछ नहीं है जो आप कर सकते हैं। सुनिश्चित करें कि डिस्क कई समानांतर अनुरोधों की सेवा नहीं करती हैं क्योंकि यह केवल प्रदर्शन को कम कर सकता है।

यदि अड़चन नेटवर्क I / O है, तो मशीन पर संपीड़न प्रक्रिया को चलाएं जहां फाइलें संग्रहीत की जाती हैं: इसे बीफ़ियर सीपीयू के साथ मशीन पर चलाना केवल तभी मदद करता है यदि सीपीयू टोंटी है।

यदि टोंटी सीपीयू है, तो विचार करने वाली पहली चीज एक तेज संपीड़न एल्गोरिदम का उपयोग कर रही है। Bzip2 अनिवार्य रूप से एक बुरा विकल्प नहीं है - इसकी मुख्य कमजोरी विघटन की गति है - लेकिन आप gzip का उपयोग कर सकते हैं और संपीड़न गति के लिए कुछ आकार का त्याग कर सकते हैं, या lzop या lzma जैसे अन्य स्वरूपों को आज़मा सकते हैं। आप संपीड़न स्तर को भी ट्यून कर सकते हैं: bzip2 चूक -9(अधिकतम ब्लॉक आकार, इसलिए अधिकतम संपीड़न, लेकिन सबसे लंबे समय तक संपीड़न समय भी); संपीड़न के स्तर को आज़माने के लिए पर्यावरण वैरिएबल BZIP2को सेट करें -33. यह थ्रेड और यह थ्रेड सामान्य संपीड़न एल्गोरिदम पर चर्चा करता है; विशेष रूप से व्युत्पन्न द्वारा उद्धृत इस ब्लॉग पोस्ट में कुछ बेंचमार्क दिए गए हैं जो सुझाव देते हैं कि gzip -9याbzip2निम्न स्तर के साथ तुलना में एक अच्छा समझौता हो सकता है bzip2 -9यह अन्य बेंचमार्क जिसमें lzma भी शामिल है (7zip का एल्गोरिथ्म, इसलिए आप 7zइसके बजाय उपयोग कर सकते हैं tar --lzma) बताता है कि lzmaनिम्न स्तर पर तेजी से bzip2 संपीड़न अनुपात तक पहुंच सकता है। बस bzip2 के अलावा किसी भी विकल्प के बारे में अपघटन समय में सुधार होगा। ध्यान रखें कि संपीड़न अनुपात डेटा पर निर्भर करता है, और संपीड़न गति संपीड़न प्रोग्राम के संस्करण पर निर्भर करती है, कि यह कैसे संकलित किया गया था, और सीपीयू पर इसे निष्पादित किया गया है।

एक अन्य विकल्प यदि टोंटी सीपीयू है और आपके पास कई कोर हैं, तो संपीड़न को समानांतर करना है। ऐसा करने के दो तरीके हैं। एक जो किसी भी संपीड़न एल्गोरिदम के साथ काम करता है वह अलग-अलग (या तो व्यक्तिगत रूप से या कुछ समूहों में) फ़ाइलों को संपीड़ित करने के parallelलिए है और समानांतर में संग्रह / संपीड़न कमांड चलाने के लिए उपयोग करता है। यह संपीड़न अनुपात को कम कर सकता है लेकिन एक व्यक्तिगत फ़ाइल की पुनर्प्राप्ति की गति को बढ़ाता है और किसी भी उपकरण के साथ काम करता है। अन्य दृष्टिकोण संपीड़न उपकरण के समानांतर कार्यान्वयन का उपयोग करना है; यह धागा कई को सूचीबद्ध करता है।


4
"अगर अड़चन डिस्क I / O है, तो बहुत कुछ नहीं है जो आप कर सकते हैं।" यह शायद यहाँ सच है, क्योंकि संपीड़न अनुपात पहले से ही अच्छा है, लेकिन सामान्य तौर पर जब I / O अड़चन होता है, तो बेहतर संपीड़न अनुपात (विभिन्न संपीड़न सेटिंग्स या एक अलग एल्गोरिथ्म का उपयोग करके) प्राप्त करने के लिए अधिक सीपीयू का उपयोग करने पर ध्यान देने योग्य हो सकता है। .. आप वास्तव में "I" को कम नहीं कर सकते हैं (क्योंकि आपको डेटा में सभी को पढ़ने की आवश्यकता है) लेकिन आप कभी-कभी "O" :-) को कम कर सकते हैं
psmears

1
यदि आप 7z"ठोस" संग्रह बनाने के लिए नहीं कहते हैं, या "ठोस" ब्लॉकों के आकार को सीमित करते हैं, तो यह समानांतर, IIRC में उत्परिवर्ती LZMA धागे को चलाएगा। लॉग फ़ाइल डेटा संपीड़न के लिए एक विशेष मामला है, क्योंकि यह अत्यधिक निरर्थक हो जाता है (लाइनों के बीच बहुत समानता)। यह निश्चित रूप से लायक परीक्षण है gzip, bzip2और xzबस किसी भी विकल्प से इनकार करने के लिए सामान्य संपीड़न मानक को देख के बजाय ओपी की विशिष्ट लॉग फाइल पर,। यहां तक कि तेजी से कम्प्रेसर पर विचार के लायक हैं ( lzop, lz4, snappy)।
पीटर कॉर्डेस

इन दिनों पसंदीदा LZMA कंप्रेसर है xz। का प्रयोग करें tar -Jया --xz, नहीं --lzma। .lzmaएक "विरासत" फ़ाइल स्वरूप माना जाता है । LZMA संपीड़न के लिए फ़ाइल स्वरूपों के एकाधिक पुनरावृत्तियों को थोड़ी शर्मिंदगी होती है, और उन्हें पहली बार सही होना चाहिए। लेकिन AFAIK यह मूल रूप से अब अच्छा है, और .xz के बारे में अभी तक एक ही संपीड़न धारा के लिए एक और फ़ाइल प्रारूप द्वारा प्रतिस्थापित नहीं किया जा रहा है।
पीटर कॉर्ड्स

7z में उत्कृष्ट संपीड़न और मल्टी-थ्रेडिंग है, लेकिन संग्रह प्रारूप के कारण (एक सूचकांक, या शायद बग की जरूरत है?) मुझे नहीं लगता कि इसका उपयोग पाइप लाइन के बीच में किया जा सकता है - यह स्टड और स्टडआउट का उपयोग नहीं करेगा। उसी समय
Xen2050

यह वास्तव में सहायक और व्यावहारिक था। मेरी टीम ने अनुमान लगाया कि एनएफएस पर कार्रवाई एक बड़ी अड़चन थी।
अनु

16

आप pigzबहु-थ्रेडेड संपीड़न के साथ टार, गज़िप को स्थापित कर सकते हैं और टार का उपयोग कर सकते हैं । पसंद:

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

जहां -Iविकल्प है:

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

बेशक, यदि आपके NAS में कई कोर / शक्तिशाली सीपीयू नहीं हैं, तो आप सीपीयू पावर द्वारा वैसे भी सीमित हैं।

हार्ड-डिस्क / सरणी की गति जिस पर VM और संपीड़न चल रहा है, एक अड़चन भी हो सकती है।


1
और अगर आप bzip2 का उपयोग करना चाहते हैं, तो आप उपयोग कर सकते हैं pbzip2या कर सकते हैं lbzip2
राडोवन गारबिक

2
यह आपका सबसे अच्छा जवाब है। लेकिन पहले, यह सुनिश्चित कर लें कि आपका पहला कदम उस स्थान पर है जो मूल फाइलों के समान फाइल सिस्टम पर है। अन्यथा, आपकी "चाल" वास्तव में एक बाइट-कॉपी-फिर-डिलीट है। एक ही फाइल सिस्टम पर, एक चाल फाइलसिस्टम लिंक का पुनर्व्यवस्था है। यह तेजी के परिमाण का आदेश है। मेरे लॉगफाइल्स जो सैकड़ों गीगाबाइट बड़े हैं, के लिए पिगज़ ने सभी अंतर बनाए। आप इसे बता सकते हैं कि कितने समानांतर धागे चलाने हैं। जब तक आपके सीपीयू में कई कोर हैं, तब तक मैं बहुत समय तक जांच नहीं करूंगा। आप किसी भी घटना में संभावना चाहते हैं; आप तुरंत अपना स्पीडअप प्राप्त कर सकते हैं।
माइक एस

एक बार जब आप पिगिंग कर रहे हों, तो अपने htop और iostat outputs को देखें और अपने सिस्टम के प्रदर्शन का निरीक्षण करें, यदि आप अपने सिस्टम की और जांच करना चाहते हैं। लेकिन फिर, मैं अब और बड़ी फ़ाइलों को बिना पिग के संपीड़ित करने की कोशिश नहीं करूंगा। आधुनिक मल्टीकोर सिस्टम पर, इसका उपयोग न करना मूर्खतापूर्ण है। यह ऐसी तत्काल जीत है- आप देखेंगे।
मिक एस

7

डेटा को कंप्रेस करने का अब तक का सबसे तेज़ और सबसे प्रभावी तरीका है, इसका कम उत्पादन करना।

आप किस प्रकार के लॉग उत्पन्न कर रहे हैं? 200GB दैनिक बहुत पसंद है (जब तक कि आप Google या कुछ ISP नहीं हैं ...), विचार करें कि 1MB का पाठ लगभग 500 पृष्ठों का है, इसलिए आप प्रति दिन 100 मिलियन पृष्ठों के बराबर पाठ उत्पन्न कर रहे हैं, एक सप्ताह में कांग्रेस के पुस्तकालय को भरें।

अपने लॉग डेटा को देखें यदि आप इसे किसी तरह कम कर सकते हैं और फिर भी लॉग से आपको जो चाहिए वह मिल जाएगा। उदाहरण के लिए लॉग लेवल को बंद करके या टेर्सर लॉग फॉर्मेट का उपयोग करके। या यदि आप आँकड़ों के लिए लॉग का उपयोग कर रहे हैं, तो आँकड़ों को संसाधित करें-उड़ाने और सारांश के साथ एक फ़ाइल को डंप करें और फिर भंडारण के लिए संपीड़न से पहले लॉग को फ़िल्टर करें।


1
यह एक दिलचस्प दार्शनिक समाधान है। अधिकांश जीवन की समस्याओं का हल यह है कि समस्या पूरी तरह से न हो। जब तक कि कोई व्यक्ति सुझाव की बारीकी से जांच नहीं करता है और यह महसूस करता है कि 100 लोग हैं और इसे स्वीकृत करने के लिए लोगों को 100 से अधिक स्वीकृतियां प्राप्त करनी होती हैं।
अनु ०

1
@anu प्रश्न का कोई संदर्भ नहीं दिया गया था इसलिए मैंने किसी को नहीं माना। और क्या आप मुझे बता सकते हैं कि आपको कहाँ से कितनी स्वीकृति मिली है? मेरे लिए ऐसा लगता है जैसे आपने अभी-अभी बनाया है।
एमिली एल

मैं इसे बढ़ा दूंगा। यह अक्सर अनदेखी की जाती है, लेकिन एक बार देखा गया, जीवन की कई समस्याओं का समाधान है।
jrw32982

1
खैर .. अब जब मैं वहां काम नहीं कर रहा हूं, तो मैं यह खुलासा कर सकता हूं कि यह एप्पल की समस्या थी। अधिक विशेष रूप से सेवा ढेर पर, जो ऑनलाइन ऐप स्टोर पर कार्य करता है ... इसलिए हां बहुत सी स्वीकृतियां बहुत अधिक वास्तविकता हैं क्योंकि उनके पास माइक्रोसर्विस की अधिकता है और उनमें से प्रत्येक लॉग का उत्पादन करता है जिसे संपीड़ित करने की आवश्यकता होती है और उन्हें बदलने पर हस्ताक्षर करना होगा प्रवेश के स्तर आदि ... वैसे भी ... हम इस इनडोर btw के लिए एक समाधान है .. जो बहुत समानांतर gzip के बराबर है कि एक और microservices के लिए रवाना हो जाता है पता चला है।
अनु ०

3

आप इसे तेजी से बनाने के लिए संपीड़न की मात्रा (अंतरिक्ष की बचत के संदर्भ में) को कम कर सकते हैं। के साथ शुरू करने के लिए, bzip2 gzip की तुलना में धीमी है, हालांकि यह छोटा संकुचित होता है। आप गति के लिए व्यापार आकार के लिए bzip2, gzip, या अधिकांश संपीड़न कार्यक्रमों के संपीड़न स्तर को भी बदल सकते हैं।

यदि आप गति के आकार का व्यापार करने के इच्छुक नहीं हैं, तो आप अभी भी उसी आकार या छोटे को प्राप्त कर सकते हैं जबकि अभी भी कंप्रेसर का उपयोग करके गति में सुधार हो रहा है जो LZMA (उदाहरण के लिए xz) का उपयोग करता है।

यदि आप खोज करते हैं तो आपको बेंचमार्क मिलेंगे, लेकिन आपका सबसे अच्छा दांव आपके लक्ष्य हार्डवेयर पर अपनी फ़ाइल के साथ कुछ परीक्षण कर रहा है।


3

यदि केवल आवश्यकता यह है कि संपीड़न तेज है , तो मैं lz4 की अत्यधिक अनुशंसा करता हूं

इसका उपयोग बहुत से स्थानों पर किया जाता है जहां संपीड़न अनुपात की तुलना में संपीड़न की गति अधिक महत्वपूर्ण है (जैसे कि ZFS जैसे पारदर्शी संपीड़न के साथ फाइल सिस्टम)


पहले कभी इसके बारे में नहीं सुना, क्या ऐसा कोई प्रोग्राम है जो संभवतः पहले से ही व्यावहारिक रूप से हर जगह स्थापित है जो इसका उपयोग करता है, जैसे xz?
1920 में Xen2050
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.