2013-01-09 17 views
5

यह पहली बार नहीं है जब मुझे अपनी होस्टिंग से बहुत अधिक सीपीयू लोड चेतावनी मिलती है। कोड mysql प्रश्नों के साथ बस कुछ यादृच्छिक PHP स्क्रिप्ट है, कुछ भी फैंसी नहीं है। (ये सारणी असाधारण नहीं हैं, कुछ सौ लाइन अधिकतम हैं और अनुरोध किए जाने पर मैं हमेशा उन्हें सीमित करता हूं।सीमा सीपीयू लोड या सेट प्रक्रिया प्राथमिकता

मुझे कोई फर्क नहीं पड़ता कि यह 0.05 के बजाय 0.15 सेकेंड के लिए चलता है, तो क्या कोई तरीका है कि मैं प्रक्रिया प्राथमिकता को नियंत्रित कर सकता हूं या सीमा cpu लोड?

धन्यवाद!

उत्तर

11

यह एक Dameon या प्रोग्राम है जो लंबे समय के लिए चलाता जोड़ने है sleep()/usleep()एक छोटा सा नींद अपने CPU उपयोग नाटकीय रूप से

कोड का पालन कम हो जाएगा बहुत सी सी का उपभोग करें पु

while(...){ 
//do stuff 
} 

क्योंकि आप सीपीयू के लिए अन्य कार्य करने के लिए जगह नहीं दे रहे हैं। इसे

while(...){ 
    //do stuff 
    sleep(1); 
} 

यह आपके CPU उपयोग को बहुत कम कर देगा। सीपीयू के लिए 1 सेकंड अन्य कार्य करने के लिए बहुत समय है

अतिरिक्त 0.1 दूसरा (0.15 - 0.05) सोने के लिए (नींद) का उपयोग करें।

usleep(100000); 
+0

आपको बहुत बहुत धन्यवाद, यह सही जवाब है! – molbal

+0

असल में, यह उपयोग को कम नहीं करेगा, क्योंकि यह वही रहेगा। लेकिन एक स्क्रिप्ट की पूरी अवधि के लिए स्पाइकिंग से 100% CPU उपयोग तक प्रक्रिया को प्रसारित करेगा। जो अन्य कार्यों को अवरुद्ध नहीं करेगा जिन्हें तेजी से निष्पादित किया जाना चाहिए। – Grzegorz

6

सिद्धांत रूप में, Unixish सिस्टम पर (लिनक्स, BSD, आदि), अगर आप इस तरह की प्रक्रिया प्राथमिकता बदलने के लिए, proc_nice() समारोह इस्तेमाल कर सकते हैं:

proc_nice(20); // now this process has very low priority 

हालांकि, वहाँ एक जोड़े हैं यहां प्रमुख चेतावनियों में से जो इसे अभ्यास में कम उपयोगी बनाता है:

  • यह विंडोज पर समर्थित नहीं है।
  • आपको केवल कम करने की अनुमति है, इसे कम नहीं करने के लिए (इसके मूल मूल्य पर भी वापस नहीं)।
  • PHP प्रक्रिया समाप्त होने तक अच्छीता बनी रहती है, यदि आप एक फास्टसीजीआई प्रक्रिया के रूप में PHP चला रहे हैं, या इससे भी बदतर, वेबसर्वर एक्सटेंशन के रूप में एक समस्या हो सकती है।
  • उपर्युक्त मुद्दों के कारण, proc_nice() को उन कारणों पर भी सुरक्षा कारणों से अक्षम किया जा सकता है जो तकनीकी रूप से इसका समर्थन कर सकते हैं।

आपको क्या करने की कोशिश कर सकते हैं, अपने webhost यह अनुमति देता है, start a background process को लंबे समय से चल कार्य के लिए है, इसलिए है कि अपने वेब सर्वर अनुरोधों की सेवा के चलते समय के लिए वापस मिल सकता है। तुम भी पृष्ठभूमि प्रक्रिया की प्राथमिकता कम करने के लिए, इस तरह nice शेल कमांड का उपयोग कर सकते हैं:

exec("nice nohup php -f slow_script.php </dev/null> output.txt 2>&1 &"); 

एक बार धीमी गति से स्क्रिप्ट समाप्त हो गया है, तो आप इसके उत्पादन output.txt डाउनलोड करके प्राप्त कर सकते हैं।

+0

आपके तरह के उत्तर के लिए धन्यवाद! मैं इसे उपयोगी के रूप में चिह्नित करूंगा, लेकिन मेरे पास अभी तक पर्याप्त प्रतिनिधि नहीं है :) – molbal

+0

दरअसल, मेरा पहला सुझाव _that_ उपयोगी नहीं था, जैसा कि मैंने नोट किया था, लेकिन मैंने अभी संभवतः एक अधिक उपयोगी एक जोड़ा - ऊपर देखें। :) –

+0

फिर से धन्यवाद! मैं इससे परेशान नहीं होना चाहता था, क्योंकि मैं ज्यादातर घर से काम करता हूं जहां मुझे विंडोज़ चलाना चाहिए। दूसरी तरफ, मैंने इन स्निपेट को बचा लिया है। मुझे नहीं पता था कि PHP इस में सक्षम है, मैं हर दिन कुछ नया सीखता हूं :) – molbal

0

Ilmari कारोनेन के जवाब के अलावा:

आप को बढ़ाने या मौजूदा प्रक्रिया के सुंदरता को कम करने के renice एक साथ उपयोग मौजूदा प्रक्रिया आईडी के साथ करना चाहते हैं:

function custom_proc_nice($priority) { 

    exec("renice +$priority ".getmypid()); 

} 

आप रोकना चाहते हैं

function exit_func(){ 

    // Restore priority 
    proc_nice(0); 
} 

register_shutdown_function('exit_func'); 

Reso: के बाद पीएचपी प्रक्रिया बाहर निकल जाता है तो आप एक बंद समारोह की आवश्यकता होगी सुंदरता लागू करने के लिए urces

http://php.net/manual/en/function.proc-nice.php

+0

से निपटने के लिए देखते हैं, जब तक आप PHP को चला रहे हों रूट उपयोगकर्ता (जो बहुत असुरक्षित है, इसलिए आपको वास्तव में नहीं होना चाहिए), ['चाइनाइस' किसी प्रक्रिया की अच्छीता को कम नहीं कर सकता है।] (http://linux.die.net/man/8/renice) –

+0

जानकार अच्छा लगा। इल्मारी की जानकारी और प्रतिक्रियाशीलता के लिए धन्यवाद! क्या php प्रक्रिया के लिए डिफ़ॉल्ट मान 0 पर सेट है? – RafaSashi

संबंधित मुद्दे