से धीमी प्रतिक्रिया मैं विंडोज पर सी ++ से 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 पहले का समय समाप्त होना चाहिए था?
क्या यह केवल कुछ निश्चित, विशिष्ट पते के लिए क्वेरी है जो धीमे हैं? – SimonJ
फ़ाइलमोन की तरह कुछ चलाने का प्रयास करें और सुनिश्चित करें कि यह कुछ सी नहीं कर रहा है जैसे कि c: \ windows \ system32 \ drivers \ etc \ services' और 'c: \ windows \ system32 \ drivers \ etc \ hosts' को पढ़ना और पार्स करना वह समय जिसे आप 'getaddrinfo() 'कहते हैं। –
यह निश्चित रूप से कम से कम प्रत्येक कॉल पर मेजबान फ़ाइल को पार्स करेगा, लेकिन इसे मिलीसेकंड या दो से अधिक नहीं लेना चाहिए। –