বাশ স্ক্রিপ্টে সমান্তরালে কয়েক হাজার কার্ল পটভূমি প্রক্রিয়াগুলি চলছে


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প্রসেস সংখ্যাটি কেবল 1-2 হাজারে বাড়িয়ে তুলি এবং তারপরে কমিয়ে 20-30 হয়ে যায় তবে পাইপিং কার্লের মাধ্যমে সাধারণ পার্সিং যুক্ত করি ...

প্রক্রিয়া সংখ্যা এত নাটকীয়ভাবে হ্রাস কেন? এই স্থাপত্যের সীমা কোথায়?


2
আপনি সম্ভবত সর্বাধিক চলমান প্রক্রিয়া বা সর্বাধিক উন্মুক্ত সকেটগুলির সীমাগুলির একটিতে আঘাত করছেন। ulimitএই সীমাবদ্ধতাগুলির কিছু প্রদর্শন করবে।
এইচবিউইজন

6
আমি এই parallel(1)জাতীয় কাজের জন্য ব্যবহার করার
পরামর্শও দেব

চেষ্টা করুন start=$SECONDSএবং end=$SECONDS- শেল ভেরিয়েবলের সাথে সম্ভাব্য নামের সংঘর্ষ এড়াতে অভ্যাস অনুসারে লোয়ার কেস বা মিক্সড কেস ভেরিয়েবলের নাম ব্যবহার করুন । তবে, আপনি প্রতিটি প্রক্রিয়া শুরু করার ক্ষেত্রে কেবলমাত্র ক্রমবর্ধমান সময়ের ব্যবধান পাচ্ছেন। প্রক্রিয়াটি ব্যাকগ্রাউন্ডে আসার পরে ডাউনলোডটি কতটা সময় নিয়েছে তা আপনি পাচ্ছেন না (এবং startএটি কেবল একবার গণনা করা হয়)। বাশ-এ, আপনি (( diff = end - start ))ডলারের চিহ্নগুলি বাদ দিয়ে এবং ব্যবধানটিকে আরও নমনীয় করে তোলার সুযোগ দিতে পারেন। আপনার কাছে pgrepথাকলে ব্যবহার করুন ।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

আমি এইচবি ব্রাইজন এর সাথে একমত আপনি প্রক্রিয়া সংখ্যার দ্বিগুণ (যোগ করে awk) যখন আপনার প্রক্রিয়া গণনা অর্ধেক হয় লক্ষ্য করুন ।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

@ জেনেচ @ এইচবি ব্রজিন আমি চালু করেছি parallelএবং এটি আমাকে বলেছে যে ফাইল হ্যান্ডলগুলি সিস্টেমের সীমাবদ্ধতার কারণে আমি মাত্র 500 সমান্তরাল কাজ চালাতে পারি। আমি সীমাবদ্ধতাগুলিতে সীমাবদ্ধতা বাড়িয়েছি, তবে এখন যখন আমি 5000 সিমুলানিয়াস কাজ চালানোর চেষ্টা করি তখন তা শুরু হওয়ার আগেই তাত্ক্ষণিকভাবে আমার সমস্ত স্মৃতি (49 গিগাবাইট) parallel খায় কারণ প্রতিটি পার্ল স্ক্রিপ্ট 32 এমবি খায়।
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 ডিফল্ট)
প্যাট্রিক

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