2012-03-20 16 views
7

मैं एक एसिंक्रोनस लॉगिंग फ्रेमवर्क लिख रहा था, जहां मेरे पास एकाधिक थ्रेड डेटा डंपिंग था। मैंने बूस्ट एएसओ के आसपास खेलना शुरू कर दिया क्योंकि इसने क्रमबद्ध करने और क्रमबद्ध करने के कुछ आसान तरीकों की पेशकश की। चूंकि मैं एक नौसिखिया हूं, मैंने अपने डिजाइन को थ्रेड से सुरक्षित (boost::mutex और boost:condition_variable) सर्कुलर बाउंड_बफर (जो वास्तव में वेक्टर था) के साथ शुरू किया।एएसआईओ IO_SERVICE कार्यान्वयन को बढ़ावा दें?

मैंने प्रदर्शन को मापने के लिए एक छोटा सा सरल बेंचमार्क लिखा था। बेंचमार्क केवल एक धागा है जो दस लाख संदेशों को लॉगिंग करता है (इसे बफर में दबा रहा है), और मेरा वर्कर थ्रेड कतार से संदेशों को फ़ाइल/कंसोल/लॉगर्स की सूची में लॉग इन करने के लिए ले जाएगा। (पीएस म्यूटेक्स और सीवी का उपयोग सही था, और संदेशों को पॉइंटर्स चारों ओर ले जाया जा रहा था, इसलिए उस परिप्रेक्ष्य से सब कुछ ठीक/कुशल था)।

जब मैं बजाय boost::asio::io_service का उपयोग करने और और किसी एकल थ्रेड run() क्रियान्वित प्रदर्शन वास्तव में सुधार होने के लिए मेरी कार्यान्वयन बदल (वास्तव में यह वास्तव में अच्छी तरह से बढ़ रही है के रूप में अपने प्रारंभिक साधारण मॉडल में अपमानजनक प्रदर्शन का विरोध करने के संदेशों की संख्या लॉग किया जा रहा पर बढ़ाया)

यहां कुछ प्रश्न हैं जिन्हें मैं साफ़ करना चाहता हूं।

  1. प्रदर्शन में सुधार क्यों? (मैंने सोचा था कि boost::asio::io_service आंतरिक कार्यान्वयन में हैंडलरों के लिए थ्रेड सुरक्षित कतार है, जो इसे अपने प्रारंभिक सरल धागे सुरक्षित कतार डिजाइन से कहीं अधिक कुशल बनाता है)। कृपया ध्यान दें कि मेरे डिजाइन की अच्छी तरह से समीक्षा की गई थी और इस तरह की कोई गलती नहीं थी (कंकाल कोड साबित उदाहरणों पर आधारित था), क्या कोई io_service के कार्यान्वयन के आंतरिक विवरणों पर अधिक प्रकाश डाल सकता है।

  2. दूसरा दिलचस्प अवलोकन यह था कि धागे बढ़ने पर, मेरे शुरुआती कार्यान्वयन प्रदर्शन में सुधार हुआ, लेकिन क्रमबद्धता/क्रम को खोने की लागत पर, लेकिन प्रदर्शन :: एएसओ (मुझे लगता है कि ऐसा इसलिए है क्योंकि मेरे हैंडलर बहुत सरल कार्य कर रहे थे और संदर्भ स्विचिंग ओवरहेड खराब हो रहा था, मैं अधिक जटिल कार्य डालने और बाद में अपने अवलोकन पोस्ट करने की कोशिश करूंगा)।

  3. मैं वास्तव में जानना चाहता हूं कि boost::asio सिर्फ आई/ओ और नेटवर्क ऑपरेशंस के लिए है या थ्रेड पूल के माध्यम से समवर्ती कार्य (समांतर) करने के लिए इसका उपयोग करने का मेरा उपयोग एक अच्छा डिजाइन दृष्टिकोण है। io_service ऑब्जेक्ट का अर्थ केवल आई/ओ ऑब्जेक्ट्स (जैसा कि प्रलेखन में लिखा गया है) के लिए उपयोग किया जाना था, लेकिन मुझे इसे क्रमबद्ध तरीके से समवर्ती कार्यों (केवल आई/ओ या नेटवर्किंग से संबंधित) को हल करने में मेरी मदद करने का एक दिलचस्प तरीका नहीं मिला (कभी-कभी लागू तारों का उपयोग कर आदेश)। मैं बढ़ावा देने के लिए नया हूं, और वास्तव में उत्सुक हूं कि मूल मॉडल ने प्रदर्शन/स्केल के साथ-साथ जब मैंने एएसओ को बढ़ावा दिया था।

परिणाम: (दोनों में मैं सिर्फ 1 कार्यकर्ता धागा था)

  • 1000 कार्य: दोनों ही मामलों
  • में 10 माइक्रो सेकंड/कार्य
  • 10000 कार्य: 80 माइक्रो सेकंड (घिरा बफर), को बढ़ावा देने में 10 माइक्रो सेकंड asio
  • 100000 कार्य: 250 माइक्रो सेकंड (bounde बफर), को बढ़ावा देने में 10 माइक्रो सेकंड asio

यह दिलचस्प k होगा अब io_service हैंडलर के लिए थ्रेड सुरक्षित कतार में थ्रेड सुरक्षित समस्या को कैसे हल करता है (मैंने हमेशा कार्यान्वयन के कुछ स्तर पर सोचा कि उन्हें ताले और सी.वी. का उपयोग करना होगा)।

+0

मैंने अच्छी सफलता के लिए अन्य प्रकार के एसिंक्रोनस कार्यों (केवल नेटवर्क IO नहीं) के प्रबंधन के लिए 'boost :: asio' का उपयोग किया है। – Chad

+0

मुझे पता है कि यह एक पुराना सवाल है लेकिन यह हो सकता है कि (विंडोज़ पर), एएसआईओ आईओ पूरा करने वाले बंदरगाहों का उपयोग करता है और इसके परिणामस्वरूप कुल सिस्टम कॉल कम हो सकती है। – Pete

उत्तर

4

मुझे डर है कि मैं के साथ ज्यादा मदद नहीं कर सकता (1), लेकिन अन्य दो प्रश्न के संबंध में कर रहा हूँ:

(2) मैं ने पाया है कि गैर हैं boost::asio वास्तुकला में कुछ ओवरहेड्स देखते हैं कि - चिकित्सकीय, यानी कि डेटा आने वाले डेटा (या आईओ सेवा ऑब्जेक्ट को भेजा जा रहा है) के बीच देरी सैकड़ों मिलीसेकंड के क्रम तक वस्तुतः तत्काल प्रतिक्रिया से भिन्न हो सकती है। मैंने इसे किसी अन्य समस्या के हिस्से के रूप में मापने का प्रयास किया है जिसे मैं लॉगिंग और टाइमस्टैम्पिंग RS232 डेटा के संबंध में हल करने का प्रयास कर रहा था, लेकिन किसी भी निर्णायक परिणाम या विलंबता को स्थिर करने के तरीकों को प्राप्त नहीं किया है। मुझे आश्चर्यचकित नहीं होगा कि संदर्भ स्विचिंग घटक के साथ समान समस्याएं मौजूद हैं।

(3) जहां तक ​​boost::asio का उपयोग एसिंक्रोनस I/O के अलावा अन्य कार्यों के लिए किया जाता है, अब यह असीमित संचालन के बहुमत के लिए मेरा मानक उपकरण है। मैं boost::asio टाइमर को एसिंक्रोनस प्रक्रियाओं के लिए हर समय उपयोग करता हूं, और अन्य कार्यों के लिए टाइमआउट उत्पन्न करता हूं। पूल में एकाधिक कार्यकर्ता धागे जोड़ने की क्षमता का अर्थ है कि आप अन्य एसिंक्रोनस हाई-लोड कार्यों के लिए समाधान को अच्छी तरह से स्केल कर सकते हैं।

class AsioWorker 
{ 
public: 
    AsioWorker(boost::asio::io_service * service): 
    m_ioService(service), m_terminate(false), m_serviceThread(NULL) 
    { 
    m_serviceThread = new boost::thread(boost::bind(&AsioWorker::Run, this)) 
    } 
    void Run(void) 
    { 
    while(!m_terminate) 
     m_ioService->poll_one(); 
     mySleep(5); // My own macro for cross-platform millisecond sleep 
    } 
    ~AsioWorker(void) 
    { 
    m_terminate = true; 
    m_serviceThread->join(); 
    } 
private: 
    bool m_terminate; 
    boost::asio::io_service *m_ioService; 
    boost::thread *m_serviceThread; 
} 
: मेरी सबसे आसान और पसंदीदा वर्ग मैंने पिछले साल में लिखा है boost::asio आईओ सेवाओं के लिए एक छोटे से छोटे कार्यकर्ता धागा वर्ग है (क्षमा याचना अगर कोई ग़लतियां नहीं हैं, इस के बजाय एक कट & पेस्ट स्मृति से एक प्रतिलेखन है)

यह कक्षा एक बहुत छोटा खिलौना है, केवल new को आवश्यकतानुसार जोड़ें, और delete कुछ जब आप उनके साथ कर लेंगे। std::vector<AsioWorker*> m_workerPool को एक डिवाइस क्लास में चिपकाएं जो boost::asio का उपयोग करता है और आप थ्रेड-पूल प्रबंधन सामग्री को और भी लपेट सकते हैं। मैं हमेशा थ्रेड पूल को उचित रूप से विकसित करने के लिए समय पर आधारित एक बुद्धिमान पूल ऑटो-मैनेजर लिखने का लुत्फ उठाता हूं, लेकिन मेरे पास ऐसी परियोजना नहीं है जहां तक ​​यह आवश्यक था।

थ्रेड सुरक्षा पर अपनी जिज्ञासा को संतुष्ट करने के संबंध में, यह पता लगाने के लिए कि वे क्या कर रहे हैं, यह जानने के लिए बढ़ावा देने की संभावनाओं में खोदना संभव है। व्यक्तिगत रूप से मैंने हमेशा चेहरे के मूल्य पर अधिकांश बूस्ट सामान ले लिए हैं और पिछले अनुभव से माना है कि यह हुड के तहत बहुत अच्छी तरह अनुकूलित है।

0

मुझे सामान्य मल्टी-कोर प्रोसेसिंग इंजन के लिए उत्कृष्ट आधारभूत संरचना के लिए boost::asio भी मिला है। मैंने बहुत सारे सिंक्रनाइज़ेशन के साथ एक बढ़िया काम पर इसका प्रदर्शन मापा और पाया कि यह सी ++ 11 धागे और हालत चर के उपयोग से लिखे गए "क्लासिक" कार्यान्वयन से बेहतर प्रदर्शन करता है।

यह टीबीबी से भी बेहतर प्रदर्शन करता है लेकिन उतना ही नहीं। मैंने "गुप्त" खोजने की कोशिश करने के लिए अपने कोड में खोद दिया। एकमात्र विचार जो मैं देख सकता हूं वह यह है कि उनकी कतार एक क्लासिक लिंक्ड सूची है, न कि एक एसटीएल कंटेनर।

उन सभी के लिए, मुझे यकीन नहीं है कि asio कितनी अच्छी तरह से ज़ीओन फाई जैसे बड़े पैमाने पर थ्रेडेड आर्किटेक्चर पर स्केल करेगा। दो चीजें हैं जो लापता हो रहे हैं:

  1. एक प्राथमिकता कतार और
  2. एक काम चोरी कतार।

मुझे संदेह है कि इन सुविधाओं को जोड़ने से यह टीबीबी प्रदर्शन स्तर पर आ जाएगा।