सही xargs समानांतर उपयोग


9

मैं xargsलगभग 30 मिलियन छोटी फ़ाइलों को संसाधित करने के लिए एक अजगर स्क्रिप्ट को कॉल करने के लिए उपयोग कर रहा हूं । मैं xargsइस प्रक्रिया को समानांतर करने के लिए उपयोग करने की उम्मीद करता हूं । मैं जिस कमांड का उपयोग कर रहा हूं वह है:

find ./data -name "*.json" -print0 |
  xargs -0 -I{} -P 40 python Convert.py {} > log.txt

मूल रूप से, Convert.pyएक छोटी सी json फाइल (4kb) में पढ़ेगी, कुछ प्रोसेसिंग करेगी और दूसरी 4kb फाइल पर लिखेगी। मैं 40 सीपीयू कोर वाले सर्वर पर चल रहा हूं। और इस सर्वर पर कोई अन्य सीपीयू-गहन प्रक्रिया नहीं चल रही है।

Htop (btw) की निगरानी करके, CPU प्रदर्शन की निगरानी के लिए कोई अन्य अच्छा तरीका है?), मुझे लगता है कि -P 40उम्मीद के मुताबिक तेज़ नहीं है। कभी-कभी सभी कोर फ्रीज हो जाएंगे और 3-4 सेकंड के लिए लगभग शून्य हो जाएंगे, फिर 60-70% तक ठीक हो जाएंगे। तब मैं समानांतर प्रक्रियाओं की संख्या को कम करने की कोशिश करता हूं -P 20-30, लेकिन यह अभी भी बहुत तेज नहीं है। आदर्श व्यवहार को रैखिक गति-अप होना चाहिए। Xargs के समानांतर उपयोग के लिए कोई सुझाव?


6
आपको I / O से सबसे अधिक संभावना है: सिस्टम फ़ाइलों को तेज़ी से नहीं पढ़ सकता है। 40 से अधिक शुरू करने का प्रयास करें: इस तरह से यह ठीक रहेगा यदि कुछ प्रक्रियाओं में I / O की प्रतीक्षा करनी होगी।
ओले तांगे

स्क्रिप्ट किस तरह की प्रोसेसिंग करती है? कोई डेटाबेस / नेटवर्क / io शामिल है? कब तक चलता है?
फॉक्स

1
मैं दूसरा @OleTange। यह अपेक्षित व्यवहार है यदि आप कोर के रूप में कई प्रक्रियाओं को चलाते हैं और आपके कार्य IO बाध्य हैं। पहले कोर अपने कार्य (नींद) के लिए आईओ पर इंतजार करेंगे, फिर वे प्रक्रिया करेंगे, और फिर दोहराएंगे। यदि आप अधिक प्रक्रियाएँ जोड़ते हैं, तो जो अतिरिक्त प्रक्रियाएँ वर्तमान में भौतिक कोर पर नहीं चल रही हैं, उन्होंने समानांतर IO परिचालनों को बंद कर दिया होगा, जो आपके कोर पर स्लीप पीरियड्स को कम, समाप्त या कम कर देगा।
PSkocik

1- क्या आपके पास हाइपरथ्रेडिंग सक्षम है? 2- आपके पास वहां क्या है, log.txt को वास्तव में कन्वर्ट करने के लिए प्रत्येक कॉल के साथ ओवरराइट किया जाता है ... सुनिश्चित नहीं है कि यह इच्छित व्यवहार है या नहीं।
बिचॉय

xargs -Pऔर >अर्ध-लाइन समस्या gnu.org/software/parallel/… की वजह से दौड़ की स्थिति के लिए खुल रहा है। इसके बजाय GNU समानांतर का उपयोग करने से वह समस्या नहीं होगी।
ओले तांगे

जवाबों:


4

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

यदि आप केवल एक के बजाय फ़ाइलों की सूची लेने के लिए अपने अजगर कार्यक्रम का पुनर्गठन कर सकते हैं, तो आपको प्रदर्शन में भारी सुधार होगा। फिर आप प्रदर्शन को और बेहतर करने के लिए xargs का उपयोग कर सकते हैं। उदाहरण के लिए, 40 प्रक्रियाएं, प्रत्येक प्रसंस्करण 1000 फाइलें:

find ./data -name "*.json" -print0 |
  xargs -0 -L1000 -P 40 python Convert.py

यह कहना नहीं है कि अजगर एक बुरी / धीमी भाषा है; यह स्टार्टअप समय के लिए अनुकूलित नहीं है। आप इसे किसी भी वर्चुअल मशीन-आधारित या व्याख्या की गई भाषा के साथ देखेंगे। उदाहरण के लिए, जावा और भी बदतर होगा। यदि आपका प्रोग्राम C में लिखा गया था, तब भी प्रत्येक फ़ाइल को संभालने के लिए एक अलग ऑपरेटिंग सिस्टम प्रक्रिया शुरू करने की लागत होगी, लेकिन यह बहुत कम होगा।

वहां से आप यह -Pदेख सकते हैं कि क्या आप थोड़ा और अधिक गति प्राप्त कर सकते हैं, शायद निष्क्रिय प्रोसेसर का लाभ लेने के लिए प्रक्रियाओं की संख्या बढ़ाकर, जबकि डेटा पढ़ा / लिखा जा रहा है।


1

तो सबसे पहले, बाधाओं पर विचार करें:

प्रत्येक काम पर बाधा क्या है? यदि यह I / O है, तो आप शायद I / O की सीमा को हिट करने तक प्रति CPU कोर के साथ कई नौकरियों से दूर हो सकते हैं, लेकिन अगर यह सीपीयू गहन है, तो इसका अर्थ है कि आप सीपीयू कोर की तुलना में कहीं अधिक रोजगार लगातार चला रहे हैं।

इन चीजों के बारे में मेरी समझ यह है कि जीएनयू समानांतर आपको नौकरियों आदि की कतार पर बेहतर नियंत्रण प्रदान करेगा।

देखें जीएनयू समानांतर बनाम और (मैं मतलब पृष्ठभूमि) बनाम xargs -पी दो कैसे अलग की एक अधिक विस्तृत विवरण के लिए।


0

जैसा कि अन्य लोगों ने कहा, जाँचें कि क्या आप I / O- बाध्य हैं। इसके अलावा, xargs के मैन पेज के -nसाथ उपयोग करने का सुझाव देता है -P, आप Convert.pyसमानांतर में चलने वाली प्रक्रियाओं की संख्या का उल्लेख नहीं करते हैं।

एक सुझाव के रूप में, यदि आप I / O- बाउंड हैं, तो आप SSD ब्लॉक डिवाइस का उपयोग करने की कोशिश कर सकते हैं, या tmpfs में प्रोसेसिंग करने की कोशिश कर सकते हैं (निश्चित रूप से, इस मामले में आपको पर्याप्त मेमोरी की जांच करनी चाहिए, tmpfs के कारण स्वैप से बचना चाहिए दबाव (मुझे लगता है), और पहली जगह में डेटा को कॉपी करने का ओवरहेड)।

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