টুইস্টে থাকা নির্বাচন / পোল বনাম এপল রিএ্যাক্টরের গুহাত ave


95

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

এপল এবং বিকল্পগুলির মধ্যে কয়েক ডজন তুলনা পড়লে বোঝা যায় যে এপল স্পষ্টতই গতি এবং স্কেলিবিলিটির জন্য চ্যাম্পিয়ন, বিশেষত এটি লিনিয়ার ফ্যাশনে স্কেল করে যা দুর্দান্ত। বলেছিল, প্রসেসর এবং মেমরির ব্যবহার সম্পর্কে কী, এপল এখনও চ্যাম্প?

উত্তর:


191

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

যদিও একটি ব্যাখ্যা। উভয়ই নির্বাচন করুন এবং এপল স্কেল রৈখিকভাবে। তবে একটি বড় পার্থক্য হ'ল ইউজারস্পেস-ফেসিং এপিআইগুলির জটিলতা রয়েছে যা বিভিন্ন জিনিসের উপর ভিত্তি করে। selectকলটির ব্যয় আপনি সর্বাধিক সংখ্যাযুক্ত ফাইল বর্ণনাকারীর মান সহ মোটামুটিভাবে চলে যায়। আপনি যদি একক এফডি, ১০০ বাছাই করেন, তবে এটি কোনও একক এফডি বাছাইয়ের চেয়ে দ্বিগুণ ব্যয়বহুল। 50. সর্বোচ্চের নিচে আরও fd যোগ করা নিখরচায় নয়, সুতরাং এটি অনুশীলনের চেয়ে কিছুটা জটিল but বেশিরভাগ বাস্তবায়নের জন্য একটি ভাল প্রথম অনুমান।

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

এই সমস্তটির অর্থ হল যে এপল বেশিরভাগ কাজের চাপের জন্য কম সিপিইউ ব্যবহারের দিকে নিয়ে যাবে। মেমরির ব্যবহার যতদূর যায়, এটি কিছুটা টস আপ। selectএকটি অত্যন্ত কমপ্যাক্ট উপায়ে (ফাইল বিস্তৃত প্রতি এক বিট) সমস্ত প্রয়োজনীয় তথ্য উপস্থাপন পরিচালনা করে। এবং আপনি কতগুলি ফাইল বর্ণনাকারী ব্যবহার করতে পারবেন তার FD_SETSIZE (সাধারণত 1024) সীমাবদ্ধতা এর selectঅর্থ এই যে আপনি যে তিনটি এফডি সেট ব্যবহার করতে পারবেন তার জন্য 128 বাইটের বেশি কখনই ব্যয় করবেন না thatselect(পড়ুন, লিখুন, ব্যতিক্রম)। সেই 384 বাইট সর্বাধিকের সাথে তুলনা করে, এপোলটি শুকরের মতো। প্রতিটি ফাইল বর্ণনাকারী একটি বহু-বাইট গঠন দ্বারা প্রতিনিধিত্ব করা হয়। তবে, নিখুঁত শর্তে, এটি এখনও খুব বেশি স্মৃতি ব্যবহার করে না। আপনি কয়েক ডজন কিলোবাইট (প্রায় 1000 কে প্রতি ফাইলের বর্ণনাকারী 20k,) মনে করে বিপুল সংখ্যক ফাইল বর্ণনাকারী উপস্থাপন করতে পারেন। এবং আপনি এই সত্যটিও ফেলে দিতে পারেন যে আপনি selectকেবলমাত্র একটি ফাইল বর্ণনাকারী নিরীক্ষণ করতে চান তবে আপনাকে সেই বাইটগুলির সমস্ত 384 ব্যয় করতে হবে তবে এর মান 1024 হবে, এপল সহ আপনি কেবল 20 বাইট ব্যয় করতে পারবেন। তবুও, এই সমস্ত সংখ্যা বেশ ছোট, তাই এটি খুব বেশি পার্থক্য করে না।

এবং এপলের অন্যান্য সুবিধাগুলি রয়েছে, যা আপনি সম্ভবত ইতিমধ্যে অবগত আছেন যে এটি FD_SETSIZE ফাইল বর্ণনাকারীর মধ্যে সীমাবদ্ধ নয়। আপনার যতগুলি ফাইল ডেস্ক্রিপ্টার রয়েছে তা পর্যবেক্ষণ করতে আপনি এটি ব্যবহার করতে পারেন। এবং যদি আপনার কাছে কেবল একটি ফাইল বর্ণনাকারী থাকে তবে এর মান এফডি_এসটিএসআইআইএসের চেয়ে বেশি হয়, এপলটিও এটির সাথে কাজ করে, তবে selectতা হয় না।

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

অন্যদিকে, কোনও ফাইল বর্ণনাকারী নিরীক্ষণ করতে বলা হলে epollত্রুটি ( EPERMসম্ভবত স্পষ্টভাবে) দিয়ে দ্রুত ব্যর্থ হবে । কঠোরভাবে বলতে গেলে, এটি খুব কমই ভুল। এটি কেবল একটি সুস্পষ্ট উপায়ে এর সমর্থন অভাব ইঙ্গিত দিচ্ছে। সাধারণত আমি সুস্পষ্ট ব্যর্থতার শর্তগুলির প্রশংসা করব, তবে এইটি একটি অনির্ধারিত (যতদূর আমি বলতে পারি) এবং ফলস্বরূপ সম্পূর্ণরূপে ভাঙা অ্যাপ্লিকেশনটির ফলস্বরূপ, যা কেবল সম্ভাব্য অবনমিত কার্য সম্পাদন করে ope

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


খুব সুন্দর উত্তর। pollসম্পূর্ণতার আচরণ সম্পর্কে স্পষ্ট হওয়া বিবেচনা করুন ?
কোয়ার্ক

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

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

4
@ জিন-পল আপনি কিউ কিউ সম্পর্কে কিছু ব্যাখ্যা যোগ করতে পারেন?
শুভ ব্যক্তি

পারফরম্যান্সকে একপাশে রেখেই কি কোনও সমস্যা রয়েছে যার থেকে (এর man select) লিনাক্স কার্নেল কোনও নির্দিষ্ট সীমাবদ্ধতা আরোপ করে না, তবে গ্লিবিক প্রয়োগটি fd_set কে একটি নির্দিষ্ট আকারের ধরণের করে, যার সাথে FD_SETSIZE 1024 হিসাবে সংজ্ঞায়িত করা হয়, এবং FD _ * () ম্যাক্রোগুলি অনুসারে কাজ করে যে সীমা। 1023 এর বেশি ফাইল বর্ণনাকারীদের নিরীক্ষণের জন্য, পরিবর্তে পোল (2) ব্যবহার করুন। সেন্টোস already-তে আমি ইতিমধ্যে এমন সমস্যাগুলি দেখেছি যেখানে আমার নিজস্ব কোড একটি নির্বাচন () ব্যর্থ হয়েছে কারণ কার্নেলটি একটি ফাইল হ্যান্ডেল> 1023 ফিরিয়ে দিয়েছে এবং আমি বর্তমানে এমন একটি সমস্যা দেখছি যা গন্ধযুক্ত হতে পারে একই সমস্যাটিকে ট্যুইস্ট করা হতে পারে।
পল ডি স্মিথ

4

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

সময়সাপেক্ষে নেটওয়ার্ক থেকে পড়ার চেষ্টা করার সময়, একটি এপল_এফডি তৈরি করুন (এফডি_এসটি পরিবর্তে) এবং এফডি_এফডি এফডি যুক্ত করা, এফডি_এসইটি (যা একটি সাধারণ ম্যালোক) তৈরি করার চেয়ে অনেক বেশি ব্যয়বহুল।

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

এই ধরণের ব্যবহারের ক্ষেত্রে উচ্চ কার্যকারিতা অ্যাপ্লিকেশনগুলিতে বিরল, কারণ একটি চুল্লী মডেলটি প্রতিবার নতুন এপল_এফডি তৈরি করার প্রয়োজন হয় না। যে মডেলটির জন্য একটি এপল_এফডি দীর্ঘকালীন --- যা উচ্চতর পারফরম্যান্স সার্ভার ডিজাইনের জন্য পরিষ্কারভাবে পছন্দ করা হয় --- এপলটি প্রতিটি উপায়ে স্পষ্ট বিজয়ী।


5
তবে আপনি select()যদি 10k + রেঞ্জের ফাইল বর্ণনাকারী মানগুলি নাও ব্যবহার করতে পারবেন না - যদি না আপনি FD_SETSIZE পরিবর্তন করতে আপনার অর্ধেক সিস্টেমটি পুনরায় সংকলন করেন - তবে আমি ভাবছি কীভাবে এই কৌশলটি আদৌ কার্যকর হয়েছিল। আপনি বর্ণিত দৃশ্যের জন্য, আমি সম্ভবত এটি দেখতে চেয়েছি poll()যা দেখতে এর select()চেয়ে অনেক বেশি পছন্দ করে epoll()- তবে FD_SETSIZE সীমাবদ্ধতাটি সরিয়ে দেয়।
জিন-পল ক্যালডেরন

10 কে রেঞ্জের ফাইল বর্ণনাকারী মান থাকলে আপনি নির্বাচন () নির্বাচন করতে পারেন, কারণ আপনি কোনও এফডি_এসইটি ম্যালোক করতে পারেন। প্রকৃতপক্ষে, যেহেতু FD_SETSIZE সংকলন করার সময় এবং আসল fd সীমা রানটাইমের সময়, কেবলমাত্র FD_SET- র নিরাপদ ব্যবহার FD_SET আকারের বিপরীতে ফাইল বর্ণনাকারীর সংখ্যা পরীক্ষা করে এবং যদি FD_SET হয় তবে একটি ম্যালোক (বা নৈতিক সমতুল্য) করে খুব ছোট. আমি যখন একজন গ্রাহকের সাথে এটি প্রযোজনায় দেখেছি তখন আমি হতবাক হয়ে গিয়েছিলাম। 20 বছর ধরে সকেট প্রোগ্রাম করার পরে, আমি যে কোডটি লিখেছিলাম সেগুলির সমস্তগুলি - এবং ওয়েবে বেশিরভাগ টিউটোরিয়াল - অনিরাপদ।
ব্রায়ান বাল্কোভস্কি

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