IPC प्रदर्शन: सॉकेट नामांकित पाइप


114

सभी को लगता है कि नाम पाइप पाइप सॉकेट आईपीसी से तेज हैं। वे कितने तेज हैं? मैं सॉकेट्स का उपयोग करना पसंद करूंगा क्योंकि वे दो-तरफ़ा संचार कर सकते हैं और बहुत लचीले हैं, लेकिन लचीलेपन पर गति का चयन करेंगे यदि यह काफी मात्रा में है।


10
आपका माइलेज अलग-अलग होगा। :) अपने इच्छित आवेदन के लिए सामान्य उपयोग प्रोफ़ाइल, और दो में से बेहतर उठाओ। फिर अनाम पाइपों, अन्य डोमेन और परिवारों के सॉकेट्स, सेमाफोर और साझा मेमोरी या संदेश कतार (SysV और POSIX), डेटा के एक शब्द के साथ रीयलटाइम सिग्नल या जो भी हो। pipe(2)(एर,; mkfifo(3)) विजेता हो सकता है, लेकिन आप तब तक नहीं जान पाएंगे जब तक आप कोशिश नहीं करेंगे।
अक्टूबर को अपराह्न

2
SysV संदेश कतारों FTW! मुझे नहीं पता कि अगर वे तेज़ हैं, तो मेरे पास उनके लिए एक नरम स्थान है।
टॉम एंडरसन

4
इस मामले में "गति" क्या है? कुल मिलाकर डेटा ट्रांसफर दर? या विलंबता (रिसीवर को पहली बाइट कितनी जल्दी मिलती है)? यदि आप तेज़ स्थानीय डेटा ट्रांसफ़र चाहते हैं, तो साझा मेमोरी को हराना मुश्किल है। यदि विलंबता एक मुद्दा है, हालांकि, तो सवाल अधिक दिलचस्प हो जाता है ...
इयान नी-लुईस

जवाबों:


64

मेरा सुझाव है कि आप पहले आसान रास्ता अपनाएं, ध्यान से आईपीसी तंत्र को अलग करें ताकि आप सॉकेट से पाइप में बदल सकें, लेकिन मैं निश्चित रूप से पहले सॉकेट के साथ जाऊंगा। यह सुनिश्चित होना चाहिए कि आईपीसी का प्रदर्शन पूर्वनिर्धारित अनुकूलन से पहले एक समस्या है।

और अगर आप आईपीसी की गति के कारण परेशानी में पड़ते हैं, तो मुझे लगता है कि आपको पाइप पर जाने के बजाय साझा मेमोरी पर स्विच करने पर विचार करना चाहिए।

यदि आप कुछ स्थानांतरण गति परीक्षण करना चाहते हैं, तो आपको सोसाइटी की कोशिश करनी चाहिए , जो एक बहुत ही बहुमुखी कार्यक्रम है जो आपको लगभग किसी भी प्रकार की सुरंग बनाने की अनुमति देता है।


48

सर्वश्रेष्ठ परिणाम आपको साझा मेमोरी समाधान के साथ मिलेंगे ।

नामित पाइप टीसीपी सॉकेट्स से केवल 16% बेहतर हैं

परिणाम IPC बेंचमार्किंग के साथ मिलते हैं :

  • सिस्टम: लिनक्स (लिनक्स ubuntu 4.4.0 x86_64 i7-6700K 4.00GHz)
  • संदेश: 128 बाइट्स
  • संदेश गणना: 1000000

पाइप बेंचमार्क:

Message size:       128
Message count:      1000000
Total duration:     27367.454 ms
Average duration:   27.319 us
Minimum duration:   5.888 us
Maximum duration:   15763.712 us
Standard deviation: 26.664 us
Message rate:       36539 msg/s

एफआईएफओ (नामित पाइप) बेंचमार्क:

Message size:       128
Message count:      1000000
Total duration:     38100.093 ms
Average duration:   38.025 us
Minimum duration:   6.656 us
Maximum duration:   27415.040 us
Standard deviation: 91.614 us
Message rate:       26246 msg/s

संदेश कतार बेंचमार्क:

Message size:       128
Message count:      1000000
Total duration:     14723.159 ms
Average duration:   14.675 us
Minimum duration:   3.840 us
Maximum duration:   17437.184 us
Standard deviation: 53.615 us
Message rate:       67920 msg/s

साझा मेमोरी बेंचमार्क:

Message size:       128
Message count:      1000000
Total duration:     261.650 ms
Average duration:   0.238 us
Minimum duration:   0.000 us
Maximum duration:   10092.032 us
Standard deviation: 22.095 us
Message rate:       3821893 msg/s

टीसीपी कुर्सियां ​​बेंचमार्क:

Message size:       128
Message count:      1000000
Total duration:     44477.257 ms
Average duration:   44.391 us
Minimum duration:   11.520 us
Maximum duration:   15863.296 us
Standard deviation: 44.905 us
Message rate:       22483 msg/s

यूनिक्स डोमेन सॉकेट बेंचमार्क:

Message size:       128
Message count:      1000000
Total duration:     24579.846 ms
Average duration:   24.531 us
Minimum duration:   2.560 us
Maximum duration:   15932.928 us
Standard deviation: 37.854 us
Message rate:       40683 msg/s

ZeroMQ बेंचमार्क:

Message size:       128
Message count:      1000000
Total duration:     64872.327 ms
Average duration:   64.808 us
Minimum duration:   23.552 us
Maximum duration:   16443.392 us
Standard deviation: 133.483 us
Message rate:       15414 msg/s

1
विस्तृत बेंचमार्किंग के लिए धन्यवाद। क्या आप "संदेश कतार" के साथ "मल्टीप्रोसेसिंग। क्यू" का मतलब है?
ओवुंसेटिन

1
संदेश कतार एक प्रणाली XSI संदेश कतार ( man7.org/linux/man-pages/man0/sys_msg.h.0p.html ) है
क्रोनोक्सर

34

मैं शोडेनेक्स से सहमत होने जा रहा हूं, ऐसा लगता है कि आप समय से पहले कुछ ऐसा करने की कोशिश कर रहे हैं जो अभी तक समस्याग्रस्त नहीं है। जब तक आप जानते हैं कि कुर्सियां ​​एक अड़चन बनने वाली हैं, मैं बस उनका उपयोग करूंगा।

बहुत सारे लोग जो नामित पाइपों की कसम खाते हैं, वे थोड़ी बचत पाते हैं (इस पर निर्भर करता है कि बाकी सब कुछ कितना अच्छा लिखा गया है), लेकिन यह उस कोड के साथ समाप्त होता है जो आईपीसी के उत्तर के लिए अधिक समय व्यतीत करता है क्योंकि यह उपयोगी काम नहीं करता है। निश्चित रूप से, गैर-अवरुद्ध योजनाएं इसकी मदद करती हैं, लेकिन वे मुश्किल हो सकते हैं। आधुनिक युग में पुराने कोड को लाने के वर्षों में, मैं कह सकता हूं, मैंने देखा है कि अधिकांश मामलों में स्पीडअप लगभग शून्य है।

यदि आप वास्तव में सोचते हैं कि कुर्सियां ​​आपको धीमा करने जा रही हैं, तो गेट से बाहर जाने के लिए साझा स्मृति का उपयोग करके सावधानीपूर्वक ध्यान दें कि आप ताले का उपयोग कैसे करते हैं। फिर, सभी वास्तविकताओं में, आपको एक छोटा स्पीडअप मिल सकता है, लेकिन ध्यान दें कि आप इसके एक हिस्से को बर्बाद कर रहे हैं जो पारस्परिक बहिष्कार ताले पर प्रतीक्षा कर रहे हैं। मैं के लिए एक यात्रा की वकालत करने नहीं जा रहा हूँ futex नरक (ठीक है, नहीं काफी अपने अनुभव के आधार पर 2015 में अब और नरक,)।

पाउंड के लिए पाउंड, सॉकेट्स (लगभग) हमेशा एक अखंड कर्नेल के तहत उपयोगकर्ता अंतरिक्ष आईपीसी के लिए जाने का सबसे अच्छा तरीका है .. और (आमतौर पर) डिबग और बनाए रखने के लिए सबसे आसान है।


2
हो सकता है कि किसी दूर के भविष्य में किसी दिन हमारे पास पूरी तरह से नया, मॉड्यूलर, आधुनिक कर्नेल होगा, जो अंतर्निहित रूप से सभी (इंटरप्रोसेस और अन्य) क्षमताओं को प्रदान करता है, जिन्हें हम वर्तमान में पूरा करने के लिए टूटे हुए कांच पर चलते हैं ... लेकिन हे .. एक सपना देख सकते हैं
Gukki5

27

ध्यान रखें कि सॉकेट्स का मतलब आईपी (और टीसीपी या यूडीपी) नहीं है। आप UNIX सॉकेट्स (PF_UNIX) का भी उपयोग कर सकते हैं, जो 127.0.0.1 से कनेक्ट करने पर ध्यान देने योग्य प्रदर्शन सुधार प्रदान करता है


1
विंडोज के बारे में क्या?
पेसियर

1
@Pacerier अफसोस की बात है, आप यूनिक्स पर सार नाम स्थान के रूप में विंडोज पर स्थानीय सॉकेट नहीं बना सकते। मैंने इस पृष्ठ पर वर्णित अधिकांश अन्य विधियों की तुलना में PF_UNIX सॉकेट को काफी तेज (> 10%) पाया है।
EntangledLoops

1
devblogs.microsoft.com/commandline/af_unix-ields-to-windows अद्यतन, यूनिक्स सॉकेट अब विंडोज 10 में उपलब्ध हैं।
इरी


11

यदि आपको गति की आवश्यकता नहीं है, तो सॉकेट जाने का सबसे आसान तरीका है!

यदि आप जो देख रहे हैं वह गति है, तो सबसे तेज़ समाधान मेमोरी साझा किया जाता है, जिसका नाम पाइप नहीं है।


8

नामित पाइप के साथ दो तरह से संचार के लिए:

  • यदि आपके पास कुछ प्रक्रियाएं हैं, तो आप दो दिशाओं के लिए दो पाइप खोल सकते हैं (processA2ProcessB और processB2ProcessA)
  • यदि आपके पास कई प्रक्रियाएं हैं, तो आप हर प्रक्रिया (processAin, processAout, processBin, processBout, processCin, processCout आदि) के लिए पाइप खोल सकते हैं और बाहर निकाल सकते हैं।
  • या आप हमेशा की तरह हाइब्रिड जा सकते हैं :)

नामांकित पाइपों को लागू करना काफी आसान है।

उदाहरण के लिए, मैंने सी में नामित पाइपों के साथ सी में एक परियोजना को लागू किया, धन्यवाद जो कि फ़ाइल के इनपुट-आउटपुट आधारित संचार (fopen, fprintf, fscanf ...) के लिए था, यह इतना आसान और साफ था (यदि यह भी एक विचार है)।

मैंने उन्हें जावा के साथ भी कोडित किया (मैं धारावाहिक बना रहा था और उन पर ऑब्जेक्ट भेज रहा था!)

नामित पाइपों में एक नुकसान है:

  • वे कई कंप्यूटरों पर सॉकेट की तरह स्केल नहीं करते हैं क्योंकि वे फाइलसिस्टम पर भरोसा करते हैं (साझा फाइलसिस्टम एक विकल्प नहीं है)

8

सॉकेट्स के साथ एक समस्या यह है कि उनके पास बफर को फ्लश करने का एक तरीका नहीं है। वहाँ कुछ नागल एल्गोरिथम कहा जाता है जो सभी डेटा एकत्र करता है और इसे 40ms के बाद फ्लश करता है। तो अगर यह जवाबदेही है और बैंडविड्थ नहीं तो आप पाइप से बेहतर हो सकते हैं।

आप सॉकेट विकल्प TCP_NODELAY के साथ नागल को अक्षम कर सकते हैं, लेकिन तब रीडिंग एंड को कभी भी एक ही रीड कॉल में दो छोटे संदेश प्राप्त नहीं होंगे।

तो यह परीक्षण, मैं इस में से किसी के साथ समाप्त हो गया और साझा स्मृति में pthread mutex और semaphore के साथ स्मृति मैप आधारित कतारें लागू की, बहुत सारे कर्नेल सिस्टम कॉल से बचा (लेकिन आज वे अब बहुत धीमी गति से नहीं हैं)।


3
"तो इसे परखो" <- शब्दों से जीना है।
कोशिनी

6

नामित पाइप और सॉकेट कार्यात्मक रूप से समतुल्य नहीं हैं; सॉकेट्स अधिक सुविधाएँ प्रदान करते हैं (वे एक शुरुआत के लिए द्विदिश हैं)।

हम आपको यह नहीं बता सकते कि कौन बेहतर प्रदर्शन करेगा, लेकिन मुझे दृढ़ता से संदेह है कि यह कोई फर्क नहीं पड़ता।

यूनिक्स डोमेन सॉकेट्स टीसीपी सॉकेट्स को बहुत अधिक कर देगा, लेकिन केवल स्थानीय मशीन पर और (शायद थोड़ा सा) निचले माथे पर।

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

यूनिक्स और एनटी दोनों में "नामित पाइप" हैं, लेकिन वे फीचर सेट में पूरी तरह से अलग हैं।


1
वैसे अगर आप 2 पाइप खोलते हैं, तो आपको बीड़ी व्यवहार भी मिलता है।
पेसियर

4

आप ZeroMQ [ zmq / 0mq ] जैसे हल्के समाधान का उपयोग कर सकते हैं । यह उपयोग करने में बहुत आसान है और नाटकीय रूप से तेजी से सॉकेट करता है।


2
आपको पसंद हो सकता है, अमित, मार्टिन SUSTRIK की अगली कलाकृति - POSIX शिकायत nanomsg। वैसे भी, इस महान जगह का स्वागत और आनंद लें और यह सक्रिय रूप से योगदान करने वाला सदस्य बन गया।
user3666197
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.