के साथ रॉ सॉकेट पैकेट प्राप्त करना मैं एक कोड लिख रहा हूं, जो सर्वर से प्रत्येक 1ms कच्चे ईथरनेट पैकेट (कोई टीसीपी/यूडीपी) प्राप्त नहीं करता है। प्राप्त प्रत्येक पैकेट के लिए, मेरे आवेदन को 14 कच्चे पैकेट के साथ जवाब देना होगा। यदि सर्वर को प्रत्येक पैकेट के लिए निर्धारित पैकेट भेजने से पहले 14 पैकेट प्राप्त नहीं होते हैं, तो सर्वर अलार्म उठाता है और एप्लिकेशन को तोड़ना पड़ता है। सर्वर-क्लाइंट संचार एक से एक लिंक है।माइक्रोसेकंड स्तर सटीकता
सर्वर एक हार्डवेयर (एफपीजीए) है जो सटीक 1ms अंतराल पर पैकेट उत्पन्न करता है। क्लाइंट एप्लिकेशन 10 जी सौरफ्लेयर एनआईसी के साथ एक लिनक्स (आरएचईएल/सेंटोस 7) मशीन पर चलता है।
मेरे कोड के पहले संस्करण इस
while(1)
{
while(1)
{
numbytes = recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);
if(numbytes > 0)
{
//Some more lines here, to read packet number
break;
}
}
for (i=0;i<14;i++)
{
if (sendto(sockfd,(void *)(sym) , sizeof(sym), 0, NULL, NULL) < 0)
perror("Send failed\n");
}
}
मैं मापने recvfrom
कॉल करने से पहले (clock_gettime
का प्रयोग करके) टाइम स्टांप लेने के द्वारा समय प्राप्त करते हैं और एक के बाद, मैं इन timestamps और प्रिंट के समय मतभेद प्रिंट की तरह है जब भी समय अंतर 900-1100 की स्वीकार्य सीमा से अधिक हो जाता है।
पैकेट प्राप्त उस समय (प्रिंट माइक्रोसेकंड में हैं)
Decode Time : 1234
Decode Time : 762
Decode Time : 1593
Decode Time : 406
Decode Time : 1703
Decode Time : 257
Decode Time : 1493
Decode Time : 514
and so on..
और कभी-कभी डिकोड बार 2000us और आवेदन से अधिक टूट जाएगा इस तरह fluctuating.Something जाता है।
इस स्थिति में, एप्लिकेशन 2 सेकंड से कुछ मिनट के बीच कहीं भी तोड़ देगा।
विकल्प अब तक मेरे द्वारा प्रयास किए गए।
- किसी विशेष पृथक कोर से संबंध स्थापित करना।
SCHED_FIFO
- बढ़ाएँ सॉकेट बफर के साथ अधिकतम करने के लिए
- सेटिंग शेड्यूलिंग प्राथमिकताओं आकार
- सेटिंग नेटवर्क इंटरफेस एक ही कोर जो आवेदन
poll(),select()
कॉल का उपयोगrecvfrom
से अधिक - स्पिनिंग प्रक्रियाओं को आत्मीयता बीच में।
ये सभी विकल्प कोड के प्रारंभिक संस्करण में महत्वपूर्ण सुधार देते हैं। अब आवेदन ~ 1-2 घंटे के लिए चला जाएगा। लेकिन यह अभी भी पर्याप्त नहीं है।
कुछ टिप्पणियों:
- मैं, इन डिकोड समय प्रिंट आ विशाल डंप प्राप्त जब भी मैं Linux मशीन को ssh सत्र जबकि आवेदन चल रहा है (जो बनाता है मुझे अन्य 1G ईथरनेट इंटरफेस से अधिक नेटवर्क संचार लगता है 10 जी ईथरनेट इंटरफेस के साथ हस्तक्षेप पैदा कर रहा है)।
- आवेदन आरएचईएल (लगभग 2-3 घंटे के रन टाइम) में बेहतर प्रदर्शन करता है (लगभग 30 मिनट - 1.5 घंटे के रन टाइम)
- रन टाइम भी विभिन्न हार्डवेयर कॉन्फ़िगरेशन के साथ लिनक्स मशीनों के साथ भिन्न होता है ओएस।
कृपया सुझाव दें कि आवेदन के रन-टाइम में सुधार करने के लिए कोई और तरीका है या नहीं।
अग्रिम धन्यवाद।
प्रसंस्करण समय के अलावा, आपको यह समझने की आवश्यकता है कि असली दुनिया में, नेटवर्क पैकेट डिलीवरी के समय में काफी भिन्न होंगे। यदि आपके पास ठोस नेटवर्क पर ठोस QoS नीतियां हैं, तो आप इसे कुछ हद तक कम कर सकते हैं यदि यह आपके नेटवर्क पर है (इंटरनेट पर यात्रा नहीं करता है), और आप इस ट्रैफ़िक के लिए प्राथमिकता कतार परिभाषित करते हैं। अन्यथा, मैं नेटवर्क पर ऐसे घनिष्ठ समय के साथ कुछ उपयोग करने का प्रयास करने का भी प्रयास नहीं करता। –
यदि आप कर सकते हैं, तो PREEMPT_RT संकलित लिनक्स कर्नेल का उपयोग करने का प्रयास करने के लिए मैं आपको सुझाव दूंगा। – LPs
यह जानना अच्छा होगा, आप क्या हासिल करना चाहते हैं, निश्चित रूप से, इस परिशुद्धता वाले पैकेट भेजना ईथरनेट पर व्यवहार्य नहीं है। मैं आपके पीसी के साथ अपने डेटा और इंटरफेस को संसाधित करने के लिए एक और एफपीजीए रखने का सुझाव दूंगा। – Koshinae