2009-11-22 16 views
8

से धीमी प्रतिक्रिया मैं विंडोज पर सी ++ से DNS क्वेरी करने के लिए getaddrinfo का उपयोग कर रहा हूं। मैं विंडोज एपीआई DnsQuery का उपयोग करता था और यह ठीक काम करता था, लेकिन जब मैं अपने सॉफ़्टवेयर में आईपीवी 6 समर्थन जोड़ता हूं तो मैंने getaddrinfo पर स्विच किया। तब से, मैंने निम्नलिखित देखा है:getaddrinfo

मेरी समस्या यह है कि कुछ बार getaddrinfo को पूरा करने में बहुत लंबा समय लगता है। Getaddrinfo की सामान्य प्रतिक्रिया केवल कुछ मिलीसेकंड लेती है, लेकिन 10000 में से लगभग 1 बार, कुछ मामलों में लगभग 15 सेकंड लगते हैं, लेकिन कई मामलों में कई मिनट लगते हैं।

मैं सर्वर पर Wireshark चलाने के लिए और मेरी अनुप्रयोगों डीबग लॉग का विश्लेषण किया और निम्न देखें किया है:

  • मैं समारोह getaddrinfo कहते हैं।
  • 15 सेकंड बाद, मेरी मशीन DNS सर्वर से पूछताछ करती है।
  • बाद में कुछ मिलीसेकंड, मुझे DNS सर्वर से प्रतिक्रिया मिलती है।

अजीब बात यह है कि वास्तविक DNS क्वेरी केवल एक सेकंड का दसवां हिस्सा लेती है, लेकिन वास्तव में getaddrinfo वास्तव में निष्पादित होता है।

समस्या कई उपयोगकर्ताओं द्वारा रिपोर्ट की गई है, इसलिए यह मेरी मशीन के लिए कुछ विशिष्ट नहीं है।

तो getaddrinfo DNS सर्वर से संपर्क करने से अधिक क्या करता है?

संपादित करें:

  • समस्या कई पतों के साथ आ गई है। अगर मैं इन पतों का उपयोग कर समस्या को पुन: पेश करने का प्रयास करता हूं, तो समस्या नहीं होती है।
  • मैंने कुछ बेवकूफ किया है। प्रत्येक DNS क्वेरी पर, आदि/सेवाओं को पार्स किया जाता है। हालांकि, यह कई मिनटों में देरी की व्याख्या नहीं करता है। (धन्यवाद D.Shawley)

DNS संपादन अपने सॉफ़्टवेयर द्वारा किए गए प्रश्नों के 2

  • एक प्रकार एंटी-स्पैम DNSBL प्रश्नों है। एक उपयोगकर्ता से लॉग ने मुझे दिखाया कि ip.address1.example.com के लिए लुकअप हमेशा 2039 सेकेंड लग रहा था, जबकि another.ip.address.example.com के लिए लुकअप हमेशा 1324 सेकेंड लेता था। उसके बाद, उन पते के लिए लुकअप ठीक थे। पहले मैंने सोचा था कि DNS बीएल लेखकों ने अपनी तरफ से कुछ प्रकार का टाइमआउट लगाया था। लेकिन अगर यह मूल समस्या थी, तो getaddrinfo पहले का समय समाप्त होना चाहिए था?
+0

क्या यह केवल कुछ निश्चित, विशिष्ट पते के लिए क्वेरी है जो धीमे हैं? – SimonJ

+0

फ़ाइलमोन की तरह कुछ चलाने का प्रयास करें और सुनिश्चित करें कि यह कुछ सी नहीं कर रहा है जैसे कि c: \ windows \ system32 \ drivers \ etc \ services' और 'c: \ windows \ system32 \ drivers \ etc \ hosts' को पढ़ना और पार्स करना वह समय जिसे आप 'getaddrinfo() 'कहते हैं। –

+1

यह निश्चित रूप से कम से कम प्रत्येक कॉल पर मेजबान फ़ाइल को पार्स करेगा, लेकिन इसे मिलीसेकंड या दो से अधिक नहीं लेना चाहिए। –

उत्तर

3

विंडोज़ में एक स्थानीय डिमन है जो DNS कैशिंग करता है। Getaddrinfo() पर आपका कॉल उस डिमन पर जा रहा है, जो संभावित रूप से आपके DNS सर्वर पर क्वेरी सबमिट करने से पहले अपने कैश की जांच कर रहा है।

कैश को अक्षम करने के बारे में अधिक जानकारी के लिए Windows Knowledge Base article 318803 देखें।

[संपादित]

यह है जैसे कि अपने विंडोज सर्वर 2003 उदाहरण IPv6 के लिए सही ढंग से कॉन्फ़िगर नहीं है मेरे लिए लग रहा है। एक बार आईपीवी 6 लुकअप टाइमआउट के बाद, यह आईपीवी 4 पर वापस आ जाएगा।ज्ञानकोष लेख कि मदद कर सकता है शामिल हैं:

दुर्भाग्य से, मैं किसी भी Windows सर्वर के लिए पहुँच नहीं है, इसलिए मैं परीक्षण नहीं कर सकते/दोहराने यह मैं

+2

ठीक है, इस तरह के मेरे सवालों का जवाब। लेकिन उसी कैश का उपयोग DnsQuery द्वारा किया गया था और उस फ़ंक्शन का उपयोग करते समय मैंने कभी समस्या नहीं देखी। मेरा सॉफ़्टवेयर ~ 10 000 स्थानों में तैनात है और यह तब तक नहीं था जब तक मैं getaddrinfo पर स्विच नहीं करता था, बहुत से उपयोगकर्ताओं ने इस समस्या की रिपोर्ट करना शुरू कर दिया था। साथ ही, यह बेतुका प्रतीत होता है कि स्थानीय DNS कैश में एक लुकअप में 15 सेकंड लगेंगे। – Nitramk

+0

कोई यह जांच सकता है कि यह कैश है या नहीं, एक ही कमांड को कई बार जारी करके। मुझे संदेह है कि यह कैश को नहीं देख रहा है और यह समस्या का हिस्सा है। दूसरी समस्या यह है कि यह ipv6 पते की भी तलाश करता है और कुछ कारणों से कुछ सेटअप कुछ लुकअप धीमे होते हैं। – highBandWidth

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