2008-09-11 3 views
28

यहां मेरा पहला प्रश्न है SO।पता लगाएं कि आपका PHP कोड धीमा हो रहा है (प्रदर्शन समस्या)

मेरे पास मेरी कंपनी के लिए एक आंतरिक अनुप्रयोग है जिसे मैंने हाल ही में बनाए रखने के लिए कहा है। एप्लिकेशन PHP में बनाया गया है और इसकी काफी अच्छी तरह से कोडित (ओओ, डीबी एब्स्ट्रक्शन, स्मार्ट) कुछ भी डब्ल्यूटीएफ-आईएसएच नहीं है।

समस्या यह है कि अनुप्रयोग बहुत धीमी है।

मैं यह जानने के लिए कैसे जा सकता हूं कि एप्लिकेशन धीमा कर रहा है? मैंने कोड को बहुत कम डीबी प्रश्न बनाने के लिए अनुकूलित किया है, इसलिए मुझे पता है कि यह PHP कोड है जो निष्पादित करने में कुछ समय ले रहा है। मुझे कुछ टूल्स प्राप्त करने की ज़रूरत है जो मुझे इसके साथ मदद कर सकें और मेरे कोड की जांच करने के लिए रणनीति तैयार करने की आवश्यकता हो।

मैं स्वयं जांच/रणनीति कार्य कर सकता हूं, लेकिन मुझे यह पता लगाने के लिए और अधिक PHP टूल की आवश्यकता है कि मेरा ऐप कहां जा रहा है।

विचार?

उत्तर

39

मैंने हाल ही में एक समान स्थिति में XDebug profiling का उपयोग किया है। यह एक पूर्ण प्रोफाइल रिपोर्ट आउटपुट करता है जिसे कई सामान्य प्रोफाइलिंग ऐप्स के साथ पढ़ा जा सकता है (हालांकि आपको एक सूची नहीं दे सकती है, मैंने अभी भी उस व्यक्ति का उपयोग किया जो स्लेकवेयर के साथ आया था)।

+0

उत्कृष्ट। इस पोस्ट ने वास्तव में मदद की। धन्यवाद। – verisimilitude

0

हम ज़ेंड विकास पर्यावरण (विंडोज़) का उपयोग करते हैं। प्रत्येक लाइन को निष्पादित किए जाने पर मेमोरी/सीपीयू/डिस्क गतिविधि देखने के लिए प्रोसेस एक्सप्लोरर चलाने के दौरान हमने डीबगर के माध्यम से कदम उठाकर एक मेमोरी उपयोग स्पाइक को हल किया।

प्रक्रिया एक्सप्लोरर: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

जेडीई में एक बुनियादी प्रदर्शन प्रोफाइलर शामिल है जो पृष्ठ अनुरोधों के दौरान प्रत्येक फ़ंक्शन कॉल में व्यतीत समय दिखा सकता है।

0

मैं PEAR Benchmark और log4php के संयोजन का उपयोग करता हूं।

स्क्रिप्ट के शीर्ष पर मैं प्रोफ़ाइल बनाना चाहता हूं, मैं एक ऑब्जेक्ट बनाता हूं जो Benchmark_Timer ऑब्जेक्ट के आसपास लपेटता है। कोड के दौरान, मैं विशेष रूप से संदिग्ध कोड के आसपास $object->setMarker("name"); कॉल में जोड़ता हूं।

रैपर वर्ग में एक नष्ट विधि है जो लॉगिंग जानकारी लेती है और इसे log4php पर लिखती है। मैं आमतौर पर इसे syslog (कई सर्वर, एक सर्वर पर एक लॉग फ़ाइल में समेकित) को भेजता हूं।

डीबग में, मैं लॉग फाइल देख सकता हूं और देख सकता हूं कि मुझे चीज़ों को बेहतर बनाने की आवश्यकता है। बाद में उत्पादन में, मैं लॉग फाइलों को पार्स कर सकता हूं और प्रदर्शन विश्लेषण कर सकता हूं।

यह xdebug नहीं है, लेकिन यह हमेशा चालू रहता है और मुझे कोड के किसी भी दो निष्पादन की तुलना करने की क्षमता देता है।

+0

भले ही मैं एक्सडीबग के साथ जा रहा हूं, मैं पियर बेंचमार्क की जांच करूंगा। मैं इसे अन्य परियोजनाओं में उपयोग कर सकता हूं – Rushi

9

जैसा कि जुआन ने उल्लेख किया है, xDebug उत्कृष्ट है। यदि आप विंडोज़ पर हैं, तो WinCacheGrind आपको रिपोर्ट देखने देगा।

+0

मेरे पास एक विंडोज़ मशीन है जो मैं अच्छी तरह से उपयोग कर सकता हूं – Rushi

+2

KCacheGrind (केडीई/लिनक्स) बहुत बेहतर है। – blueyed

6

इस प्रस्तुति को रasmस लेरडोर्फ (PHP के निर्माता) द्वारा देखें। वह पीएचपी की गति का परीक्षण करने के कुछ अच्छे उदाहरणों में और साथ ही साथ कुछ आंतरिकों को देखने के लिए जो चीजों को धीमा कर सकते हैं। XDebug वह एक उपकरण है जिसका वह उपयोग करता है। वह यह जानने के बारे में एक बहुत ही ठोस बिंदु बनाता है कि आप ढांचे के साथ क्या प्रदर्शन लागत प्राप्त कर रहे हैं।

वीडियो: http://www.archive.org/details/simple_is_hard

स्लाइड (क्योंकि यह वीडियो पर देखने के लिए मुश्किल है): http://talks.php.net/show/drupal08/1

1

इसकी एक बड़ी कोड आधार कोशिश एपीसी आईएफएस अगर आप पहले से ही नहीं कर रहे हैं।

http://pecl.php.net/package/APC

+0

अरे वहाँ। क्या आप अपने प्रश्न की समीक्षा कर रहे थे, क्या आप इसे छोड़ देंगे? आप शायद जानते हैं कि क्या करना है, इसलिए मैं आपको इसे छोड़ दूंगा। कृपया अपने लिंक के प्रासंगिक भाग शामिल करें :) –

2

phpED (http://www.nusphere.com/products/phped.htm) भी महान डिबगिंग और रूपरेखा, और PHP कोड में देखता है, breakpoints, आदि को जोड़ने की क्षमता प्रदान करता है। एकीकृत प्रोफाइलर सीधे आईडीई के भीतर से प्रत्येक फ़ंक्शन कॉल और क्लास विधि का समय टूटना प्रदान करता है। ब्राउज़र प्लगइन्स फ़ायरफ़ॉक्स या आईई के साथ त्वरित एकीकरण भी सक्षम करते हैं (यानी ब्राउज़र के साथ धीमे यूआरएल पर जाएं, फिर प्रोफ़ाइल या डीबग करने के लिए बटन पर क्लिक करें)।

यह बताते हुए बहुत उपयोगी रहा है कि अधिकांश कोडिंग प्रयासों को ध्यान में रखते हुए ऐप धीमा है; और यह पहले से ही तेजी से कोड अनुकूलन समय बर्बाद करने से बचाता है। ज़ेंड और ग्रहण करने की कोशिश करने के बाद, अब मुझे phpED के उपयोग की आसानी पर बेचा गया है।

ध्यान रखें कि Xdebug और phpED (डीबीजी के साथ) दोनों को ध्यान में रखते हुए एक अतिरिक्त PHP मॉड्यूल स्थापित किया जाएगा जब वेबसर्वर के खिलाफ डीबगिंग हो। phpED भी स्थानीय डिबगिंग विकल्प प्रदान करता है (मेरे द्वारा अनचाहे)।

1

आप php में register_tick_function फ़ंक्शन का उपयोग करने का भी प्रयास कर सकते हैं। जो php को आपके कोड के माध्यम से आवधिक रूप से एक निश्चित कार्य को कॉल करने के लिए कहता है। फिर आप ट्रैक कर सकते हैं कि वर्तमान में कौन सा फ़ंक्शन चल रहा है और कॉल के बीच की अवधि कितनी है। तो आप देख सकते हैं कि सबसे अधिक समय क्या ले रहा है। http://www.php.net/register_tick_function

2

Xdebug प्रोफ़ाइल निश्चित रूप से जाने का तरीका है। एक और युक्ति - WincacheGrind अच्छा है, लेकिन हाल ही में अपडेट नहीं किया गया है। http://code.google.com/p/webgrind/ - एक ब्राउज़र में एक आसान और त्वरित विकल्प हो सकता है।

संभावनाएं हैं, फिर भी यह डेटाबेस अभी भी है। प्रासंगिक अनुक्रमणिका के लिए जांचें - और इसमें जितना संभव हो उतना काम करने वाला डेटा कैश करने के लिए पर्याप्त स्मृति है।

3

ऐसे कई चर हैं जो आपके एप्लिकेशन के प्रदर्शन को प्रभावित कर सकते हैं। मैं अनुशंसा करता हूं कि आप तुरंत मान लें कि PHP समस्या है।

सबसे पहले, आप PHP की सेवा कैसे कर रहे हैं? क्या आपने अपाचे या आईआईएस के बुनियादी अनुकूलन की कोशिश की है? क्या सर्वर अन्य प्रकार के अनुरोधों को संसाधित करने में व्यस्त है? क्या आपने PHP code accelerator का लाभ उठाया है? यह जांचने का एक तरीका है कि सर्वर आपकी बाधा है कि किसी अन्य सर्वर पर एप्लिकेशन चलाने का प्रयास करें।

दूसरा, पूरे एप्लिकेशन का प्रदर्शन धीमा है, या क्या यह केवल कुछ पृष्ठों को प्रभावित करता है? यह आपको एक विश्लेषण दे सकता है कि प्रदर्शन का विश्लेषण शुरू करना कहां से शुरू किया जाए। यदि पूरा एप्लिकेशन धीमा है, तो समस्या अंतर्निहित सर्वर/प्लेटफॉर्म या वैश्विक SQL क्वेरी के साथ अधिक संभावना है जो हर अनुरोध का हिस्सा है (उदाहरण के लिए उपयोगकर्ता प्रमाणीकरण)।

तीसरा, आपने SQL क्वेरी की संख्या को कम करने का उल्लेख किया है, लेकिन मौजूदा प्रश्नों को अनुकूलित करने के बारे में क्या? यदि आप MySQL का उपयोग कर रहे हैं, तो क्या आप प्रत्येक स्टोरेज सिस्टम की विभिन्न शक्तियों का लाभ उठा रहे हैं? क्या आपने यह सुनिश्चित करने के लिए EXPLAIN को अपने सबसे महत्वपूर्ण प्रश्नों पर चलाया है कि वे सही तरीके से अनुक्रमित हैं? यह उन प्रश्नों पर महत्वपूर्ण है जो बड़ी तालिकाओं तक पहुंचते हैं; डेटासेट जितना बड़ा होगा, उतना ही आप खराब इंडेक्सिंग के प्रभावों को देखेंगे। सौभाग्य से, कई लेख such as this one हैं जो बताते हैं कि EXPLAIN का उपयोग कैसे करें।

चौथा, एक आम गलती यह मानना ​​है कि आपका डेटाबेस सर्वर स्वचालित रूप से सिस्टम के लिए उपलब्ध सभी संसाधनों का उपयोग करेगा। आपको यह सुनिश्चित करने के लिए जांच करनी चाहिए कि आपने अपने डेटाबेस एप्लिकेशन में पर्याप्त संसाधनों को स्पष्ट रूप से आवंटित किया है। MySQL में, उदाहरण के लिए, आप कुंजी बफर, अस्थायी तालिका आकार, थ्रेड समरूपता, innodb बफर पूल आकार इत्यादि जैसी चीजों के लिए कस्टम सेटिंग्स (अपनी my.cnf फ़ाइल में) जोड़ना चाहेंगे

यदि आपके पास है उपर्युक्त सभी को दोबारा जांच लिया गया है और अभी भी बाधा को खोजने में असमर्थ हैं, Xdebug जैसे कोड प्रोफाइलर निश्चित रूप से मदद कर सकते हैं। व्यक्तिगत रूप से, मैं ज़ेंड स्टूडियो प्रोफाइलर को पसंद करता हूं, लेकिन यह तब तक का सबसे अच्छा विकल्प नहीं हो सकता है जब तक आप पहले से ही ज़ेंड प्लेटफ़ॉर्म स्टैक का लाभ उठा रहे हों। हालांकि, मेरे अनुभव में यह बहुत दुर्लभ है कि PHP स्वयं धीमी प्रदर्शन का मूल कारण है। प्रायः, एक कोड प्रोफाइलर आपको अधिक सटीकता के साथ निर्धारित करने में मदद कर सकता है जो डीबी प्रश्नों को दोषी ठहराते हैं।

+0

आप भी सही हैं। मैंने वास्तव में चीजों के डेटाबेस अंत को देखा और वे ठीक लग रहे थे। अपाचे एक मुद्दा था, लेकिन यह तय किया गया था। मैं एक ओप-कोड कैश प्रोग्राम भी इंस्टॉल करूंगा। लेकिन अभी भी आपके ऐप को प्रोफाइल करना सामान्य प्रोग्रामिंग को सुधारने में मदद करता है। – Rushi

2

इसके अलावा आप APD (उन्नत PHP डीबगर) का उपयोग कर सकते हैं।

इसे काम करना काफी आसान है।

$ php apd-test.php 

$ pprofp -l pprof.SOME_PID 

Trace for /Users/martin/develop/php/apd-test/apd-test.php 
Total Elapsed Time = 0.12 
Total System Time = 0.01 
Total User Time = 0.07 


     Real   User  System    secs/ cumm 
%Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name 
-------------------------------------------------------------------------------------- 
71.3 0.06 0.06 0.05 0.05 0.01 0.01 10000 0.0000 0.0000   0 in_array 
27.3 0.02 0.09 0.02 0.07 0.00 0.01 10000 0.0000 0.0000   0 my_test_function 
1.5 0.03 0.03 0.00 0.00 0.00 0.00  1 0.0000 0.0000   0 apd_set_pprof_trace 
0.0 0.00 0.12 0.00 0.07 0.00 0.01  1 0.0000 0.0000   0 main 

वहाँ एक अच्छा ट्यूटोरियल कैसे APD संकलन और इसके साथ की रूपरेखा बनाने के लिए है: http://martinsikora.com/compiling-apd-for-php-54

+0

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। –

+0

उत्तर "एपीडी का प्रयोग करें" है। उन लोगों के लिए अतिरिक्त लिंक है, जिन्हें इंस्टॉलेशन के साथ समस्याएं हैं। –

0

अपने सर्वर अपमानित करता है, तो प्रदर्शन तुम भी HA Proxy या किसी अन्य लोड संतुलन समाधान देख सकते हैं का कारण है आवेदन धीमी प्रसंस्करण। सर्वर।

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