নোড.জেগুলি কীভাবে অন্তর্নিহিত দ্রুততর হয় যখন এটি এখনও অভ্যন্তরীণভাবে থ্রেডগুলিতে নির্ভর করে?


281

আমি কেবল নীচের ভিডিওটি দেখেছি: নোড.জেএস এর পরিচিতি এবং এখনও আপনি কীভাবে গতির সুবিধা পাবেন তা বুঝতে পারি না।

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

পরে, তিনি নোড.জেএস এর আর্কিটেকচার স্ট্যাকটি দেখায় যার অভ্যন্তরীণভাবে নিজস্ব থ্রেড পুল রয়েছে যার একটি অন্তর্নিহিত সি বাস্তবায়ন রয়েছে। সুতরাং স্পষ্টতই নোড.জেএস বিকাশকারীরা তাদের নিজস্ব থ্রেড কিক করবে না বা সরাসরি থ্রেড পুল ব্যবহার করবে না ... তারা অ্যাসিঙ্ক কল-ব্যাক ব্যবহার করে। এটাই আমি বুঝি।

আমি বুঝতে পারি না যে পয়েন্টটি নোড.জেএস এখনও থ্রেড ব্যবহার করছে ... এটি কেবল বাস্তবায়নটি গোপন করছে তাই 50 জন লোক 50 টি ফাইলের (বর্তমানে মেমরিতে নেই) ভালভাবে অনুরোধ করে তবে 50 টি থ্রেডের প্রয়োজন নেই ?

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

সুতরাং আপনি কি আসলেই কেবল একটি সমস্যা নিচ্ছেন না (থ্রেডিং) এবং সমস্যাটি এখনও বিদ্যমান অবস্থায় লুকিয়ে রাখছেন: মূলত একাধিক থ্রেড, প্রসঙ্গের স্যুইচিং, মৃত-লকস ... ইত্যাদি?

কিছু বিশদ অবশ্যই থাকতে হবে যা আমি এখনও এখানে বুঝতে পারি না।


14
আমি আপনার সাথে একমত হতে আগ্রহী যে দাবিটি কিছুটা অতি-সরল হয়েছে। আমি বিশ্বাস করি নোডের পারফরম্যান্স সুবিধাটি দুটি জিনিসকে ফোটায়: 1) আসল থ্রেডগুলি মোটামুটি নিম্ন স্তরে থাকে এবং তাই আকার এবং সংখ্যায় সীমাবদ্ধ থাকে এবং থ্রেড সুসংগতকরণটি এইভাবে সরল করা যায়; 2) ওএস-স্তরের "স্যুইচিং" এর মাধ্যমে select()থ্রেড প্রসঙ্গের অদলবদলের চেয়ে দ্রুত।
পয়েন্টটি

উত্তর:


140

এখানে আসলে কয়েকটি ভিন্ন জিনিস বিভ্রান্ত হচ্ছে। তবে এটি মেম দিয়ে শুরু হয় যে থ্রেডগুলি সত্যই শক্ত। সুতরাং যদি সেগুলি শক্ত হয় তবে আপনি সম্ভবত থ্রেড ব্যবহার করার সময় 1) বাগের কারণে বিরতি এবং 2) এগুলি যথাসম্ভব দক্ষতার সাথে ব্যবহার করবেন না। (২) আপনি যার সম্পর্কে জিজ্ঞাসা করছেন is

তিনি যে উদাহরণ দিয়েছেন তার মধ্যে একটি সম্পর্কে চিন্তা করুন, যেখানে একটি অনুরোধ আসে এবং আপনি কিছু জিজ্ঞাসা চালান, এবং তার ফলাফলগুলি দিয়ে কিছু করুন something আপনি যদি এটি একটি প্রমিত পদ্ধতিতে লিখেন, কোডটি দেখতে দেখতে এই রকম হতে পারে:

result = query( "select smurfs from some_mushroom" );
// twiddle fingers
go_do_something_with_result( result );

যদি অনুরোধটি আসার কারণে আপনি একটি নতুন থ্রেড তৈরি করেছেন যা উপরের কোডটি চালিয়েছে, আপনার কাছে একটি থ্রেড বসে থাকবে, query()চলমান অবস্থায় কিছুই করবেন না । (রায়ান অনুসারে, আপাচি মূল অনুরোধটি মেটানোর জন্য একক থ্রেড ব্যবহার করছে যেখানে এনজিনেক্স সে ক্ষেত্রে যে বিষয়টি নিয়ে কথা বলছেন, সে ক্ষেত্রে এটি ছাড়িয়ে যাচ্ছে।)

এখন, আপনি যদি সত্যিই চালাক হন, আপনি উপরের কোডটি এমনভাবে প্রকাশ করবেন যেখানে পরিবেশ বন্ধ হয়ে যেতে পারে এবং আপনি যখন ক্যোয়ারী চালাচ্ছেন তখন অন্য কিছু করতে পারে:

query( statement: "select smurfs from some_mushroom", callback: go_do_something_with_result() );

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

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


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

34
হ্যাঁ, আমি যা বলি তা হ'ল শূন্যস্থানগুলি বন্ধ করার উপায় খুঁজে পাওয়ার মতো নয়: এটি কোনও নতুন প্যাটার্ন নয়। ভিন্নটি হ'ল তিনি জাভাস্ক্রিপ্ট ব্যবহার করছেন যাতে প্রোগ্রামারকে তাদের প্রোগ্রামটি এমনভাবে প্রকাশ করতে দেয় যা এই ধরণের অ্যাসিনক্রোনির জন্য অনেক বেশি সুবিধাজনক। সম্ভবত একটি পিটুনি বিশদ, কিন্তু এখনও ...
jrtipton

16
এটি উল্লেখ করার মতোও যে I / O টির অনেক কাজের জন্য নোড যে কোনও কার্নেল-স্তরের async I / O api উপলভ্য ব্যবহার করে (এপল, কিকিউ, / দেব / পোল, যাই হোক না কেন)
পল

7
আমি এখনও নিশ্চিত নই যে আমি এটি পুরোপুরি বুঝতে পেরেছি। যদি আমরা বিবেচনা করি যে ওয়েব অনুরোধের ভিতরে আইও অপারেশনগুলি অনুরোধটি প্রক্রিয়া করতে বেশিরভাগ সময় নেয় এবং যদি প্রতিটি আইও অপারেশনের জন্য একটি নতুন থ্রেড তৈরি হয়, তবে 50 টি অনুরোধের জন্য যা খুব দ্রুত উত্তরাধিকার সূত্রে আসে, আমরা সম্ভবত 50 টি থ্রেড সমান্তরালভাবে চলছে এবং তাদের আইও অংশটি কার্যকর করছে। স্ট্যান্ডার্ড ওয়েব সার্ভারের পার্থক্য হ'ল সেখানে পুরো অনুরোধটি থ্রেডে কার্যকর করা হয়, যখন নোড.জেসে কেবল তার আইও অংশ থাকে, তবে এটি সেই অংশ যা বেশিরভাগ সময় নিচ্ছে এবং থ্রেডটি অপেক্ষা করতে তৈরি করে।
ফ্লোরিন ডুমিট্রেস্কু

13
@ সিস্টেমে প্যারাডক্স এটি নির্দেশ করার জন্য ধন্যবাদ। আমি ইস্যুতে ইদানীং কিছু গবেষণা করেছি এবং প্রকৃতপক্ষে ধরা পড়েছে যে অ্যাসিঙ্ক্রোনাস আই / ও, যখন কার্নেল স্তরে যথাযথভাবে প্রয়োগ করা হয়, তখন অ্যাসিঙ্ক আই / ও ক্রিয়াকলাপ সম্পাদনের সময় থ্রেড ব্যবহার করে না। পরিবর্তে কলিং থ্রেডটি আই / ও অপারেশন শুরু হওয়ার সাথে সাথে প্রকাশিত হয় এবং আই / ও অপারেশন শেষ হয়ে গেলে এবং কলব্যাক কার্যকর করা হয় এবং এর জন্য একটি থ্রেড উপলব্ধ available সুতরাং I / O ক্রিয়াকলাপের জন্য যদি অ্যাসিঙ্ক সমর্থনটি সঠিকভাবে প্রয়োগ করা হয় তবে নোড.জেএস কেবলমাত্র একটি থ্রেড ব্যবহার করে 50 প্রায় সমান্তরালে 50 আই / ও ক্রিয়াকলাপের সাথে 50 সমবর্তী অনুরোধগুলি পরিচালনা করতে পারে।
ফ্লোরিন ডুমিট্রেস্কু

32

বিঃদ্রঃ! এটি একটি পুরানো উত্তর। যদিও এটি এখনও মোটামুটি রূপরেখায় সত্য, গত কয়েক বছরে নোডের দ্রুত বিকাশের কারণে কিছু বিশদ পরিবর্তন হতে পারে।

এটি থ্রেড ব্যবহার করছে কারণ:

  1. খুলে O_NONBLOCK বিকল্প () ফাইল কাজ করে না
  2. তৃতীয় পক্ষের লাইব্রেরি রয়েছে যা নন-ব্লকিং আইও সরবরাহ করে না।

নন-ব্লকিং আইও নকল করার জন্য, থ্রেডগুলি প্রয়োজনীয়: পৃথক থ্রেডে আইও ব্লক করুন do এটি একটি কুরুচিপূর্ণ সমাধান এবং অনেকগুলি ওভারহেডের কারণ করে।

এটি হার্ডওয়ার স্তরে আরও খারাপ:

  • সঙ্গে , DMA CPU- র দ্বারা অ্যাসিঙ্ক্রোনাস আই offloads।
  • আইও ডিভাইস এবং মেমরির মধ্যে ডেটা সরাসরি স্থানান্তরিত হয়।
  • কার্নেল এটিকে একটি সিঙ্ক্রোনাস, ব্লকিং সিস্টেমে কল করে।
  • নোড.জেএস ব্লকিং সিস্টেম কলকে একটি থ্রেডে আবৃত করে।

এটি কেবল সাধারণ নির্বোধ এবং অদক্ষ। তবে এটি কমপক্ষে কাজ করে! আমরা নোড.জেএস উপভোগ করতে পারি কারণ এটি ইভেন্ট-চালিত অ্যাসিঙ্ক্রোনাস আর্কিটেকচারের পিছনে কুৎসিত এবং জটিল বিষয়গুলি গোপন করে।

ভবিষ্যতে কেউ ফাইলের জন্য ও _ ননব্লক বাস্তবায়ন করবেন? ...

সম্পাদনা: আমি বন্ধুর সঙ্গে এই আলোচিত এবং তিনি আমাকে একথা বলেন থ্রেড বিকল্প সঙ্গে পোলিং হয় নির্বাচন : 0 একটি সময়সীমার নির্দিষ্ট করতে ও ফিরে ফাইল বর্ণনাকারী উপর আই না (এখন যে তারা ব্লক না নিশ্চিত করা হয়)।


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

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

28

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

1) জনপ্রিয় উত্তরের একটিতে সিউডো-কোডে মন্তব্য করা উপাদান

result = query( "select smurfs from some_mushroom" );
// twiddle fingers
go_do_something_with_result( result );

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

2) "থ্রেডগুলি শক্ত", কেবল ডেটা ভাগ করে নেওয়ার প্রসঙ্গেই তা উপলব্ধি করে। যদি আপনার কাছে স্বাধীন ওয়েব অনুরোধগুলি পরিচালনা করার ক্ষেত্রে যেমন স্বাধীনভাবে থ্রেড থাকে তবে থ্রেডিং তুচ্ছভাবে সহজ, আপনি কেবল একটি কাজ কীভাবে পরিচালনা করবেন তার রৈখিক প্রবাহকে ঠিকঠাক করে দিয়েছেন এবং এটি একাধিক অনুরোধগুলি পরিচালনা করবে এবং এই বিষয়টি জেনে চমত্কার হয়ে বসে আছেন each কার্যকরভাবে স্বাধীন হবে। ব্যক্তিগতভাবে, আমি উদ্যোগ নেব যে বেশিরভাগ প্রোগ্রামারদের জন্য ক্লোজার / কলব্যাক মেকানিজম শিখতে কেবল উপরে থেকে নীচে থ্রেড সংস্করণটি কোডিংয়ের চেয়ে জটিল। (তবে হ্যাঁ, যদি আপনাকে থ্রেডগুলির মধ্যে যোগাযোগ করতে হয়, জীবন সত্যই দ্রুততর হয়ে ওঠে তবে আমি এই বিষয়ে অনিচ্ছুক না যে বন্ধ / কলব্যাক প্রক্রিয়াটি সত্যিই পরিবর্তিত হয়, এটি কেবল আপনার বিকল্পগুলিকে সীমাবদ্ধ করে, কারণ এই পদ্ধতিটি এখনও থ্রেডগুলির সাথে অর্জনযোগ্য) যাইহোক, যে '

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

৪) অন্যান্য ওয়েবসার্ভারের তুলনায় নোডের চেয়ে কতটা তীব্র তাত্পর্যপূর্ণ তা দেখানোর জন্য আমি পূর্বের সাথে যে সমস্ত চিত্র দেখেছি সেগুলি ভয়াবহভাবে ত্রুটিযুক্ত, তবে এগুলি এমনভাবে ত্রুটিযুক্ত যা অপ্রত্যক্ষভাবে একটি সুবিধা চিত্রিত করে যা আমি অবশ্যই নোডের জন্য গ্রহণ করব (এবং এটি কোনওভাবেই তুচ্ছ নয়)। নোডের টিউনটির প্রয়োজন (এমনকি অনুমতিও দেয় না, এমনকি ਅਸਲে অনুমতিও দেয় না) doesn't আপনার যদি থ্রেডযুক্ত মডেল থাকে, আপনার প্রত্যাশিত লোডটি পরিচালনা করতে পর্যাপ্ত থ্রেড তৈরি করতে হবে। এটি খারাপভাবে করুন, এবং আপনার খারাপ অভিনয় শেষ হবে। যদি খুব কম থ্রেড থাকে, তবে সিপিইউ নিষ্ক্রিয়, তবে আরও অনুরোধগুলি গ্রহণ করতে অক্ষম, প্রচুর থ্রেড তৈরি করতে পারে এবং আপনি কার্নেল মেমরি নষ্ট করবেন এবং জাভা পরিবেশের ক্ষেত্রে, আপনি মূল হিপ মেমরিটিও নষ্ট করবেন । এখন, জাভার জন্য, নষ্ট করা নষ্ট করা প্রথম, সেরা, সিস্টেমের কার্যকারিতা স্ক্রু করার উপায়, কারণ দক্ষ আবর্জনা সংগ্রহ (বর্তমানে, এটি জি 1 এর সাথে পরিবর্তিত হতে পারে, তবে মনে হয় যে জুরিটি এখনও কমপক্ষে 2013 সালের শুরুর দিকে সেই পয়েন্টে বাইরে রয়েছে) প্রচুর অতিরিক্ত গাদা রাখার উপর নির্ভর করে। সুতরাং, সমস্যাটি আছে, এটি খুব কয়েকটি থ্রেডের সাথে টিউন করুন, আপনার অলস সিপিইউ রয়েছে এবং খারাপ থ্রুপুট রয়েছে, এটির সাথে অনেকগুলি টিউন করুন, এবং এটি অন্য উপায়ে ঝাঁকুনিতে পড়ে।

5) আরও একটি উপায় আছে যেখানে আমি দাবিটির যুক্তিটি স্বীকার করি যে নোডের পদ্ধতির "ডিজাইনের মাধ্যমে দ্রুত" এবং এটি এটি। বেশিরভাগ থ্রেড মডেল একটি সময়-কাটা প্রসঙ্গের স্যুইচ মডেল ব্যবহার করেন যা আরও উপযুক্ত (মান বিচারের সতর্কতা :) এবং আরও দক্ষ (কোনও মান রায় নয়) প্রিমিটিভ মডেলের উপরে স্তরযুক্ত। এটি দুটি কারণে হয়, প্রথমত, বেশিরভাগ প্রোগ্রামাররা অগ্রাধিকারের পূর্ববর্তীতা বোঝে না বলে মনে হয় এবং দ্বিতীয়ত, আপনি যদি উইন্ডোজ পরিবেশে থ্রেডিং শিখেন তবে টাইমসাইলিংটি আপনার পছন্দ হয় বা না তা অবশ্যই আছে (অবশ্যই, এটি প্রথম পয়েন্টটিকে শক্তিশালী করে উল্লেখযোগ্যভাবে, জাভার প্রথম সংস্করণগুলি সোলারিস বাস্তবায়নের উপর অগ্রাধিকারের প্রাকिमেশন এবং উইন্ডোজে সময়সূচী ব্যবহার করেছিল Because কারণ বেশিরভাগ প্রোগ্রামার বুঝতে পারেনি এবং অভিযোগ করেছিলেন যে "সোলারিসে থ্রেডিং কাজ করে না" complained তারা সর্বত্র মডেলকে টাইমসাইলে পরিবর্তন করেছে)। যাইহোক, নীচের লাইনটি হ'ল টাইমসাইলিং অতিরিক্ত (এবং সম্ভাব্য অপ্রয়োজনীয়) প্রসঙ্গের সুইচ তৈরি করে। প্রতিটি কনটেক্সট স্যুইচ সিপিইউ সময় নেয়, এবং সেই সময় কার্যকরভাবে কাজ থেকে সরিয়ে ফেলা হয় যা হাতের আসল কাজটিতে করা যেতে পারে। তবে সময়সীমার কারণে কনটেক্সট স্যুইচিংয়ে যে পরিমাণ সময় ব্যয় করা হয়েছে তা সামগ্রিক সময়ের খুব সামান্য শতাংশের বেশি হওয়া উচিত নয়, যদি না অপূর্বর কিছু ঘটে থাকে না, এবং এমন কোনও কারণ ঘটতে পারে বলে আমি আশা করতে পারি না সাধারণ ওয়েবসার্ভার)। সুতরাং, হ্যাঁ, সময়সূচিতে জড়িত অতিরিক্ত প্রসঙ্গের স্যুইচগুলি অদক্ষ (এবং এগুলি এর মধ্যে ঘটে না এবং সেই সময়টি কার্যকরভাবে সেই কাজ থেকে সরিয়ে ফেলা হয় যা হাতে আসল কাজটিতে করা যায়। তবে সময়সীমার কারণে কনটেক্সট স্যুইচিংয়ে যে পরিমাণ সময় ব্যয় করা হয়েছে তা সামগ্রিক সময়ের খুব সামান্য শতাংশের বেশি হওয়া উচিত নয়, যদি না অপূর্বর কিছু ঘটে থাকে না, এবং এমন কোনও কারণ ঘটতে পারে বলে আমি আশা করতে পারি না সাধারণ ওয়েবসার্ভার)। সুতরাং, হ্যাঁ, সময়সূচিতে জড়িত অতিরিক্ত প্রসঙ্গের স্যুইচগুলি অদক্ষ (এবং এগুলি এর মধ্যে ঘটে না এবং সেই সময়টি কার্যকরভাবে সেই কাজ থেকে সরিয়ে ফেলা হয় যা হাতে আসল কাজটিতে করা যায়। তবে সময়সীমার কারণে কনটেক্সট স্যুইচিংয়ে যে পরিমাণ সময় ব্যয় করা হয়েছে তা সামগ্রিক সময়ের খুব সামান্য শতাংশের বেশি হওয়া উচিত নয়, যদি না অপূর্বর কিছু ঘটে থাকে না, এবং এমন কোনও কারণ ঘটতে পারে বলে আমি আশা করতে পারি না সাধারণ ওয়েবসার্ভার)। সুতরাং, হ্যাঁ, সময়সূচিতে জড়িত অতিরিক্ত প্রসঙ্গের স্যুইচগুলি অদক্ষ (এবং এগুলি এর মধ্যে ঘটে নাবিধি হিসাবে বিধি হিসাবে কার্নেল থ্রেড, তবে পার্থক্য হবে থ্রুটপুট কয়েক শতাংশ, পুরোপুরি নোডের জন্য জড়িত কর্মক্ষমতা দাবির মধ্যে পুরো সংখ্যার কারণগুলির অন্তর্ভুক্ত নয় kind

যাইহোক, এগুলি দীর্ঘ এবং র‌্যাম্পল হওয়ার জন্য ক্ষমাপ্রার্থী, তবে আমি সত্যিই অনুভব করি যে এখনও পর্যন্ত আলোচনার কোনও প্রমাণই পাওয়া যায়নি এবং আমি এই পরিস্থিতিতে যে কোনও একটির কাছ থেকে শুনে সন্তুষ্ট হব:

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

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

চিয়ার্স, টবি


2
থ্রেড সহ একটি সমস্যা: তাদের র‌্যাম দরকার। খুব ব্যস্ত সার্ভার কয়েক হাজার থ্রেড পর্যন্ত চালাতে পারে। নোড.জেএস থ্রেডগুলি এড়িয়ে যায় এবং এইভাবে আরও কার্যকর। দক্ষতা কোড দ্রুত চালানোর দ্বারা হয় না। কোড থ্রেডে বা ইভেন্টের লুপে চালিত হয় তা বিবেচ্য নয়। সিপিইউর জন্য এটি একই রকম। তবে থ্রেডগুলি সরিয়ে আমরা র‌্যাম সংরক্ষণ করি: কয়েক হাজার স্ট্যাকের পরিবর্তে কেবল একটি স্ট্যাক। এবং আমরা প্রসঙ্গের সুইচগুলিও সংরক্ষণ করি।
এলোমেলোভাবে

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

1
এছাড়াও নোড র‌্যামে কলব্যাকের ক্লোজার সঞ্চয় করে, তাই এটি কোথায় জেতে তা আমি দেখতে পাচ্ছি না।
ওলেকসান্ডার পাপচেনকো

@ লেভি তবে নোডেজগুলি "অনুরোধ অনুযায়ী একটি থ্রেড" সাজানোর জিনিস ব্যবহার করে না। এটি একটি আইও থ্রেডপুল ব্যবহার করে, সম্ভবত অ্যাসিনক্রোনাস আইও এপিআই ব্যবহার করে জটিলতা এড়াতে (এবং সম্ভবত পসিক্সকে open()অ-ব্লক করা যায় না?)। এইভাবে, এটি কোনও পারফরম্যান্স হিটকে amortizes যেখানে traditional তিহ্যবাহী fork()/ pthread_create()-আন-অনুরোধ মডেলটিকে থ্রেড তৈরি করতে এবং ধ্বংস করতে হবে। এবং, পোস্টস্ক্রিপ্ট এ হিসাবে উল্লিখিত হয়েছে), এটি স্ট্যাক স্পেস ইস্যুটিকেও মোড়ক করে। আপনি সম্ভবত হাজার হাজার অনুরোধ পরিবেশন করতে পারেন, বলুন, 16 আইও থ্রেড ঠিক আছে।
বিনকি

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

14

আমি যা বুঝতে পারি না তা হ'ল নোড.জেএস এখনও থ্রেড ব্যবহার করছে।

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


11

থ্রেডগুলি কেবলমাত্র অ্যাসিক্রোনাস সুবিধা মতো ফাংশনগুলির সাথে ডিল করার জন্য ব্যবহৃত হয় stat()

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


7

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

এখন একটি থ্রেড তৈরি করে প্রথম অনুরোধটি প্রকাশক বস্তু হিসাবে কল্পনা করুন, স্ট্যাটিকফিল.এক্স এর জন্য কোনও প্রকাশক অবজেক্ট আছে কিনা তা অন্য 99 টি অনুরোধ প্রথমে দেখে নিন, যদি তা হয়, কাজটি করার সময় এটি শোনো, অন্যথায় একটি নতুন থ্রেড শুরু করুন এবং এভাবে একটি নতুন প্রকাশক অবজেক্ট

একবার একক থ্রেডটি সম্পন্ন হয়ে গেলে, এটি সমস্ত 100 শ্রোতার কাছে স্ট্যাটিকফিল.এক্স পাস করে এবং নিজেকে নষ্ট করে দেয়, সুতরাং পরবর্তী অনুরোধটি একটি নতুন থ্রেড এবং প্রকাশক অবজেক্ট তৈরি করে।

সুতরাং এটি উপরের উদাহরণে 100 থ্রেড বনাম 1 থ্রেড, তবে এটির জন্যও 100 ডিস্ক লুকআপের পরিবর্তে 1 টি ডিস্ক লুকআপ, লাভটি বেশ ফেনোমিনাল হতে পারে। রায়ান একজন স্মার্ট লোক!

দেখার আরেকটি উপায় হ'ল সিনেমার শুরুতে তাঁর অন্যতম উদাহরণ। পরিবর্তে:

pseudo code:
result = query('select * from ...');

আবার, একটি ডাটাবেস বনাম 100 টি পৃথক প্রশ্নগুলি ...:

pseudo code:
query('select * from ...', function(result){
    // do stuff with result
});

যদি কোনও ক্যোয়ারী ইতিমধ্যে চলছিল, অন্য সমান কোয়েরিগুলি ব্যান্ডওয়াগনে কেবল লাফিয়ে উঠবে, সুতরাং আপনার একক ডাটাবেস রাউন্ডট্রিপটিতে 100 টি প্রশ্ন থাকতে পারে।


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

ইভেন্ট লুপগুলি কীভাবে আরও দক্ষতা সরবরাহ করতে পারে তা বোঝানোর জন্য এটি কেবল একটি বিমূর্ত উদাহরণ, অতিরিক্ত মডিউল ছাড়াই নোডেজ ডিবি'র সাথে কিছুই করেন না;)
বিজিরিসসেন

1
হ্যাঁ আমার মন্তব্যটি একটি একক ডাটাবেস রাউন্ডট্রিপের 100 টি প্রশ্নের পক্ষে বেশি ছিল। : পি
টোর ভ্যালামো

2
হাই বিজিরিসেন: দুর্দান্ত পোস্ট। সুতরাং, যখন কোনও কোয়েরি কার্যকর করা হচ্ছে, তখন অন্যান্য অনুরূপ অনুসন্ধানগুলি স্ট্যাটিকফাইলে যেমন "শ্রোতা" করবে? এক্স উদাহরণস্বরূপ? উদাহরণস্বরূপ, 100 ব্যবহারকারী একই ক্যোয়ারীটি পুনরুদ্ধার করছেন, কেবলমাত্র একটি কোয়েরি কার্যকর করা হবে এবং অন্যান্য 99 জন প্রথমটি শুনছেন? ধন্যবাদ!
চাপা

1
আপনি এটিকে নোডেজের মতো শব্দ করে তুলছেন যা স্বয়ংক্রিয়ভাবে ফাংশন কল বা কোনও কিছুর স্মৃতিচারণ করে। এখন, আপনার জাভাস্ক্রিপ্টের ইভেন্টের লুপ মডেলের ভাগ করা মেমরি সিঙ্ক্রোনাইজেশন সম্পর্কে চিন্তা করার দরকার নেই, তাই মেমরিতে জিনিসগুলি নিরাপদে ক্যাশে করা সহজ ache তবে এর অর্থ এই নয় যে নোডেজগুলি যাদুকরীভাবে এটি আপনার জন্য করে বা এটি যে পারফরম্যান্স বর্ধনের বিষয়ে জিজ্ঞাসা করা হচ্ছে।
বিনকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.