2013-06-11 6 views
5

पोस्टग्रेस सर्वर लॉग को देखते हुए, मुझे लगता है कि एक ही पोस्टग्रेस सर्वर पर सटीक वही क्वेरी एक लिनक्स क्लाइंट या विंडोज क्लाइंट से आने पर काफी लंबा (लगभग 10x लंबा) लेती है ।पोस्टग्रेस्क्ल: एक अलग क्लाइंट में क्वेरी 10x धीमी

प्रश्न एक Django एप्लिकेशन से 4 जीबी रैम और 8 जीबी रैम के साथ एक विंडोज मशीन पर चल रहे एक Django अनुप्रयोग से आते हैं। दोनों pyhon वातावरण psycopg2 पुस्तकालय संस्करण 2.4.4 एक ही postgres सर्वर से अनुरोध भेजने के लिए की है।

नीचे postgres सर्वर लॉग

खिड़कियों क्वेरी (समय) के साथ कर रहे हैं:

2013-06-11 12:12:19 EEST [unknown] 10.1.3.152(56895) mferreiraLOG: duration: 3207.195 ms statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61 AND "revisions"."repo" = 'Trunk') 

linux क्वेरी (बहुत लंबे समय तक):

2013-06-11 12:12:56 EEST [unknown] 10.1.3.154(35325) mferreiraLOG: duration: 22191.773 ms statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61 AND "revisions"."repo" = 'Trunk') 

psql से सीधे क्रियान्वित (सबसे तेज़):

2013-06-11 12:19:06 EEST psql [local] mferreiraLOG: duration: 1332.902 ms statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61 AND "revisions"."repo" = 'Trunk'); 

अन्य प्रश्नों जो डेटाबेस से इतने सारे आइटम लोड करने की जरूरत नहीं है लगभग एक ही प्रदर्शन कर रहे हैं। इस प्रश्न के लिए ग्राहकों के बीच

क्यों इतना बड़ा समय मतभेद?

नोट: ट्रांसमिशन समय प्रासंगिक नहीं हैं, क्योंकि सभी मशीनें एक ही इंट्रानेट में हैं। इसके अलावा, धीमी बार देखा जाता है जब ग्राहक के अनुरोध के एक ही Linux मशीन जहां PostgreSQL सर्वर चल रहा है से आता है।

नोट 2: साइकोप 2 विंडोज और लिनक्स में अलग-अलग स्थापित किया गया था। जबकि विंडोज में मैं एक पहले से पैक द्विआधारी से यह स्थापित किया है, लिनक्स में मैं भाग गया जो एक PostgreSQL सिस्टम पर उपलब्ध स्थापना पर निर्भर करता है 'पिप psycopg2 स्थापित'। क्या इसका परिणाम क्लाइंट साइड पर प्रदर्शन को प्रभावित करने वाले पैरामीटर के लिए अलग-अलग मानों में हो सकता है (उदा। 'Work_mem' पैरामीटर)?

+0

अंधेरे में बस एक शॉट: शायद यह एक PostgreSQL आंतरिक कैशिंग मुद्दा है? क्या आपने लिनक्स से कई बार SELECT कथन सबमिट करने का प्रयास किया था, और विंडोज़ से कई बार भी? मैं कल्पना करता हूं कि औसत समय वही होना चाहिए। – mawimawi

+0

माविमावी के लिए: कोई भी समय लगातार नहीं है, मैंने इसे डिबग करना शुरू कर दिया क्योंकि मेरा उत्पादन django ऐप विकास (विंडोज़) मशीन की तुलना में बहुत धीमी थी। यदि आप कई बार चलाते हैं तो समय समान होते हैं। – mpaf

+1

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

उत्तर

7

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

बड़ी मात्रा में डेटा पुनर्प्राप्त करने वाले प्रश्नों के लिए, समय अंतर महत्वपूर्ण है। इसके अलावा Debian/Ubuntu जैसे कुछ लिनक्स वितरण एसएसएल डिफ़ॉल्ट रूप से चालू, यहां तक ​​कि स्थानीय होस्ट के माध्यम से TCP कनेक्शन के लिए की है।

उदाहरण के तौर पर, गर्म कैश के साथ कुल 64 एमबाइट वजन वाली 1,5 एम पंक्तियों को पुनर्प्राप्त करने वाली क्वेरी के लिए समय अंतर होता है।

एन्क्रिप्शन बिना

:

 
$ psql "host=localhost dbname=mlists sslmode=disable" 
Password: 
psql (9.1.7, server 9.1.9) 
Type "help" for help. 

mlists=> \timing 
Timing is on. 
mlists=> \o /dev/null 
mlists=> select subject from mail; 
Time: 1672.258 ms 

एन्क्रिप्शन के साथ:

 
$ psql "host=localhost dbname=mlists" 
Password: 
psql (9.1.7, server 9.1.9) 
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) 
Type "help" for help. 

mlists=> \o /dev/null 
mlists=> \timing 
Timing is on. 
mlists=> select subject from mail; 
Time: 7017.935 ms 

इसे बंद करने के विश्व स्तर पर, एक postgresql.conf में SSL=off सेट कर सकते हैं।

ग्राहक पतों की विशिष्ट श्रेणियों के लिए इसे बंद करने, प्रविष्टियों अधिक सामान्य host प्रविष्टियों से पहले पहले क्षेत्र में hostnossl साथ pg_hba.conf में जोड़ें।

क्लाइंट-साइड को बंद करने के लिए, यह इस बात पर निर्भर करता है कि ड्राइवर sslmode कनेक्शन पैरामीटर का खुलासा कैसे करता है। यदि ऐसा नहीं होता है, तो PGSSLMODE पर्यावरण चर का उपयोग किया जा सकता है यदि ड्राइवर libpq के शीर्ष पर लागू किया गया है।

यूनिक्स डोमेन सॉकेट (local) के माध्यम से कनेक्शन के लिए, एसएसएल का कभी भी उनके साथ उपयोग नहीं किया जाता है।

+0

महान जवाब! मैंने परीक्षण किया और आप सही थे, एसएसएल प्रदर्शन को प्रभावित कर रहा था। वास्तव में विंडोज और लिनक्स दोनों के लिए, जब मैंने postgresql.conf में SSL को अक्षम कर दिया, तो विंडोज़ समय 3 से 1.7 तक और लिनक्स का समय 22 से 1.5 तक नीचे चला गया! तो ऐसा लगता है कि दोनों एसएसएल के माध्यम से जा रहे थे लेकिन लिनक्स इससे ज्यादा प्रभावित हुआ? आपके उत्तर, अच्छी अंतर्दृष्टि के लिए बहुत बहुत धन्यवाद। – mpaf

+0

@mpaf: खुशी है कि यह मदद करता है। लिनक्स के अधिक प्रभावित होने के कारण, बिना किसी जांच के व्याख्या करना मुश्किल है। ऐसा हो सकता है कि लिनक्स पर एक मजबूत सिफर का चयन किया जाए, लेकिन यह सिर्फ अटकलें है। –

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