আইপিসির পারফরম্যান্স: নাম পাইপ বনাম সকেট


114

সকলেই বলে মনে হচ্ছে নামযুক্ত পাইপগুলি সকেটের আইপিসির চেয়ে দ্রুত। তারা কত দ্রুত? আমি সকেটগুলি ব্যবহার করতে পছন্দ করব কারণ তারা দ্বিমুখী যোগাযোগ করতে পারে এবং খুব নমনীয় তবে এটি যদি যথেষ্ট পরিমাণে হয় তবে নমনীয়তার চেয়ে গতি বেছে নেব।


10
আপনার মাইলেজ পৃথক হবে। :) আপনার উদ্দেশ্যযুক্ত অ্যাপ্লিকেশনটির জন্য প্রোফাইল আদর্শ ব্যবহার, এবং দুটির থেকে আরও ভাল চয়ন করুন। তারপরে অজ্ঞাতনামা পাইপস, অন্যান্য ডোমেন এবং পরিবারগুলির সকেট, সেমাফোরাস এবং ভাগ করা মেমরি বা বার্তা সারি (SysV এবং POSIX), ডেটা শব্দের সাথে রিয়েলটাইম সংকেত বা যা কিছু হোক। pipe(2)(এর mkfifo(3),?) বিজয়ী হতে পারে তবে আপনি চেষ্টা না করা পর্যন্ত জানেন না।
পাইলক্রো

2
এসআইএসভি মেসেজের সারি এফটিডব্লিউ! তারা দ্রুত কিনা আমার কোনও ধারণা নেই, তাদের জন্য আমার কেবল একটি নরম জায়গা রয়েছে।
টম অ্যান্ডারসন

4
এক্ষেত্রে "গতি" কী? সামগ্রিকভাবে ডেটা ট্রান্সফার রেট? বা বিলম্বিতা (প্রথম বাইটটি রিসিভারের কাছে কত দ্রুত যায়)? আপনি যদি দ্রুত স্থানীয় ডেটা ট্রান্সফার চান তবে ভাগ করে নেওয়া মেমরিটি শক্ত করে ফেলা শক্ত। বিলম্বিতা যদি কোনও সমস্যা হয় তবে প্রশ্নটি আরও আকর্ষণীয় হয়ে ওঠে ...
ইয়ান নি-লুইস

উত্তর:


64

আমি আপনাকে প্রথমে সহজ পথটি গ্রহণের পরামর্শ দিচ্ছি, সাবধানতার সাথে আইপিসি প্রক্রিয়াটি পৃথক করে রাখুন যাতে আপনি সকেট থেকে পাইপতে পরিবর্তন করতে পারেন, তবে আমি অবশ্যই প্রথমে সকেটের সাথে যেতে চাই। প্রাক্প্রটিভ অপ্টিমাইজ করার আগে আপনার অবশ্যই নিশ্চিত হওয়া উচিত যে আইপিসি পারফরম্যান্স একটি সমস্যা।

এবং আপনি যদি আইপিসির গতির কারণে সমস্যায় পড়ে থাকেন তবে আমি মনে করি আপনার পাইপ না গিয়ে ভাগ করে নেওয়া স্মৃতিতে স্যুইচ করা বিবেচনা করা উচিত।

আপনি যদি কিছু ট্রান্সফার স্পিড টেস্টিং করতে চান তবে আপনার সকেটটি চেষ্টা করা উচিত , এটি একটি বহুমুখী প্রোগ্রাম যা আপনাকে প্রায় কোনও প্রকারের টানেল তৈরি করতে দেয়।


47

ভাগ করা মেমোরি সহ সেরা ফলাফল আপনি পাবেন সমাধান ।

নামযুক্ত পাইপগুলি টিসিপি সকেটের চেয়ে 16% ভাল

আইপিসি বেঞ্চমার্কিংয়ের সাথে ফলাফলগুলি পাওয়া যায় :

  • সিস্টেম: লিনাক্স (লিনাক্স উবুন্টু 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

জিরোমিকিউ মানদণ্ড:

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
বিস্তারিত বেঞ্চমার্কিংয়ের জন্য ধন্যবাদ। আপনি কি "বার্তা সারি" সহ "মাল্টিপ্রসেসিং.কুইউ" বলতে চান?
ovunccetin

1
বার্তা ক্যু হ'ল একটি সিস্টেম এক্সএসআই বার্তা সারি ( man7.org/linux/man-pages/man0/sys_msg.h.0p.html )
ক্রোনাক্সোর

34

আমি শোডেনেক্সের সাথে একমত হতে চলেছি, দেখে মনে হচ্ছে আপনি অকাল থেকে এমন কোনও বিষয় অনুকূলিত করার চেষ্টা করছেন যা এখনও সমস্যাযুক্ত নয়। যদি না আপনি জানেন সকেটগুলি একটি বাধা হয়ে উঠবে, আমি কেবল সেগুলি ব্যবহার করব।

নামযুক্ত পাইপের দ্বারা শপথ করে প্রচুর লোকেরা কিছুটা সঞ্চয় সঞ্চয় খুঁজে পান (সমস্ত কিছু কত ভালভাবে লেখা হয় তার উপর নির্ভর করে) তবে কোডটি শেষ করুন যা কোনও আইপিসি উত্তর দেওয়ার জন্য কার্যকর কাজ করার চেয়ে বেশি সময় ব্যয় করতে ব্যয় করে। অবশ্যই, নন-ব্লকিং স্কিমগুলি এটিকে সহায়তা করে তবে এগুলি জটিল হতে পারে। আধুনিক যুগে পুরানো কোড আনার কয়েক বছর ব্যয় করে, আমি বলতে পারি, আমি দেখেছি বেশিরভাগ ক্ষেত্রেই স্পিডআপ প্রায় শূন্য।

যদি আপনি সত্যিই ভাবেন যে সকেটগুলি আপনাকে ধীর করে দিচ্ছে, তবে আপনি কীভাবে লক ব্যবহার করবেন সে সম্পর্কে যত্ন সহকারে মনোযোগ সহ ভাগ করে নেওয়া মেমরি ব্যবহার করে গেটের বাইরে যান। আবার, সমস্ত বাস্তবতায়, আপনি একটি সামান্য দ্রুতগতি পেতে পারেন তবে লক্ষ্য করুন যে আপনি পারস্পরিক বর্জনীয় লকের জন্য অপেক্ষা করে এর একটি অংশ নষ্ট করছেন। আমি ফিউটেক্স নরকের ভ্রমণের পক্ষে যাচ্ছি না (ভাল, বেশ নয়) আপনার অভিজ্ঞতার উপর নির্ভর করে ২০১৫ সালে আর নরক নয়)।

পাউন্ডের জন্য পাউন্ড, সকেটগুলি (প্রায়) সর্বদা একরঙা কার্নেলের অধীনে ব্যবহারকারীর স্পেস আইপিসি যাওয়ার সবচেয়ে ভাল উপায় .. এবং (সাধারণত) ডিবাগ করা এবং বজায় রাখা সবচেয়ে সহজ।


2
সম্ভবত কোনও দিন দূর ইউটোপিয়ান ভবিষ্যতে আমাদের কাছে একটি সম্পূর্ণ নতুন, মডুলার, আধুনিক কার্নেল থাকবে যা স্পষ্টতই সমস্ত ভাঙা কাচের উপর দিয়ে চলার জন্য সমস্ত দক্ষতা (আন্তঃপ্রসেস এবং অন্যান্য) সরবরাহ করে ... তবে আরে .. কেউ স্বপ্ন দেখতে পারে
Gukki5

27

মনে রাখবেন যে সকেটগুলি অগত্যা আইপি (এবং টিসিপি বা ইউডিপি) বোঝায় না। আপনি ইউনিক্স সকেট (PF_UNIX) ব্যবহার করতে পারেন, যা 127.0.0.1 এ সংযোগ স্থাপনের তুলনায় লক্ষণীয় পারফরম্যান্স উন্নতি প্রস্তাব করে


1
উইন্ডোজ সম্পর্কে কি?
পেসিয়ার 21

1
@ পেসারিয়ার দুঃখের বিষয়, আপনি উইন্ডোজে ইউনিক্সের বিমূর্ত নামের জায়গার মতো স্থানীয় সকেট তৈরি করতে পারবেন না। আমি এই পৃষ্ঠায় বর্ণিত অন্যান্য পদ্ধতির তুলনায় PF_UNIX সকেটগুলি যথেষ্ট দ্রুত (> 10%) পেতে পেয়েছি।
এংগল্লডলুপস

1
devblogs.mic Microsoft.com/commandline/af_unix-comes-to-windows আপডেট, ইউনিক্স সকেটগুলি এখন উইন্ডোজ 10 এ উপলব্ধ।
এরি0o

27

প্রায়শই, সংখ্যাগুলি অনুভূতির চেয়ে বেশি বলে, এখানে কিছু তথ্য রয়েছে: পাইপ বনাম ইউনিক্স সকেট পারফরম্যান্স (opendmx.net)

এই মানদণ্ড পাইপগুলির জন্য প্রায় 12 থেকে 15% দ্রুত গতির পার্থক্য দেখায়।


11

আপনার যদি গতির প্রয়োজন না হয় তবে সকেটগুলি হ'ল সহজতম উপায়!

আপনি যা দেখছেন তা যদি গতি হয় তবে দ্রুততম সমাধানটি ভাগ করা হয় মেমরি, নামযুক্ত পাইপ নয়।


8

নামযুক্ত পাইপগুলির সাথে দ্বিমুখী যোগাযোগের জন্য:

  • আপনার যদি কয়েকটি প্রক্রিয়া থাকে তবে আপনি দুটি দিকের জন্য দুটি পাইপ খুলতে পারেন (প্রসেসএ 2 প্রসেসবি এবং প্রসেসবি 2 প্রসেসএ)
  • আপনার যদি অনেকগুলি প্রক্রিয়া থাকে তবে আপনি প্রতিটি প্রক্রিয়া (প্রসেসএইন, প্রসেসআউট, প্রসেসবিন, প্রসেসবাউট, প্রসেসকিন, প্রসেসকাউট ইত্যাদি) এর জন্য পাইপগুলি ইন-আউট খুলতে পারবেন)
  • বা আপনি সর্বদা হিসাবে সংকর যেতে পারেন :)

নামযুক্ত পাইপগুলি প্রয়োগ করা বেশ সহজ।

উদাহরণস্বরূপ, আমি সি তে নামকৃত পাইপ সহ একটি প্রকল্প বাস্তবায়ন করেছি, স্ট্যান্ডার্ড ফাইল ইনপুট-আউটপুট ভিত্তিক যোগাযোগের জন্য ধন্যবাদ (ফোপেন, এফপ্রিন্টফ, fscanf ...) এটি এত সহজ এবং পরিষ্কার ছিল (যদি এটি বিবেচনা করেও থাকে)।

এমনকি আমি তাদের জাভা দিয়ে কোড করেছিলাম (আমি তাদের উপর সিরিয়াল তৈরি করছিলাম এবং প্রেরণ করছিলাম!)

নামী পাইপগুলির একটি অসুবিধা রয়েছে:

  • তারা সকেটের মতো একাধিক কম্পিউটারে স্কেল করে না যেহেতু তারা ফাইল সিস্টেমে নির্ভর করে (ভাগ করে নেওয়া ফাইল সিস্টেমটি বিকল্প নয় বলে ধরে নেওয়া)

8

সকেটগুলির সাথে একটি সমস্যা হ'ল তাদের কাছে বাফারটি ফ্লাশ করার কোনও উপায় নেই। নাগলে অ্যালগরিদম নামে কিছু আছে যা সমস্ত ডেটা সংগ্রহ করে এবং 40 মিমি পরে এটি ফ্লাশ করে। সুতরাং যদি এটি প্রতিক্রিয়াশীল হয় এবং ব্যান্ডউইথ না হয় তবে আপনি পাইপ দিয়ে ভাল হতে পারেন।

আপনি নাগলেকে সকেট অপশন টিসিপি_নোডিলে দিয়ে অক্ষম করতে পারেন তবে তারপরে পড়া শেষ হবে না কোনও একক পঠন কলে দুটি সংক্ষিপ্ত বার্তা receive

সুতরাং এটি পরীক্ষা করুন, আমি এর কোনওটিই শেষ করে নিই এবং প্রচুর কার্নাল সিস্টেম কলগুলি এড়িয়ে মেমরি ম্যাপযুক্ত ভিত্তিক সারিগুলিকে মেশিনে পাইথ্রেড মুটেক্স এবং সেমফোর প্রয়োগ করেছি (তবে আজ তারা আর খুব ধীর নয়)।


3
"সুতরাং এটি পরীক্ষা করুন" <- শব্দগুলি বেঁচে থাকার জন্য।
কোশিনা

6

নামযুক্ত পাইপ এবং সকেটগুলি কার্যত সমতুল্য নয়; সকেট আরও বৈশিষ্ট্য সরবরাহ করে (তারা একটি দিকনির্দেশক, প্রথমদিকে)।

কোনটি আরও ভাল পারফরম্যান্স করবে তা আমরা আপনাকে বলতে পারি না, তবে আমি দৃ strongly়ভাবে সন্দেহ করি এটির কোনও গুরুত্ব নেই।

ইউনিক্স ডোমেন সকেটগুলি টিসিপি সকেটগুলি কী করবে তা কেবলমাত্র করবে তবে কেবল স্থানীয় মেশিনে এবং (সম্ভবত কিছুটা) নিম্ন ওভারহেড সহ।

যদি কোনও ইউনিক্স সকেট পর্যাপ্ত দ্রুত না হয় এবং আপনি প্রচুর ডেটা স্থানান্তর করে থাকেন তবে আপনার ক্লায়েন্ট এবং সার্ভারের মধ্যে ভাগ করা মেমরি ব্যবহার করার বিষয়টি বিবেচনা করুন (এটি সেট আপ করার জন্য অনেক বেশি জটিল)।

ইউনিক্স এবং এনটি দুজনেরই "নামযুক্ত পাইপ" রয়েছে তবে তারা বৈশিষ্ট্য সংস্থায় সম্পূর্ণ আলাদা।


1
আচ্ছা আপনি যদি 2 টি পাইপ খোলেন তবে আপনি বিড়ির আচরণও পাবেন।
পেসারিয়ার

4

আপনি জিরো কিউ [ zmq / 0mq ] এর মতো হালকা ওজনের সমাধান ব্যবহার করতে পারেন । সকেটগুলি এটি ব্যবহার করা খুব সহজ এবং নাটকীয়ভাবে দ্রুত।


2
আপনারা মনে করতে পারেন, অমিত, মার্টিন সাস্ট্রিকের পরবর্তী শিল্পকর্ম - পসিক্স অনুগত nanomsg। যাইহোক, স্বাগতম এবং এই দুর্দান্ত জায়গা উপভোগ করুন এবং এটি সক্রিয়ভাবে অবদানকারী সদস্য হয়ে উঠুন।
ব্যবহারকারী3666197
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.