मैं एक एसिंक्रोनस लॉगिंग फ्रेमवर्क लिख रहा था, जहां मेरे पास एकाधिक थ्रेड डेटा डंपिंग था। मैंने बूस्ट एएसओ के आसपास खेलना शुरू कर दिया क्योंकि इसने क्रमबद्ध करने और क्रमबद्ध करने के कुछ आसान तरीकों की पेशकश की। चूंकि मैं एक नौसिखिया हूं, मैंने अपने डिजाइन को थ्रेड से सुरक्षित (boost::mutex
और boost:condition_variable
) सर्कुलर बाउंड_बफर (जो वास्तव में वेक्टर था) के साथ शुरू किया।एएसआईओ IO_SERVICE कार्यान्वयन को बढ़ावा दें?
मैंने प्रदर्शन को मापने के लिए एक छोटा सा सरल बेंचमार्क लिखा था। बेंचमार्क केवल एक धागा है जो दस लाख संदेशों को लॉगिंग करता है (इसे बफर में दबा रहा है), और मेरा वर्कर थ्रेड कतार से संदेशों को फ़ाइल/कंसोल/लॉगर्स की सूची में लॉग इन करने के लिए ले जाएगा। (पीएस म्यूटेक्स और सीवी का उपयोग सही था, और संदेशों को पॉइंटर्स चारों ओर ले जाया जा रहा था, इसलिए उस परिप्रेक्ष्य से सब कुछ ठीक/कुशल था)।
जब मैं बजाय boost::asio::io_service
का उपयोग करने और और किसी एकल थ्रेड run()
क्रियान्वित प्रदर्शन वास्तव में सुधार होने के लिए मेरी कार्यान्वयन बदल (वास्तव में यह वास्तव में अच्छी तरह से बढ़ रही है के रूप में अपने प्रारंभिक साधारण मॉडल में अपमानजनक प्रदर्शन का विरोध करने के संदेशों की संख्या लॉग किया जा रहा पर बढ़ाया)
यहां कुछ प्रश्न हैं जिन्हें मैं साफ़ करना चाहता हूं।
प्रदर्शन में सुधार क्यों? (मैंने सोचा था कि
boost::asio::io_service
आंतरिक कार्यान्वयन में हैंडलरों के लिए थ्रेड सुरक्षित कतार है, जो इसे अपने प्रारंभिक सरल धागे सुरक्षित कतार डिजाइन से कहीं अधिक कुशल बनाता है)। कृपया ध्यान दें कि मेरे डिजाइन की अच्छी तरह से समीक्षा की गई थी और इस तरह की कोई गलती नहीं थी (कंकाल कोड साबित उदाहरणों पर आधारित था), क्या कोईio_service
के कार्यान्वयन के आंतरिक विवरणों पर अधिक प्रकाश डाल सकता है।दूसरा दिलचस्प अवलोकन यह था कि धागे बढ़ने पर, मेरे शुरुआती कार्यान्वयन प्रदर्शन में सुधार हुआ, लेकिन क्रमबद्धता/क्रम को खोने की लागत पर, लेकिन प्रदर्शन :: एएसओ (मुझे लगता है कि ऐसा इसलिए है क्योंकि मेरे हैंडलर बहुत सरल कार्य कर रहे थे और संदर्भ स्विचिंग ओवरहेड खराब हो रहा था, मैं अधिक जटिल कार्य डालने और बाद में अपने अवलोकन पोस्ट करने की कोशिश करूंगा)।
मैं वास्तव में जानना चाहता हूं कि
boost::asio
सिर्फ आई/ओ और नेटवर्क ऑपरेशंस के लिए है या थ्रेड पूल के माध्यम से समवर्ती कार्य (समांतर) करने के लिए इसका उपयोग करने का मेरा उपयोग एक अच्छा डिजाइन दृष्टिकोण है।io_service
ऑब्जेक्ट का अर्थ केवल आई/ओ ऑब्जेक्ट्स (जैसा कि प्रलेखन में लिखा गया है) के लिए उपयोग किया जाना था, लेकिन मुझे इसे क्रमबद्ध तरीके से समवर्ती कार्यों (केवल आई/ओ या नेटवर्किंग से संबंधित) को हल करने में मेरी मदद करने का एक दिलचस्प तरीका नहीं मिला (कभी-कभी लागू तारों का उपयोग कर आदेश)। मैं बढ़ावा देने के लिए नया हूं, और वास्तव में उत्सुक हूं कि मूल मॉडल ने प्रदर्शन/स्केल के साथ-साथ जब मैंने एएसओ को बढ़ावा दिया था।
परिणाम: (दोनों में मैं सिर्फ 1 कार्यकर्ता धागा था)
- 1000 कार्य: दोनों ही मामलों में 10 माइक्रो सेकंड/कार्य
- 10000 कार्य: 80 माइक्रो सेकंड (घिरा बफर), को बढ़ावा देने में 10 माइक्रो सेकंड asio
- 100000 कार्य: 250 माइक्रो सेकंड (bounde बफर), को बढ़ावा देने में 10 माइक्रो सेकंड asio
यह दिलचस्प k होगा अब io_service
हैंडलर के लिए थ्रेड सुरक्षित कतार में थ्रेड सुरक्षित समस्या को कैसे हल करता है (मैंने हमेशा कार्यान्वयन के कुछ स्तर पर सोचा कि उन्हें ताले और सी.वी. का उपयोग करना होगा)।
मैंने अच्छी सफलता के लिए अन्य प्रकार के एसिंक्रोनस कार्यों (केवल नेटवर्क IO नहीं) के प्रबंधन के लिए 'boost :: asio' का उपयोग किया है। – Chad
मुझे पता है कि यह एक पुराना सवाल है लेकिन यह हो सकता है कि (विंडोज़ पर), एएसआईओ आईओ पूरा करने वाले बंदरगाहों का उपयोग करता है और इसके परिणामस्वरूप कुल सिस्टम कॉल कम हो सकती है। – Pete