प्रतिनिधि इंटरव्यू विषय

कोडिंग इंटरव्यू: आप io_uring multishot accept का सुरक्षित रूप से उपयोग कैसे करेंगे?

कोडिंगकठिन
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

एक Linux TCP गेटवे प्रति कनेक्शन एक accept अनुरोध सबमिट करने में महत्वपूर्ण CPU खर्च करता है। आप io_uring multishot accept का मूल्यांकन कैसे करेंगे, कंप्लीशन (completions) को सुरक्षित रूप से प्रोसेस कैसे करेंगे, और multishot अनुरोध समाप्त होने पर कनेक्शन ड्रॉप होने से कैसे बचेंगे?

प्रॉम्प्ट और दायरा

liburing एक multishot accept ऑपरेशन प्रदान करता है जो एक सबमिशन से कई कंप्लीशन कतार प्रविष्टियां (CQEs) उत्पन्न कर सकता है। अनुरोध किसी एरर के बाद या multishot फ़्लैग अनुपस्थित होने पर कंप्लीशन उत्पन्न करना बंद कर सकता है। मुख्य कौशल एसिंक्रोनस सिस्टम प्रोग्रामिंग है और यह coding से संबंधित है।

इंटरव्यूअर्स क्या आंकते हैं

मजबूत उत्तर IORING_CQE_F_MORE, CQE स्वामित्व, सबमिशन और कंप्लीशन कतार बैकप्रेशर, accept एरर, रद्दीकरण और रीआर्मिंग की व्याख्या करते हैं। वे किसी फीचर को मान लेने के बजाय कर्नेल समर्थन की जांच (probe) करते हैं, बफ़र्स या उपयोगकर्ता डेटा को समय से पहले पुन: उपयोग करने से बचते हैं, और पारंपरिक नॉन-ब्लॉकिंग accept लूप के साथ इस डिज़ाइन की तुलना करते हैं।

पहले स्पष्ट करने योग्य प्रश्न

  • कौन से कर्नेल और liburing वर्शन तैनात हैं?
  • क्या लिसनिंग सॉकेट वर्कर्स के बीच साझा किया गया है या किसी एक रिंग के स्वामित्व में है?
  • किस कनेक्शन दर, बर्स्ट आकार और फ़ाइल-डिस्क्रिप्टर बजट की अपेक्षा है?
  • स्वीकृत (accepted) सॉकेट्स को प्रोटोकॉल वर्कर्स को कैसे सौंपा जाता है?
  • जब multishot अनुरोध समाप्त हो जाता है या CQ भर जाता है तो क्या होना चाहिए?
  • क्या एक पोर्टेबल या गैर-io_uring फॉलबैक की आवश्यकता है?

30-सेकंड उत्तर ढांचा

"मैं समर्थन की जांच करूंगा, एक multishot accept सबमिट करूंगा, और प्रत्येक CQE को एक स्वतंत्र स्वीकृत सॉकेट के रूप में प्रोसेस करूंगा। मैं IORING_CQE_F_MORE का निरीक्षण करूंगा; जब यह अनुपस्थित होता है, तो अनुरोध अब आर्म नहीं रहता है और अंतिम परिणाम को संभालने के बाद इसे फिर से सबमिट किया जाना चाहिए। लूप को सीमित CQ गहराई, स्पष्ट EMFILE और क्षणिक-त्रुटि हैंडलिंग, सॉकेट हैंडऑफ़ स्वामित्व और एक फॉलबैक accept लूप की आवश्यकता होती है। मैं CPU, प्रति सेकंड accepts, टेल लेटेंसी, ड्रॉप्स, CQ ओवरफ़्लो और रीआर्म गैप्स का बेंचमार्क करूंगा।"

चरण-दर-चरण उत्तर

चरण 1: जांचें और कॉन्फ़िगर करें

multishot accept ऑपरेशन और आवश्यक फ़्लैग के लिए रिंग प्रोब या प्रलेखित क्षमता जांच का उपयोग करें। बर्स्ट और हैंडऑफ़ दरों से कतार आकार निर्धारित करें, close-on-exec और नॉन-ब्लॉकिंग व्यवहार कॉन्फ़िगर करें, और तय करें कि क्या डायरेक्ट डिस्क्रिप्टर अपनी प्रबंधन लागत के लायक हैं।

चरण 2: एक लंबे समय तक चलने वाला अनुरोध सबमिट करें

स्थिर उपयोगकर्ता डेटा के साथ multishot accept अनुरोध तैयार करें जो लिसनिंग सॉकेट और जेनरेशन की पहचान करता है। यह न मानें कि एक SQE एक CQE उत्पन्न करता है। अनुरोध के लाइफसाइकिल को इवेंट-लूप स्थिति में रखें और संबंधित स्थिति को तब तक मुक्त करने से बचें जब तक कि इसका अंतिम कंप्लीशन उपभोग न हो जाए।

चरण 3: प्रत्येक कंप्लीशन का उपभोग करें

प्रत्येक CQE के लिए, एक स्वीकृत डिस्क्रिप्टर या नकारात्मक त्रुटि के लिए परिणाम की जांच करें। एक सफल सॉकेट का स्वामित्व प्रोटोकॉल वर्कर को ठीक एक बार स्थानांतरित करें। IORING_CQE_F_MORE का निरीक्षण करें; यदि यह क्लियर है, तो अनुरोध को निष्क्रिय के रूप में चिह्नित करें, भले ही वर्तमान CQE सफल रहा हो।

चरण 4: रीआर्म करें और बैकप्रेशर लागू करें

उपलब्ध CQEs को खाली (drain) करने के बाद, अनुरोध निष्क्रिय होने और सिस्टम द्वारा अधिक कार्य स्वीकार करने में सक्षम होने पर पुनः सबमिट करें। हैंडऑफ़ कतारों को सीमित करें, फ़ाइल-डिस्क्रिप्टर दबाव के तहत नए काम को रोकें या अस्वीकार करें, और बिजी लूप के बिना EMFILE, ENFILE, और क्षणिक नेटवर्क त्रुटियों को संभालें।

चरण 5: शटडाउन करें और बेंचमार्क करें

शटडाउन के दौरान अनुरोध को रद्द या बंद करें, CQEs को ड्रेन करें, और बिना स्वामित्व वाले स्वीकृत सॉकेट्स को बंद करें। समान कोर, बैकलॉग, कनेक्शन मिश्रण और वर्कर क्षमता के तहत multishot और पारंपरिक accept की तुलना करें। केवल सिस्कॉल (syscall) गणना ही नहीं, बल्कि रीआर्म गैप्स और ड्रॉप या अस्वीकृत कनेक्शनों को मापें।

मॉडल उत्तर

"Multishot accept सबमिशन ओवरहेड को कम करता है, लेकिन यह सीमित अनुरोध जीवनकाल के साथ CQEs की एक स्ट्रीम है। मैं समर्थन की जांच करूंगा, स्थिर उपयोगकर्ता डेटा सबमिट करूंगा, प्रत्येक स्वीकृत डिस्क्रिप्टर का एक बार उपभोग करूंगा, और प्रत्येक कंप्लीशन पर IORING_CQE_F_MORE का निरीक्षण करूंगा। एक बार फ़्लैग गायब हो जाने के बाद, मैं अनुरोध को निष्क्रिय के रूप में चिह्नित करूंगा और अंतिम परिणाम को संभालने के बाद इसे रीआर्म करूंगा। कतार की गहराई, हैंडऑफ़ बैकप्रेशर, EMFILE हैंडलिंग, शटडाउन ड्रेनिंग, और एक पारंपरिक accept फॉलबैक शुद्धता का हिस्सा हैं। बेंचमार्क में रीआर्म गैप्स, ड्रॉप्स, टेल लेटेंसी और CPU शामिल होने चाहिए।"

सामान्य गलतियाँ

  • अनुरोध को स्थायी मानना → किसी त्रुटि के बाद या MORE के बिना कंप्लीशन बंद हो जाते हैं → स्पष्ट रूप से रीआर्म करें।
  • एक CQE को संपूर्ण परिणाम मानना → बाद के स्वीकृत सॉकेट छूट जाते हैं → सभी CQEs को ड्रेन करें।
  • उपयोगकर्ता डेटा को समय से पहले मुक्त करना → बाद के कंप्लीशन अमान्य स्थिति का उपयोग करते हैं → अंतिम कंप्लीशन तक स्थिति बनाए रखें।
  • नकारात्मक परिणामों की अनदेखी करना → लूप बिना रुके घूमता रहता है या संसाधन की कमी को छुपाता है → त्रुटियों को वर्गीकृत करें और बैक ऑफ करें।
  • असीमित हैंडऑफ़ कतार → स्वीकृत डिस्क्रिप्टर प्रक्रिया को समाप्त कर देते हैं → डिस्क्रिप्टर और कतार बजट लागू करें।
  • केवल सिस्कॉल का बेंचमार्क बनाना → रीआर्म गैप्स और ड्रॉप्स छिपे रहते हैं → एंड-टू-एंड कनेक्शन परिणामों को मापें।

अनुवर्ती प्रश्न

अनुवर्ती 1: IORING_CQE_F_MORE का क्या अर्थ है?

यह इंगित करता है कि multishot अनुरोध से और अधिक CQEs उत्पन्न होने की उम्मीद है। जब यह अनुपस्थित होता है, तो अनुरोध समाप्त हो जाता है और एप्लिकेशन को यह नहीं मानना चाहिए कि कोई अन्य कंप्लीशन आएगा।

अनुवर्ती 2: क्या एक सफल CQE अंतिम हो सकता है?

हाँ। एक CQE में MORE फ़्लैग की कमी के बावजूद एक वैध स्वीकृत डिस्क्रिप्टर हो सकता है। सॉकेट को प्रोसेस करें, फिर अनुरोध को रीआर्म करें।

अनुवर्ती 3: आप डिस्क्रिप्टर समाप्ति (exhaustion) से कैसे बचते हैं?

प्रोटोकॉल हैंडऑफ़ को सीमित करें, RLIMIT_NOFILE की निगरानी करें, EMFILE और ENFILE को संभालें, और क्षमता वापस आने तक accept करना बंद करें या लोड कम (shed load) करें।

अनुवर्ती 4: फॉलबैक क्यों रखें?

कर्नेल, liburing, कंटेनर, या नीति बाधाएं io_uring को रोक सकती हैं। एक नॉन-ब्लॉकिंग accept लूप उपलब्धता को बनाए रखता है और प्रदर्शन तुलना के लिए एक शुद्धता आधार रेखा (baseline) देता है।

सार्वजनिक स्रोत

संबंधित प्रश्न

संबंधित इंटरव्यू टूल

कोडिंग प्रॉम्प्ट के लिए स्क्रीनशॉट का उपयोग करें

समस्या को कैप्चर करें, फिर क्रम से प्रतिबंधों (constraints), समाधान, कोड, एज केस और जटिलता पर काम करें।

टूल देखें