2012-07-11 12 views
6

सटीक उसी कोड का उपयोग करते हुए, सर्वर पर लॉगर विधि (जैसे logger.debug) में प्रत्येक कॉल को लगभग 50ms लगता है, जबकि देव मशीन पर यह 1ms से कम है। लॉगजर थोड़ी-थोड़ी स्वरूपण के साथ फ़ाइलों को आउटपुट कर रहे हैं।लिथॉन लॉगिंग लिनक्स सर्वर पर बहुत धीमी है ... लेकिन लिनक्स विकास वीएम पर तेजी से?

लॉगिंग के साथ मंदी के अलावा, सर्वर दो गुना तेज है।

मैं विंडोज 7 पर वीएमवेयर के अंदर चल रहे उबंटू 11.04 (जीनोम) पर विकास कर रहा हूं। सर्वर उबंटू सर्वर 11.04 (कोई जीयूआई, शुद्ध कंसोल) नहीं चला रहा है। लॉगिंग मॉड्यूल आधिकारिक "लॉगिंग" मॉड्यूल ("आयात लॉगिंग ... लॉगजर = logging.getLogger ('mylogger')") है।

कोई विचार यह क्या हो सकता है? यह बेहद निराशाजनक है!

किसी भी मदद के लिए धन्यवाद!

संपादित करें: दोनों मशीनें उनके संस्करण के लिए "पायथन 2.7.1+" लौटाती हैं। दोनों मशीनें 64-बिट उबंटू चल रही हैं।

हार्ड ड्राइव कॉन्फ़िगरेशन सर्वर सॉफ़्टवेयर RAID-1 है, जबकि dev कंप्यूटर में केवल एक ड्राइव है।

EDIT2: स्वीकार्य फैबियन का जवाब पूरी तरह से था, हालांकि यह समस्या को हल नहीं करता था।

समाधान: कंसोल, अवधि को लिखना बेहद धीमा है। मैंने फ़ाइल को एक्स लिखने का परीक्षण किया, और कंसोल में एक्स लिखना, और यह कंसोल के लिए लगभग 100x धीमी थी। मुझे नहीं पता कि यह क्यों होगा, लेकिन मैं बस एक और कंप्यूटर से एसएसएच के साथ चल रहा था और सबकुछ हल हो गया था।

+0

क्या आप दोनों पायथन के –

+0

के संस्करण पोस्ट कर सकते हैं आप यह भी जांच सकते हैं कि दोनों मशीनों पर सटीक उसी लॉगर्स का उपयोग किया जा रहा है। ['Logging_tree'] (http://pypi.python.org/pypi/logging_tree/1.1) पैकेज वहां उपयोगी होगा। –

+1

क्या आप stdout पर लॉग इन करने का प्रयास कर सकते हैं और फ़ाइल में नहीं और जांच सकते हैं कि गति परिवर्तन क्या है। हार्ड ड्राइव के साथ एक समस्या हो सकती है। –

उत्तर

6

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

इसके अलावा, आपके द्वारा पता लगा सकते हैं कि वास्तव में क्या हो रहा है है:

पहले, प्रवेश परीक्षण करने के लिए एक मेगावाट लिखें। आपको अपने वास्तविक कोड को उसका आधार चाहिए, और एक समान तरीके से प्रवेश करने का उपयोग, लेकिन यहाँ एक छोटा सा उदाहरण है:

import logging 

logging.basicConfig(filename="test.log", level=logging.DEBUG) 
logger = logging.getLogger("testlogger") 

for i in range(0, 1000000): 
    logger.info("iteration: %d", i) 

फिर दोनों अपने विकास और उत्पादन मशीन में cProfile तहत स्क्रिप्ट चलाने। अपने समस्या के मामले में उसी फाइल सिस्टम पर लॉग इन करना सुनिश्चित करें, अन्यथा परिणाम लागू नहीं होंगे।

57000501 function calls in 137.072 seconds 

Ordered by: standard name 

ncalls tottime percall cumtime percall filename:lineno(function) 
    1 0.000 0.000 0.000 0.000 UserDict.py:4(__init__) 
    1 0.000 0.000 0.000 0.000 __init__.py:1044(_fixupParents) 
    1 0.000 0.000 0.000 0.000 __init__.py:1085(Logger) 
    2 0.000 0.000 0.000 0.000 __init__.py:1100(__init__) 
    1 0.000 0.000 0.000 0.000 __init__.py:1112(setLevel) 
..... ..... ..... ..... ..... ............................... 

यह तुम क्या उत्पादन मशीन पर सुस्ती खड़ी कर रहा है की एक विचार देना चाहिए:

python -m cProfile testlogging.py 

आप उत्पादन है कि इस तरह दिखता है मिल जाएगा।हालात विशेष रूप से देखने के लिए:

  • {method 'write' of 'file' objects} और {method 'flush' of 'file' objects} पढ़ने लाइनों के लिए देखो। यह आपको बताएगा कि पाइथन ने फ़ाइलों को लिखने में कितना समय बिताया है और डेटा को डिस्क पर फ्लश कर दिया है - इस मामले में, लॉग फ़ाइल। क्या दो मशीनों के बीच महत्वपूर्ण अंतर हैं? यदि ऐसा है, तो यह निश्चित रूप से आईओ (डिस्क) गति में एक अंतर है। आपको सर्वर के डिस्क सेटअप पर एक नज़र डालना चाहिए और देखें कि बेहतर डिस्क प्रदर्शन प्राप्त करने के लिए आप कुछ भी कर सकते हैं या नहीं।
  • उन लाइनों की तलाश करें जहां पहले percall कॉलम विशेष रूप से बड़ा है। यह कॉलम उस फ़ंक्शन में कॉल की संख्या से विभाजित फ़ंक्शन में बिताए गए कुल समय है। दो मशीनों के बीच तुलना करें, और आप पाते हैं कि अंतर क्या हो रहा है।
  • उन लाइनों की तलाश करें जहां tottime कॉलम विशेष रूप से बड़ा है। यह कॉलम फ़ंक्शन में व्यतीत कुल समय है। दोबारा, दो मशीनों के बीच तुलना करें, और आपको गति अंतर के कुछ कारण मिल सकते हैं।

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

बस एक आखिरी नोट: प्रदर्शन परीक्षण, प्रोग्रामिंग, कला, विज्ञान और इंजीनियरिंग का मिश्रण है, और जब पैटर्न और सलाह आप अनुसरण कर सकते हैं, तो हर मामले को क्रैक करने के लिए कुछ आविष्कार की आवश्यकता होती है। तो चीजों को आजमाएं, सुनिश्चित करें कि आप खुद को मूर्ख मत बनाओ, और मज़े करें! सौभाग्य!

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