बैश स्क्रिप्ट में समानांतर में हजारों कर्ल पृष्ठभूमि प्रक्रियाओं को चलाना


14

मैं निम्नलिखित बैश स्क्रिप्ट में समानांतर में कर्ल पृष्ठभूमि प्रक्रियाओं के थाउंसैंड चला रहा हूं

START=$(date +%s)
for i in {1..100000}
do       
    curl -s "http://some_url_here/"$i  > $i.txt&
    END=$(date +%s)
    DIFF=$(( $END - $START ))
    echo "It took $DIFF seconds"
done

मेरे पास 49Gb Corei7-920 समर्पित सर्वर (वर्चुअल नहीं) है।

मैं मेमोरी खपत और सीपीयू को topकमांड के माध्यम से ट्रैक करता हूं और वे सीमा से बहुत दूर हैं।

मैं ps aux | grep curl | wc -lवर्तमान कर्ल प्रक्रियाओं की संख्या की गणना करने के लिए उपयोग कर रहा हूं । यह संख्या तेजी से 2-4 हजार तक बढ़ जाती है और फिर लगातार घटने लगती है।

अगर मैं curl | awk > outputकर्लिंग प्रक्रियाओं के माध्यम से पाइपिंग कर्ल से awk ( ) तक सरल पार्सिंग जोड़कर सिर्फ 1-2 हजार तक बढ़ाता हूं और फिर घटकर 20-30 ...

क्यों प्रक्रियाओं की संख्या इतनी नाटकीय रूप से घट जाती है? इस वास्तुकला की सीमाएं कहां हैं?


2
आप शायद अधिकतम चलने वाली प्रक्रियाओं या अधिकतम खुले सॉकेट्स की सीमाओं में से एक को मार रहे हैं। ulimitउन सीमाओं में से कुछ दिखाएगा।
HBruijn

6
मैं parallel(1)ऐसे कार्यों के लिए उपयोग करने का सुझाव भी
दूंगा

शेल चर के साथ संभावित नाम टकराव से बचने के लिए आदत से कम मामले या मिश्रित केस चर नामों का उपयोग करें start=$SECONDSऔर end=$SECONDS- का उपयोग करें। हालाँकि, आप वास्तव में केवल प्रत्येक प्रक्रिया की शुरुआत के बढ़ते समय अंतराल को प्राप्त कर रहे हैं। आपको यह प्राप्त नहीं हो रहा है कि प्रक्रिया पृष्ठभूमि में कितनी देर से डाउनलोड हुई है (और startकेवल एक बार गणना की गई है)। बैश में, आप (( diff = end - start ))डॉलर के संकेतों को छोड़ने और रिक्ति को अधिक लचीला बनाने की अनुमति दे सकते हैं । pgrepअगर आपके पास है तो उपयोग करें ।
अगली सूचना तक रोक दिया गया।

मैं HBruijn से सहमत हूं। ध्यान दें कि जब आप प्रक्रियाओं की संख्या को दोगुना (जोड़कर awk) करते हैं तो आपकी प्रक्रिया की संख्या आधी कैसे हो जाती है ।
अगली सूचना तक रोक दिया गया।

@zhenech @HBrujin मैंने लॉन्च किया parallelऔर यह कहता है कि मैं फ़ाइल हैंडल की सिस्टम सीमा के कारण सिर्फ 500 समानांतर कार्य चला सकता हूं। मैंने लिमिट्स में सीमा बढ़ा दी थी ।conf, लेकिन अब जब मैं 5000 सिमुलेंस जॉब चलाने की कोशिश करता हूं तो यह मेरी सभी मेमोरी (49 जीबी) को तुरंत शुरू होने से पहले ही parallel खा लेता है क्योंकि हर पर्ल स्क्रिप्ट 32Mb खाता है।
zavg

जवाबों:


12

प्रश्न का कड़ाई से पालन करें:

mycurl() {
    START=$(date +%s)
    curl -s "http://some_url_here/"$1  > $1.txt
    END=$(date +%s)
    DIFF=$(( $END - $START ))
    echo "It took $DIFF seconds"
}
export -f mycurl

seq 100000 | parallel -j0 mycurl

यदि आपको समयावधि के आसपास बॉयलरप्लेट पाठ की आवश्यकता नहीं है, तो छोटा करें:

seq 100000 | parallel -j0 --joblog log curl -s http://some_url_here/{} ">" {}.txt
cut -f 4 log

यदि आप समानांतर में अधिकतम स्तर चाहते हैं तो आप कुछ सीमाएं (जैसे फ़ाइल हैंडल) मारेंगे। Ulimit -n या /etc/security/limits.conf उठाना मदद कर सकता है।


और अगर मैं समानांतर में लघु उत्तर संस्करण में एक के रूप में कई कमांड चलाना चाहता हूं, तो मैं यह कैसे कर सकता हूं?
गाई अवराम

2
इसे बोली seq 100 | parallel 'echo here is command 1: {}; echo here is command 2: {}':। ट्यूटोरियल के माध्यम से चलने में एक घंटा बिताएं। आपकी कमांड लाइन आपको इसके लिए प्यार करेगी:man parallel_tutorial
ओले तांगे

2
for i in {1..100000}

केवल 65536 बंदरगाह हैं। इसे कुचलना।

for n in {1..100000..1000}; do   # start 100 fetch loops
        for i in `eval echo {$n..$((n+999))}`; do
                echo "club $i..."
                curl -s "http://some_url_here/"$i  > $i.txt
        done &
        wait
done

(संपादित करें: (संपादित करें: ओएस सीमाओं के बारे में गंभीर रूप से दिनांकित पट्टी और लापता को जोड़ना )echocurl
wait


वास्तव में ओएस इसे ठीक से संभाल सकता है। यह टीसीपी की एक सीमा है। कोई ओएस नहीं, चाहे वह कितना ही खास क्यों न हो, उसके आसपास नहीं पहुंच पाएगा। लेकिन ओपी के 4k कनेक्शन 64k (या कुछ डिस्ट्रोफ के 32k डिफ़ॉल्ट) के पास कहीं नहीं है
पैट्रिक

@Patrick ठीक है, मैंने उस हिस्से को बाहर निकाल लिया, यह एक अकाट्य डिजाइन सीमा के साथ बेमानी है, लेकिन 7 वीं पर ज़वग की टिप्पणी को देखें।
jthill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.