জাভা এবং সি / সি ++ এর মধ্যে আন্তঃ প্রক্রিয়া যোগাযোগের জন্য দ্রুত (কম স্বল্পতা) পদ্ধতি


101

আমার কাছে একটি জাভা অ্যাপ্লিকেশন রয়েছে, টিসিপি সকেটের মাধ্যমে সি / সি ++ তে বিকাশিত একটি "সার্ভার" এর সাথে সংযোগ স্থাপন করে।

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

বর্তমানে আমরা সকেট ব্যবহার করছি, এবং সব ঠিক আছে, তবে আমি আইপিসি পদ্ধতি ব্যবহার করে ডেটা বিনিময় করার জন্য একটি দ্রুততর উপায় (নিম্ন প্রক্ষেপণ) খুঁজছি।

আমি নেট নিয়ে গবেষণা করছি এবং নিম্নলিখিত প্রযুক্তিগুলির উল্লেখগুলি নিয়ে এসেছি:

  • ভাগ করা মেমরি
  • পাইপ
  • সারি
  • পাশাপাশি ডিএমএ (ডাইরেক্ট মেমোরি অ্যাক্সেস) হিসাবে চিহ্নিত

তবে আমি তাদের সংশ্লিষ্ট পারফরম্যান্সগুলির যথাযথ বিশ্লেষণ খুঁজে পাইনি, কীভাবে সেগুলি জাএভিএ এবং সি / সি ++ উভয় ক্ষেত্রে প্রয়োগ করতে হবে (যাতে তারা একে অপরের সাথে কথা বলতে পারে), সম্ভবত পাইপগুলি যা আমি কীভাবে করব তা কল্পনা করতে পারি।

এই প্রসঙ্গে প্রতিটি পদ্ধতির অভিনয় এবং সম্ভাব্যতা সম্পর্কে কেউ মন্তব্য করতে পারেন? কার্যকর প্রয়োগের তথ্যের কোনও পয়েন্টার / লিঙ্ক?


সম্পাদনা / আপডেট

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

পরবর্তী সম্ভাব্য পদক্ষেপগুলি পাইপগুলির সরাসরি বাস্তবায়ন হবে, তারপরে ভাগ করা মেমরি, যদিও আমাকে জটিলতার অতিরিক্ত স্তর সম্পর্কে সতর্ক করা হয়েছে ...


আপনার সাহায্যের জন্য ধন্যবাদ


7
এটি আপনার ক্ষেত্রে ওভারকিল হতে পারে তবে zeromq.org
jfs

এটি আকর্ষণীয়, তবে প্রথমে ধারণাটি হবে "জেনেরিক" (ওএস-সরবরাহিত বা ভাষা সরবরাহিত পদ্ধতিতে) পদ্ধতিগুলি ব্যবহার করা, সেজন্য আমি সারি এবং ভাগ করা মেমরির উল্লেখ করেছি।
বাসটিয়েন

4
আরও দেখুন stackoverflow.com/questions/904492
MSalters

ম্যাপযুক্ত ফাইল বা কেবল ইউডিপি ভুলবেন না।

10
টিসিপির চেয়ে ইউডিপি ধীর ???
হুঁ

উত্তর:


103

আমার Corei5 2.8GHz এ জাভা থেকে সবেমাত্র পরীক্ষা করা, কেবলমাত্র একক বাইট প্রেরণ / প্রাপ্ত, 2 টি জাভা প্রক্রিয়া টাস্কসেটের সাথে নির্দিষ্ট সিপিইউ কোরকে বরাদ্দ না করে সবেমাত্র প্রসারিত হয়েছে:

TCP         - 25 microseconds
Named pipes - 15 microseconds

এখন স্পষ্টভাবে কোর মাস্কগুলি নির্দিষ্ট করে যেমন টাস্কসেট 1 জাভা এসআরভি বা টাস্কসেট 2 জাভা ক্লাই :

TCP, same cores:                      30 microseconds
TCP, explicit different cores:        22 microseconds
Named pipes, same core:               4-5 microseconds !!!!
Named pipes, taskset different cores: 7-8 microseconds !!!!

তাই

TCP overhead is visible
scheduling overhead (or core caches?) is also the culprit

একই সময়ে থ্রেড.স্লিপ (0) (যা স্ট্রেস শো হিসাবে একক শিডিয়ালইয়েল্ড () লিনাক্স কার্নেল কলটি কার্যকর করা হয়) লাগে 0.3 মাইক্রোসেকেন্ড - নামক পাইপগুলিতে সিঙ্গেল কোরে নির্ধারিত এখনও অনেক বেশি ওভারহেড রয়েছে

কিছু ভাগ করা মেমরি পরিমাপ: ১৪ ই সেপ্টেম্বর, ২০০৯ - সোলস সিস্টেমগুলি আজ ঘোষণা করেছে যে এর ইউনিফাইড মেসেজিং প্ল্যাটফর্ম এপিআই একটি ভাগ করা মেমরি পরিবহন ব্যবহার করে গড়ে 700 ন্যানো সেকেন্ডের গড় বিলম্বিততা অর্জন করতে পারে। http://solacesystems.com/news/fastest-ipc-messaging/

পিএস - পরের দিন মেমরি ম্যাপ করা ফাইলগুলির আকারে ভাগ করে নেওয়া মেমরির চেষ্টা করা, যদি ব্যস্ত ওয়েটিং গ্রহণযোগ্য হয়, তবে আমরা এই জাতীয় কোড সহ একটি একক বাইট পাস করার জন্য বিলম্বকে 0.3 মাইক্রোসেকেন্ডে হ্রাস করতে পারি:

MappedByteBuffer mem =
  new RandomAccessFile("/tmp/mapped.txt", "rw").getChannel()
  .map(FileChannel.MapMode.READ_WRITE, 0, 1);

while(true){
  while(mem.get(0)!=5) Thread.sleep(0); // waiting for client request
  mem.put(0, (byte)10); // sending the reply
}

নোটস: থ্রেড.স্লিপ (0) প্রয়োজন তাই 2 টি প্রক্রিয়া একে অপরের পরিবর্তন দেখতে পারে (আমি এখনও অন্য কোনও উপায় জানি না)। যদি 2 টি প্রক্রিয়া টাসসেটের সাথে একই কোরে বাধ্য করা হয়, তবে বিলম্বটি 1.5 মাইক্রোসেকেন্ডে পরিণত হয় - এটি একটি প্রসঙ্গে স্যুইচ দেরি

পিপিএস - এবং 0.3 মাইক্রোসেকেন্ড একটি ভাল নম্বর! কেবলমাত্র একটি আদিম স্ট্রিং কনটেন্টেশন করার সময় নীচের কোডটি ঠিক 0.1 মাইক্রোসেকেন্ড নেয়:

int j=123456789;
String ret = "my-record-key-" + j  + "-in-db";

পিপিপিএস - আশা করি এটি খুব বেশি অফ-টপিক নয়, তবে অবশেষে আমি থ্রেড.স্লিপ (0) প্রতিস্থাপনের চেষ্টা করেছি একটি স্ট্যাটিক অস্থির ইনটি ভেরিয়েবল (জেভিএম সিপিইউ ক্যাশে ফ্লাশ করে এমনটি করার সময় ঘটে) এবং প্রাপ্ত - রেকর্ড! - জাভা-থেকে-জাভা প্রক্রিয়া যোগাযোগের জন্য 72 ন্যানোসেকেন্ডের বিলম্ব !

যখন একই সিপিইউ কোরকে বাধ্য করা হয়, তবে, অস্থায়ী-বৃদ্ধিকারী জেভিএম কখনই একে অপরের নিয়ন্ত্রণ অর্জন করে না, এইভাবে হুবহু 10 মিলিসেকেন্ড ল্যাটেন্সি উত্পাদন করে - লিনাক্সের সময় কোয়ান্টামটি 5 মিমি বলে মনে হয় ... সুতরাং যদি কেবল অতিরিক্ত খুচরা কোর থাকে তবে এটি ব্যবহার করা উচিত - অন্যথায় ঘুম (0) নিরাপদ।


ধন্যবাদ অ্যান্ড্রি, খুব তথ্য অধ্যয়ন এবং এটি টিসিপির জন্য আমার পরিমাপের কম-বেশি মিলছে, সুতরাং এটি একটি ভাল রেফারেন্স। আমি মনে করি আমি নামী পাইপগুলি সন্ধান করব।
বাসটিয়েন

সুতরাং থ্রেডের (স্লিপ) প্রতিস্থাপনটি অস্থির স্ট্যাটিক ইনট বাড়ানোর সাথে সাথেই করা উচিত যদি আপনি বিভিন্ন কোরে কোনও প্রক্রিয়া পিন করতে পারেন? এছাড়াও, আমি বুঝতে পারি না যে আপনি এটি করতে পারবেন? আমি ভেবেছিলাম ওএস সিদ্ধান্ত নেয়?
mezamorphic

4
LockSupport.parkNanos (1) ব্যবহার করে দেখুন, একই জিনিস করা উচিত।
পুনরুদ্ধার করে

খুব সুন্দর. যদিও টিসিপি পিংয়ের জন্য আপনি আরও ভাল করতে পারেন (5-7us আরটিটি ল্যাটেন্সি হিসাবে)। এখানে দেখুন: psy-lob-saw.blogspot.com/2012/12/…
নিতসান ওয়াকার্ট

4
জাভাতে আইপিসির কাতাকে সমর্থন করতে মেমরি ম্যাপযুক্ত ফাইলটি ভাগ করে নেওয়া মেমরি হিসাবে ব্যবহার করার আরও অনুসন্ধান: psy-lob-saw.blogspot.com/2013/04/lock-free-ipc-queue.html 135M বার্তা প্রাপ্তিতে একটি সেকেন্ডে। পদ্ধতি অনুসারে বিলম্বের তুলনামূলক অধ্যয়নের জন্য নীচে আমার উত্তরটিও দেখুন।
নিতসান ওয়াকার্ট

10

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

ভাগ করা মেমরি এবং পাইপ উভয়ই আধুনিক ওএস দ্বারা সরাসরি সমর্থিত। যেমন, তারা বেশ দ্রুত। সারিগুলি সাধারণত বিমূর্ততা হয়, যেমন সকেট, পাইপ এবং / অথবা ভাগ করা মেমরির উপরে প্রয়োগ করা হয়। এটি ধীর ব্যবস্থার মতো দেখতে পারে তবে বিকল্পটি হ'ল আপনি এমন বিমূর্ততা তৈরি করেন।


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

আরডিএমএ একই ধারণা: উভয় পক্ষের সিপিইউগুলিকে বাধা না দিয়ে কোনও নেটওয়ার্ক জুড়ে বাইটগুলি অনুলিপি করা। এটি এখনও প্রক্রিয়া পর্যায়ে কাজ করে না।
MSalters

10

প্রশ্নটি কিছু সময় আগে জিজ্ঞাসা করা হয়েছিল, তবে আপনি https://github.com/peter-lawrey/ জাভা- ক্রনিকলটিতে আগ্রহী হতে পারেন যা 200 এনএস এবং 20 এম বার্তা / সেকেন্ডের থ্রুপিক্যালগুলিকে সমর্থন করে supports এটি প্রক্রিয়াগুলির মধ্যে ভাগ করা মেমরি ম্যাপযুক্ত ফাইলগুলি ব্যবহার করে (এটি ডেটা ধরে রাখে যা ডেটা চালিয়ে যাওয়ার দ্রুততম উপায় করে তোলে)


7

বিভিন্ন আইপিসি পরিবহনের জন্য পারফরম্যান্স টেস্ট যুক্ত একটি প্রকল্প এখানে রয়েছে:

http://github.com/rigtorp/ipc-bench


এটি 'জাভা ফ্যাক্টর' অন্তর্ভুক্ত করে না তবে এটি আকর্ষণীয় দেখায়।

6

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


6

দেরিতে আগমন, তবে জাভা এনআইও ব্যবহার করে পিং ল্যাটেন্সি পরিমাপের জন্য উত্সর্গীকৃত একটি মুক্ত উত্স প্রকল্পটি নির্দেশ করতে চেয়েছিল wanted

এই ব্লগ পোস্টে আরও অন্বেষণ / ব্যাখ্যা করা হয়েছে । ফলাফলগুলি (ন্যানোসে আরটিটি):

Implementation, Min,   50%,   90%,   99%,   99.9%, 99.99%,Max
IPC busy-spin,  89,    127,   168,   3326,  6501,  11555, 25131
UDP busy-spin,  4597,  5224,  5391,  5958,  8466,  10918, 18396
TCP busy-spin,  6244,  6784,  7475,  8697,  11070, 16791, 27265
TCP select-now, 8858,  9617,  9845,  12173, 13845, 19417, 26171
TCP block,      10696, 13103, 13299, 14428, 15629, 20373, 32149
TCP select,     13425, 15426, 15743, 18035, 20719, 24793, 37877

এটি গৃহীত উত্তরের লাইন বরাবর। System.nanotime () ত্রুটি (কিছুই পরিমাপ করে অনুমান করা হয়) প্রায় 40 ন্যানো হিসাবে পরিমাপ করা হয় যাতে আইপিসির জন্য আসল ফলাফলটি কম হতে পারে। উপভোগ করুন


2

নেটিভ আন্ত-প্রক্রিয়া যোগাযোগ সম্পর্কে আমি খুব বেশি জানি না, তবে আমি অনুমান করব যে আপনাকে নেটিভ কোড ব্যবহার করে যোগাযোগ করতে হবে, যা আপনি জেএনআই পদ্ধতি ব্যবহার করে অ্যাক্সেস করতে পারবেন। সুতরাং, জাভা থেকে আপনি একটি নেটিভ ফাংশন কল করবেন যা অন্য প্রক্রিয়াতে কথা বলে।


1

আমার প্রাক্তন সংস্থায় আমরা এই প্রকল্পটির সাথে কাজ করতাম, http://remotetea.sourceforge.net/ , বুঝতে খুব সহজ এবং সংহত করার জন্য।


0

আপনি কি সকেটগুলি উন্মুক্ত রাখার বিষয়টি বিবেচনা করেছেন, যাতে সংযোগগুলি পুনরায় ব্যবহার করা যায়?


সকেট খোলা থাকে না। অ্যাপ্লিকেশনটি চলমান পুরো সময়ের জন্য সংযোগটি জীবিত (প্রায় 7 ঘন্টা)। বার্তাগুলি কমবেশি অবিচ্ছিন্নভাবে বিনিময় হয় (আসুন আমরা প্রতি সেকেন্ডে 5 থেকে 10 বলে থাকি)। বর্তমান ল্যাটেন্সিটি প্রায় 200 মাইক্রোসেকেন্ডে রয়েছে, লক্ষ্যটি 1 বা 2 এর আকারের অর্ডার শেভ করা।
বস্টিয়েন

একটি 2 এমএস বিলম্বিত? উচ্চাকাঙ্ক্ষী. আপনি JNI ব্যবহারের জন্য ইন্টারফেস করতে পারেন এমন একটি ভাগ করা লাইব্রেরিতে সি-স্টাফগুলি পুনরায় লেখার পক্ষে কি সম্ভব হবে?
থরবজর্ন রাভন অ্যান্ডারসন

2 এমএস 2000 নয়, 2000 মাইক্রোসেকেন্ড, এটি 2 এমএসকে কম উচ্চাকাঙ্ক্ষী করে তোলে।
দ্য হোয়েটাম্বিত

-1

জেএনআই পারফরম্যান্স সম্পর্কে ওরাকল বাগ প্রতিবেদন: http://bugs.java.com/bugdatedia/view_bug.do?bug_id=4096069

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


4
জেএনআই কেন ধীর? জাভাতে নিম্ন-স্তরের টিসিপি স্তর কীভাবে কাজ করে তা বিবেচনা করুন, এটি জাভা বাইট-কোডে লিখিত হয়নি! (উদাহরণস্বরূপ এটি দেশীয় হোস্টের মাধ্যমে কাজ করতে হবে)) সুতরাং, আমি জাভা টিসিপি সকেটগুলি জেএনআইয়ের চেয়ে দ্রুততর যে দাবিটি প্রত্যাখ্যান করি। (জেএনআই, তবে, আইপিসি নয়))

4
যদি আপনি কেবল আদিম ব্যবহার করেন তবে একক জেএনআই কলটির জন্য আপনাকে 9ns (একটি ইন্টেল আই 5 তে) মূল্য দিতে হবে। সুতরাং এটি যে ধীর হয় না।
মার্টিন কার্স্টেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.