2008-08-21 8 views
15

मैं वीएमवेयर के भीतर लिनक्स पर अपाचे चला रहा हूं।नींद() चुपचाप hogs सीपीयू

PHP पृष्ठों मैं का अनुरोध कर रहा हूँ से एक एक sleep() करता है, और मुझे लगता है कि अगर मैं जबकि पहले पृष्ठ sleep()'ing, दूसरे पृष्ठ रुक जाता है, के लिए प्रथम पृष्ठ से sleep() के लिए इंतज़ार कर एक दूसरे पृष्ठ का अनुरोध करने का प्रयास समाप्त।

क्या किसी और ने इस व्यवहार को देखा है?

मुझे पता है कि PHPनहीं है मल्टी-थ्रेडेड, लेकिन इस CPU के सकल दुर्व्यवहार की तरह लगता है।

संपादित करें: मुझे यह उल्लेख करना चाहिए कि CPU उपयोग स्पाइक नहीं है। सीपीयू "होगिंग" का मेरा मतलब यह है कि कोई अन्य PHP पृष्ठ सीपीयू का उपयोग करने में सक्षम नहीं है, जबकि पृष्ठ नींद() 'आईएनजी है।

+0

क्या आपको कभी इसके लिए समाधान मिला? मुझे भी यही तकलीफ़ है। –

उत्तर

1

क्या आप वास्तव में सीपीयू को 100% पर देखते हैं या सिर्फ कोई अन्य पृष्ठ नहीं दिया जा रहा है? आप कितने अपाचे-उदाहरण चल रहे हैं? जब आप धागे के अंदर नींद() चलाते हैं तो क्या वे सभी रोक रहे हैं?

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

4

इसका क्या अर्थ है कि आपका अपाचे केवल 1 बाल प्रक्रिया का उपयोग कर रहा है।

इसलिए

:

1 बच्चा प्रक्रिया एक अनुरोध पर कार्य कर रहा है (इस मामले सो में, लेकिन यह असली काम कर सकते हैं, अपाचे अंतर नहीं बता सकता) है, इसलिए जब एक नया अनुरोध यह आता है, यह होगा पहली प्रक्रिया पूरी होने तक प्रतीक्षा करनी है।

समाधान प्रक्रियाओं की संख्या में वृद्धि होगी, अपाचे को स्पैन करने की अनुमति है (MaxClients निर्देश अगर आप प्रीफ़ोर एमपीएम का उपयोग कर रहे हैं), तो PHP स्क्रिप्ट से नींद() को हटा दें।

आपकी स्क्रिप्ट में क्या हो रहा है यह जानने के बिना यह कहना मुश्किल है, लेकिन आप शायद नींद से छुटकारा पा सकते हैं()।

+0

आपने 'शायद' शब्द के साथ थोड़ा सा विचार किया है, लेकिन मुझे अभी भी यह नहीं दिख रहा है कि आप कोड को तोड़ने के बिना कभी नहीं देखे गए कोड के बिट्स को हटाने में सक्षम होने की उम्मीद को कैसे औचित्य साबित कर सकते हैं? – JoeBloggs

+3

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

10

यह कहा जा सकता है कि कहा गया पृष्ठ एक सत्र खोलता है और फिर इसे प्रतिबद्ध नहीं करता है, इस मामले में समाधान के लिए this answer देखें।

+4

यदि आपके पास session.auto_start से 1 तक कॉन्फ़िगर किया गया php.ini है, तो यह किसी भी कोड को चलाने से पहले सत्र खोल देगा, और इसे तब तक खुला रखेगा जब तक आप इसे स्पष्ट रूप से बंद न करें, या पृष्ठ अंत तक पहुंच जाए। कोड की पहली पंक्ति चलाने से पहले दूसरा अनुरोध प्रतीत होता है। –

+2

मेरे मामले में, लूप शुरू करने से पहले 'session_write_close()' को कॉल करने से सर्वर पर अन्य पृष्ठों तक पहुंच लॉक करने से 'नींद' को रोका गया। – thirdender