2012-06-13 14 views
15

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

कदम मैं अब तक निकाल दिया है:

  • मैं एक परियोजना है कि बस छोटी सफलता के साथ करता है के लिए देखा है। मुझे यह गीथब गिस्ट मिला: https://gist.github.com/1971720 लेकिन परिणाम लगभग हमारे सिंगल थ्रेडेड दोस्त के समान ही हैं।

  • मुझे फिर गिथब पर पिप प्रोजेक्ट मिला और यह देखने के लिए कि क्या मैं ऐसा करने की कोशिश कर रहा हूं, मुझे यह देखने के लिए कि क्या मुझे कोई काम मिल सकता है या नहीं। यह वहां एक गड़बड़ है। मैं इसे फोर्क कर दूंगा और अगर मुझे करना है तो मैं खुद को समानांतर करने का प्रयास करूंगा, मैं बस ऐसा करने में समय बिताना चाहता हूं।

  • मैंने डीजेगोकॉन 2011 में अपनी तैनाती सामग्री समझाते हुए एपीओओ से एक बात देखी और वे समानांतर पाइप, शिपिंग का उल्लेख करते हैं। सी फाइलों को संकलित करने और पापी को प्रतिबिंबित करने के बजाय फाइलें, लेकिन उन्होंने इस पर स्पर्श नहीं किया कि उन्होंने यह कैसे किया या उन्होंने क्या उपयोग किया।

+0

तैनाती के अपने इकाई के रूप में आभासी मशीनों और ओएस में सब कुछ बनाने का प्रयोग करें (Debian) संकुल हमें क्या करना है। फिर आप अपना खुद का भंडार चला सकते हैं और चिकनी वृद्धिशील उन्नयन और पूर्ण इंस्टॉल कर सकते हैं। पूर्व-निर्मित ओएस पैकेज होने से यह सुनिश्चित करने का एक शानदार तरीका है कि आपके पास दोहराने योग्य इंस्टॉल है, और आप उन्हें अपाचे या nginx जैसे गैर पायथन सामग्री पर निर्भर कर सकते हैं। –

+0

@ निकक्रैग-वुड हालांकि यह एक अच्छा विचार है, हम कमजोर हैं और हमारे द्वारा उपयोग किए जाने वाले संस्करणों में सभी पायथन पैकेजों को बदलने के लिए समय नहीं है .debs। हम पहले से ही केवीएम के शीर्ष पर सब कुछ चलाते हैं। हमें जल्द से जल्द जितनी जल्दी हो सके तैनाती की जरूरत है। – Kyle

+0

यह एक पुराना सवाल है लेकिन आजकल आप एक पाइप व्हीलहाउस कैश बना सकते हैं जो पैकेज स्थापना समय को काफी कम करता है। –

उत्तर

7

आप तैनाती प्रक्रिया का विश्लेषण किया देखने के लिए जहां समय वास्तव में चला जाता है है? यह मुझे आश्चर्यचकित करता है कि कई समानांतर पाइप प्रक्रियाओं को चलाने से यह अधिक तेज़ नहीं होता है।

यदि समय पीईपीआई से पूछताछ करने और पैकेज ढूंढने के लिए जाता है (विशेष रूप से जब आप गिथब और अन्य स्रोतों से भी डाउनलोड करते हैं) तो यह आपके स्वयं के पीईपीआई को स्थापित करने के लिए फायदेमंद हो सकता है।

--index-url YOUR_URL_HERE 

यह डाउनलोड समय की गति कर सकते हैं: अगर आप सरकारी PyPI पूरी तरह बदलना चाहते हैं

--extra-index-url YOUR_URL_HERE 

या निम्नलिखित: आप PyPI खुद की मेजबानी करने और अपने requirements.txt फ़ाइल (docs) के लिए निम्न में जोड़ सकते हैं क्योंकि सभी पैकेज अब पास की मशीन पर पाए जाते हैं।

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

+0

मेरा पहला कदम z3c.pypimirror का उपयोग करके पापी को प्रतिबिंबित कर रहा था और इससे मदद मिली। मुझे लगता है कि अगला कदम या तो उन चीज़ों के लिए बाइनरी का उपयोग कर रहा है जिन्हें संकलित करने की आवश्यकता है, या समांतरता। मैंने जिस्ट कोड में क्या हो रहा है, यह समझने के लिए अपनी पूरी कोशिश की। मेरा मानना ​​है कि यह उपप्रजाय का निर्धारण कर रहा है और इसे बाद में चलाया जा रहा है। मुझे यकीन नहीं है कि यह सुनिश्चित करने के लिए कि सभी उपप्रोसेस एक ही समय में gevent का उपयोग कर चलते हैं। – Kyle

+0

यदि आप संकलन को तेज करना चाहते हैं तो मुझे अतीत में सीसीएच के साथ बहुत भाग्य मिला है। –

3

यह मदद करेगा अगर आप अपने निर्माण प्रणाली है (उदाहरण के लिए जेनकींस) बिल्ड-विशिष्ट आभासी पर्यावरण निर्देशिका में सब कुछ बनाएं और इंस्टॉल करें? जब निर्माण सफल होता है, तो आप वर्चुअल वातावरण को स्थानांतरित कर देते हैं, इसे टैरबॉल करते हैं और परिणामी टैबलेट को अपने "रिलीज़-टैरबॉल" स्टोरेज में दबाते हैं। तैनाती समय पर, आपको नवीनतम टैरबॉल को पकड़ने और गंतव्य होस्ट पर इसे अनपैक करने की आवश्यकता है और फिर इसे निष्पादित करने के लिए तैयार होना चाहिए। इसलिए यदि गंतव्य होस्ट पर इसे अनपैक करने के लिए टैरबॉल और 0.5 सेकंड डाउनलोड करने में 2 सेकंड लगते हैं, तो आपकी तैनाती में 2.5 सेकंड लगेंगे।

इस दृष्टिकोण का लाभ यह है कि सभी पैकेज प्रतिष्ठान समय पर तैनात समय पर नहीं होते हैं।

चेतावनी: आपके बिल्ड सिस्टम कार्यकर्ता जो वर्चुअल एनवी में चीजों को बनाता/संकलित/स्थापित करता है, को लक्ष्य हार्डवेयर के समान वास्तुकला का उपयोग करना चाहिए।इसके अलावा अपने उत्पादन बॉक्स प्रावधानीकरण प्रणाली (जैसे PIL की आवश्यकता है कि libjpeg स्थापित करने से पहले इसे जेपीईजी से संबंधित कोड को संकलित कर सकते हैं, अगर libjpeg लक्ष्य पर स्थापित नहीं है भी बातें टूट जाएगा विभिन्न सी पुस्तकालय निर्भरता की देखभाल कुछ अजगर संकुल हो सकता है रखने की आवश्यकता होगी बॉक्स)

यह हमारे लिए अच्छी तरह से काम करता है।

एक आभासी env पुनर्निधारणीय बनाना:

virtualenv --relocatable /build/output/dir/build-1123423

इस उदाहरण build-1123423 में एक निर्माण विशिष्ट वर्चुअल env निर्देशिका है।

6

समानांतर पिप स्थापना

यह उदाहरण xargs का उपयोग करता है लगभग 4x द्वारा निर्माण प्रक्रिया parallelize करने। आप नीचे की अधिकतम procs के साथ समानांतर कारक बढ़ा सकते हैं (इसे लगभग अपने कोर के बराबर रखें)।

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

डाउनलोड और समानांतर में पैकेज इंस्टॉल, एक बार में चार:

xargs --max-args=1 --max-procs=4 sudo pip install < requires.txt 

नोट: xargs विभिन्न लिनक्स वितरण पर विभिन्न पैरामीटर नाम है। विनिर्देशों के लिए अपने वितरण के मैन पेज की जांच करें। वहाँ एक सुदूर संभावना है कि इस विधि की गति (अपने वितरण के आधार पर) स्थापित करने के लिए यदि एक से अधिक पिप के कोशिश पैकेज प्रकट होता है को भ्रमित कर सकते है:

यही बात एक here-doc:

cat << EOF | xargs --max-args=1 --max-procs=4 sudo pip install 
awscli 
bottle 
paste 
boto                   
wheel 
twine                   
markdown 
python-slugify 
python-bcrypt 
arrow 
redis 
psutil 
requests 
requests-aws 
EOF 

चेतावनी का उपयोग कर inlined एक ही निर्भरता पर एक ही निर्भरता, लेकिन यदि आप एक समय में केवल 4 कर रहे हैं तो यह बहुत ही असंभव है। इसे pip install --uninstall depname द्वारा आसानी से तय किया जा सकता है।

+1

कूल हैक लेकिन मुझे इसमें निर्भरता समस्या डीबग करना नफरत है :) आप उस आदेश से कैसे आए? –

+0

धन्यवाद @ItamarHaber .. और मैं सहमत हूं - यह मजेदार नहीं होगा :) यह आमतौर पर उपयोग की जाने वाली संकुल फ़ाइल का एक स्निपेट है (जिसे एक बिंदु पर वर्णित किया गया था)। स्पकी विशेष रूप से रेडिस के साथ काम करने के लिए अच्छा है (जैसा कि शॉर्टुइड है जो इस सूची में नहीं है)। –

-1

Jamieson Becker's answer से प्रेरित होकर, मैं एक स्थापित स्क्रिप्ट को संशोधित करके समानांतर पिप को स्थापित करता है क्या करने के लिए और ऐसा लगता है और सुधार लगता है। मेरी बैश स्क्रिप्ट में अब इस तरह एक स्निपेट है:

requirements=''\ 
'numpy '\ 
'scipy '\ 
'Pillow '\ 
'feedgenerator '\ 
'jinja2 '\ 
'docutils '\ 
'argparse '\ 
'pygments '\ 
'Typogrify '\ 
'Markdown '\ 
'jsonschema '\ 
'pyzmq '\ 
'terminado '\ 
'pandas '\ 
'spyder '\ 
'matplotlib '\ 
'statlab '\ 
'ipython[all]>=3 '\ 
'ipdb '\ 
''tornado>=4' '\ 
'simplepam '\ 
'sqlalchemy '\ 
'requests '\ 
'Flask '\ 
'autopep8 '\ 
'python-dateutil '\ 
'pylibmc '\ 
'newrelic '\ 
'markdown '\ 
'elasticsearch '\ 
"'"'docker-py==1.1.0'"'"' '\ 
"'"'pycurl==7.19.5'"'"' '\ 
"'"'futures==2.2.0'"'"' '\ 
"'"'pytz==2014.7'"'"' ' 

echo requirements=${requirements} 
for i in ${requirements}; do (pip install $i > /tmp/$i.out 2>&1 &); done 

मैं कम से कम समस्याओं का मैन्युअल रूप से देख सकता हूं।

+0

आपको एक आवश्यकता फ़ाइल का उपयोग करना चाहिए (उदा। 'पीआईपी इंस्टॉल -आर आवश्यकताएं.txt')। कम महत्वपूर्ण बात यह है कि बैश तारों में न्यूलाइन के लिए अनुमति देता है, इसलिए आपको स्ट्रिंग को बंद करने और न्यूलाइन – Leons

8

बिल्डिंग जेमीसन बेकर का जवाब पर, निम्नलिखित कोड समानांतर पिप डाउनलोड, तो जल्दी से संकुल को स्थापित करता है।

सबसे पहले, हम एक वितरण ("जिले") निर्देशिका में समानांतर में संकुल डाउनलोड करें। यह आसानी से बिना किसी संघर्ष के समानांतर में चलाया जाता है। प्रत्येक पैकेज नाम मुद्रित किया जाता है डाउनलोड से पहले मुद्रित किया जाता है, जो डीबगिंग के साथ मदद करता है। अतिरिक्त सहायता के लिए, अनुक्रमिक रूप से डाउनलोड करने के लिए -P9 से -P1 बदलें।

डाउनलोड करने के बाद, अगले आदेश/अद्यतन पैकेज इंस्टॉल करने पिप बताता है। फ़ाइलें डाउनलोड नहीं की जाती हैं, उन्हें तेज़ स्थानीय निर्देशिका से लाया जाता है।

यह पिप 1.5 के साथ भी पिप 1.7 के वर्तमान संस्करण के साथ संगत है।

केवल संकुल का एक सबसेट स्थापित करने के लिए, 'कस्टम आवश्यकताएं .xt' कथन को अपने कस्टम कमांड के साथ प्रतिस्थापित करें, उदा। 'Egrep -v GitHub requirement.txt'

cat requirements.txt | xargs -t -n1 -P9 pip install -q --download ./dist 

pip install --no-index --find-links=./dist -r ./requirements.txt 
+2

से बचने की आवश्यकता नहीं है मुझे यह पसंद है! यह धीमा हो जाएगा (यदि आप सी एक्सटेंशन संकलित कर रहे हैं तो यह वास्तविक स्थापना समानांतर नहीं करता है), लेकिन यह किसी भी समवर्ती-लिखने के मुद्दों को अच्छी तरह से रोकता है। अच्छा विचार –

+0

दुर्भाग्य से सावधान रहें, यह आसानी से निर्भरताओं के संस्करणों को गड़बड़ कर सकता है। लेकिन अगर सभी लाइब्रेरी संस्करण बाधित हैं (सीसी स्विच के साथ) इसे ठीक काम करना चाहिए। – allprog