প্রসঙ্গটি নতুন লিনাক্স কার্নেলগুলিতে অনেক ধীর গতিতে স্যুইচ করে


100

আমরা আমাদের সার্ভারের ওএসকে উবুন্টু 10.04 এলটিএস থেকে উবুন্টু 12.04 এলটিএসে আপগ্রেড করতে চাইছি। দুর্ভাগ্যক্রমে, দেখে মনে হচ্ছে যে একটি থ্রেড চালানো যে প্রচ্ছন্নতাটি চলনযোগ্য হয়ে উঠেছে তা 2.6 কার্নেল থেকে 3.2 কার্নেলের মধ্যে উল্লেখযোগ্যভাবে বৃদ্ধি পেয়েছে। বাস্তবে আমরা যে বিলম্বের সংখ্যা পাচ্ছি তা বিশ্বাস করা শক্ত।

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

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

কার্নেল ২.6.৩২ এ, এই বিলম্বটি কোথাও আমাদের ২.৮-৩.৫ এর অর্ডারে রয়েছে, যা যুক্তিসঙ্গত। কার্নেল ৩.২.০-তে, আমাদের 40-100 ক্রম অনুসারে এই বিলম্বটি কোথাও বেড়েছে। আমি দুটি হোস্টের মধ্যে হার্ডওয়্যারে কোনও পার্থক্য বাদ দিয়েছি। তারা অভিন্ন হার্ডওয়্যারে চালিত হয় (হাইপারথ্রেডিং, স্পিডস্টেপ এবং সমস্ত সি রাজ্য বন্ধ করে দিয়ে ডুয়াল সকেট X5687 {ওয়েস্টমিয়ার-ইপি} প্রসেসরগুলি 3.6 গিগাহার্টজ এ চলছে)। পরীক্ষার অ্যাপ্লিকেশন থ্রেডগুলির সাদৃশ্যকে একই সকেটের স্বতন্ত্র শারীরিক কোরগুলিতে চালনার জন্য পরিবর্তন করে (যেমন, প্রথম থ্রেডটি কোর 0 এবং দ্বিতীয় থ্রেডটি কোর 1 এ চালানো হয়), সুতরাং থ্রেডগুলির কোনও উত্থান নেই on সকেটের মধ্যে কোর বা বাউন্স / যোগাযোগ

দুটি হোস্টের মধ্যে পার্থক্যটি হ'ল একটি কার্নেল 2.6.32-28 (দ্রুত প্রসঙ্গের সুইচ বাক্স) সহ উবুন্টু 10.04 এলটিএস চালাচ্ছে এবং অন্যটি কর্নেল 3.2.0-23 সহ সর্বশেষতম উবুন্টু 12.04 এলটিএস চালাচ্ছে (ধীর প্রসঙ্গ) সুইচ বক্স). সমস্ত BIOS সেটিংস এবং হার্ডওয়্যার অভিন্ন।

কার্নেলটিতে এমন কোনও পরিবর্তন হয়েছে যা এই হাস্যকর ধীরে ধীরে ধীরে ধীরে ধীরে চালিত হতে পারে যাতে কোনও থ্রেডটি চালিত হতে সময় লাগে?

আপডেট: আপনি যদি আপনার হোস্ট এবং লিনাক্স বিল্ডে পরীক্ষা চালাতে চান তবে আমি আপনার অনুমানের জন্য কোডটি পেস্টবিনে পোস্ট করেছি । এর সাথে সংকলন:

g++ -O3 -o test_latency test_latency.cpp -lpthread

(আপনার কমপক্ষে একটি দ্বৈত-কোর বাক্স রয়েছে তা ধরে নিয়ে) চালনা করুন:

./test_latency 0 1 # Thread 1 on Core 0 and Thread 2 on Core 1

আপডেট 2 : কার্নেলের প্যারামিটারগুলি, কার্নেলের পরিবর্তনগুলি এবং ব্যক্তিগত গবেষণার পোস্টগুলির পরে অনেক অনুসন্ধানের পরে, আমি সমস্যাটি কী তা বুঝতে পেরেছি এবং এই প্রশ্নের উত্তর হিসাবে সমাধান পোস্ট করেছি।


4
কেবল একটি অনুমান, কিন্তু হতে /proc/sys/kernel/*পারে একটি পরামিতি পরিবর্তন কাজ করতে পারে? যদি আপনি কাজ করে এমন /etc/sysctl.confকোনও কিছু খুঁজে পান, তবে এটি কনফিগারেশন বা কোনও ফাইল /etc/sysctl.d/এটিকে পুনরায় বুট চালিয়ে যাওয়ার জন্য রাখুন।
কার্লোস ক্যাম্পার্ডার্স

4
আমি দুটি হোস্টের মধ্যে / proc / sys / কার্নেল তুলনা করেছিলাম, তবে কোনও তফসিল সম্পর্কিত কোনও কনফিগারেশন আইটেমগুলিতে কোনও অর্থপূর্ণ পার্থক্য দেখতে পাই না।
মাইকেল গোল্ডশটেন

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

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

কেবল একটি সাধারণ মন্তব্য - সিএসক্রোনাইজ করার জন্য টিএসসির উপর নির্ভর করা সবচেয়ে ভাল তবে আপনার নির্দিষ্ট ক্ষেত্রে, যেহেতু আপনি একটি শারীরিক চিপে দুটি কোর ব্যবহার করছেন, এটি আসলে কাজ করা উচিত।
twalberg

উত্তর:


96

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

আপনার সিপিউডে বর্তমানে কোন সিপুইডল ড্রাইভার সক্রিয় রয়েছে তা দেখতে, কেবল current_driverনীচের cpuidleঅংশে ফাইলটি ক্যাট করুন /sys/devices/system/cpu:

cat /sys/devices/system/cpu/cpuidle/current_driver

যদি আপনি চান যে আপনার আধুনিক লিনাক্স ওএসে সর্বাধিক প্রসঙ্গের স্যুইচ ল্যাটেন্সি সম্ভব, এই সমস্ত পাওয়ার সাশ্রয় বৈশিষ্ট্যগুলি অক্ষম করতে নিম্নলিখিত কার্নেল বুট পরামিতিগুলি যুক্ত করুন:

উবুন্টু 12.04-এ, আপনি এগুলিতে GRUB_CMDLINE_LINUX_DEFAULTপ্রবেশ করে /etc/default/grubএবং তারপরে চালিয়ে এটি করতে পারেন update-grub। যোগ করার জন্য বুট প্যারামিটারগুলি হ'ল:

intel_idle.max_cstate=0 processor.max_cstate=0 idle=poll

তিনটি বুট অপশন কী করে সে সম্পর্কে এখানে বিশ্রী বিবরণ রয়েছে:

intel_idle.max_cstateশূন্যে সেট করা হয় আপনার সিপিউডল ড্রাইভারকে acpi_idle(অন্তত বিকল্পের ডকুমেন্টেশন অনুযায়ী) এ রূপান্তর করবে, বা এটি সম্পূর্ণরূপে অক্ষম করবে। আমার বাক্সে এটি সম্পূর্ণরূপে অক্ষম করা আছে (অর্থাত্, current_driverফাইলটি প্রদর্শিত হলে /sys/devices/system/cpu/cpuidleআউটপুট তৈরি হয় none)। এই ক্ষেত্রে দ্বিতীয় বুট বিকল্পটি processor.max_cstate=0অপ্রয়োজনীয়। যাইহোক, ডকুমেন্টেশনটিতে বলা হয়েছে যে intel_idleড্রাইভারের জন্য ম্যাক্সসিস্টেট শূন্যে সেট করা উচিত ড্রাইভারকে ওএসকে ফিরিয়ে আনতে হবে acpi_idle। অতএব, আমি ঠিক দ্বিতীয় ক্ষেত্রে দ্বিতীয় বুট বিকল্পটি রেখেছি।

processor.max_cstateবিকল্পের জন্য সর্বাধিক সি রাষ্ট্র সেট করে acpi_idleআশা ভাল হিসাবে এটি অক্ষম করা, শুন্যতে ড্রাইভার। আমি এটি পরীক্ষা করতে পারি এমন কোনও সিস্টেম আমার নেই, কারণ intel_idle.max_cstate=0আমার কাছে উপলব্ধ সমস্ত হার্ডওয়্যারগুলিতে সিপুইডল ড্রাইভারকে পুরোপুরি নক করে। যাইহোক, যদি আপনার ইনস্টলেশন থেকে প্রত্যাবর্তন করে intel_idleকরতে acpi_idleমাত্র প্রথম বুট বিকল্প, আমাকে যদি দ্বিতীয় বিকল্প, দয়া করে processor.max_cstateকরেনি তা যে আমি এই উত্তর আপডেট করতে পারেন মন্তব্যে কি তাই নথিভুক্ত করা হয়।

অবশেষে, তিনটি প্যারামিটারের সর্বশেষ, idle=pollএকটি বাস্তব শক্তি হগ। এটি সি 1 / সি 1 ই অক্ষম করবে, যা অনেক বেশি বিদ্যুত খরচ ব্যয় করে চূড়ান্ত বাকী বিটটি সরিয়ে ফেলবে, সুতরাং যখন এটি সত্যই প্রয়োজন তখনই এটি ব্যবহার করুন। বেশিরভাগ ক্ষেত্রে এটি ওভারকিল হবে, যেহেতু সি 1 * লেটেন্সি এত বড় নয়। মূল পরীক্ষায় আমি বর্ণনা করা হার্ডওয়ারে চালিত আমার পরীক্ষার অ্যাপ্লিকেশনটি ব্যবহার করে, বিলম্বিতাটি 9 থেকে আমাদের 3 এ চলে গেছে। এটি অত্যন্ত মাত্রায় সংবেদনশীল অ্যাপ্লিকেশনগুলির জন্য অবশ্যই একটি উল্লেখযোগ্য হ্রাস (যেমন, আর্থিক বাণিজ্য, উচ্চ নির্ভুলতা টেলিমেট্রি / ট্র্যাকিং, উচ্চ ফ্রিক্স। ডেস্কটপ অ্যাপ্লিকেশন। নিশ্চিতরূপে জানার একমাত্র উপায় হ'ল আপনার অ্যাপ্লিকেশনটির কার্যকারিতা উন্নতির জন্য প্রোফাইল to

হালনাগাদ:

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

intel_idle.max_cstate=0 processor.max_cstate=0 idle=mwait

idle=mwaitপরিবর্তে এর ব্যবহার idle=pollটার্বো বুস্টের সূচনা (সিপিইউকে তার টিডিপি [তাপীয় নকশার শক্তি] এর নীচে থাকতে সহায়তা করে) এবং হাইপারথ্রেডিং (যার জন্য এমডব্লিউএআইটি একটি সম্পূর্ণ শারীরিক কোর গ্রহণ না করার জন্য আদর্শ পদ্ধতি) একই সাথে উচ্চতর সি রাজ্যগুলি এড়িয়ে যাওয়ার সময়)। এটি এখনও পরীক্ষায় প্রমাণিত হয়নি, যা আমি চালিয়ে যাব।

আপডেট 2:

mwaitঅলস বিকল্প হয়েছে নতুন 3.x কার্নেলের থেকে সরানো (আপডেট জন্য ব্যবহারকারীকে ck_ ধন্যবাদ)। এটি দুটি বিকল্প সহ আমাদের ছেড়ে দেয়:

idle=halt- পাশাপাশি কাজ করা উচিত mwait, তবে এটি আপনার হার্ডওয়ারের ক্ষেত্রেও নিশ্চিত কিনা তা পরীক্ষা করে দেখুন। HLTনির্দেশ প্রায় সমতূল্য MWAITরাষ্ট্র ইঙ্গিতটি 0. সত্য যে একটি ইন্টারাপ্ট একটি HLT রাষ্ট্র নামা প্রয়োজন হয়, একটি মেমরি লেখ (অথবা বিঘ্ন) MWAIT রাষ্ট্র নামা ব্যবহার করা যেতে পারে যখন মিথ্যা সমস্যা রয়েছে। লিনাক্স কার্নেল তার অলস লুপটিতে কী ব্যবহার করে তার উপর নির্ভর করে এটি এমডব্লিউএআইটি সম্ভাব্যভাবে আরও দক্ষ করতে পারে। সুতরাং, আমি যেমন পরীক্ষা / প্রোফাইল বলেছিলাম এবং দেখুন এটি আপনার বিলম্বিত প্রয়োজনগুলি পূরণ করে কিনা ...

এবং

idle=poll - ক্ষমতা এবং তাপ ব্যয়ে সর্বাধিক কর্মক্ষমতা বিকল্প।


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

6
দুঃখিত, তবে সি বলছে, EIST এবং C1E BIOS এ বন্ধ করা যেতে পারে। আমি আশা করি ওএস আমার BIOS সেটিংসকে সম্মান করবে। এটি বিশেষত সত্য, এই ক্ষেত্রে ভয়ানক সরঞ্জাম এবং ডকুমেন্টেশন দেওয়া।
মাইকেল গোল্ডশটেন

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

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

4
নিষ্ক্রিয় = এমওয়াইট আর সাম্প্রতিক 3.x কার্নেল lkML.org/lkml/2013/2/10/21 কোনও বিকল্প পরামর্শ সমর্থন করে না ?
সিকে_

8

সম্ভবত যা ধীরে ধীরে পেয়েছে তা ফুটেক্স, শর্ত ভেরিয়েবলের জন্য বিল্ডিং ব্লক। এটি কিছুটা আলোকপাত করবে:

strace -r ./test_latency 0 1 &> test_latency_strace & sleep 8 && killall test_latency

তারপর

for i in futex nanosleep rt_sig;do echo $i;grep $i test_latency_strace | sort -rn;done

যা সময়মতো সাজানো আকর্ষণীয় সিস্টেম কলগুলির জন্য নেওয়া মাইক্রোসেকেন্ডগুলি দেখায়।

কার্নেলটিতে 2.6.32

$ for i in futex nanosleep rt_sig;do echo $i;grep $i test_latency_strace | sort -rn;done
futex
 1.000140 futex(0x601ac4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601ac0, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 1.000129 futex(0x601ac4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601ac0, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 1.000124 futex(0x601ac4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601ac0, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 1.000119 futex(0x601ac4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601ac0, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 1.000106 futex(0x601ac4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601ac0, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 1.000103 futex(0x601ac4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601ac0, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 1.000102 futex(0x601ac4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601ac0, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 0.000125 futex(0x7f98ce4c0b88, FUTEX_WAKE_PRIVATE, 2147483647) = 0
 0.000042 futex(0x601b00, FUTEX_WAKE_PRIVATE, 1) = 1
 0.000038 futex(0x601b00, FUTEX_WAKE_PRIVATE, 1) = 1
 0.000037 futex(0x601b00, FUTEX_WAKE_PRIVATE, 1) = 1
 0.000030 futex(0x601b00, FUTEX_WAKE_PRIVATE, 1) = 1
 0.000029 futex(0x601b00, FUTEX_WAKE_PRIVATE, 1) = 0
 0.000028 futex(0x601b00, FUTEX_WAKE_PRIVATE, 1) = 1
 0.000027 futex(0x601b00, FUTEX_WAKE_PRIVATE, 1) = 1
 0.000018 futex(0x7fff82f0ec3c, FUTEX_WAKE_PRIVATE, 1) = 0
nanosleep
 0.000027 nanosleep({1, 0}, {1, 0}) = 0
 0.000019 nanosleep({1, 0}, {1, 0}) = 0
 0.000019 nanosleep({1, 0}, {1, 0}) = 0
 0.000018 nanosleep({1, 0}, {1, 0}) = 0
 0.000018 nanosleep({1, 0}, {1, 0}) = 0
 0.000018 nanosleep({1, 0}, {1, 0}) = 0
 0.000018 nanosleep({1, 0}, 0x7fff82f0eb40) = ? ERESTART_RESTARTBLOCK (To be restarted)
 0.000017 nanosleep({1, 0}, {1, 0}) = 0
rt_sig
 0.000045 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000040 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000038 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000035 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000034 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000033 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000032 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000032 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000031 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000031 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000028 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000028 rt_sigaction(SIGRT_1, {0x37f8c052b0, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x37f8c0e4c0}, NULL, 8) = 0
 0.000027 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000027 rt_sigaction(SIGRTMIN, {0x37f8c05370, [], SA_RESTORER|SA_SIGINFO, 0x37f8c0e4c0}, NULL, 8) = 0
 0.000027 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000025 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000025 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000023 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000023 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000022 rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
 0.000022 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000021 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000021 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000021 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000021 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000021 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000019 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0

কার্নেল এ 3.1.9

$ for i in futex nanosleep rt_sig;do echo $i;grep $i test_latency_strace | sort -rn;done
futex
 1.000129 futex(0x601764, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601760, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 1.000126 futex(0x601764, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601760, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 1.000122 futex(0x601764, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601760, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 1.000115 futex(0x601764, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601760, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 1.000114 futex(0x601764, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601760, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 1.000112 futex(0x601764, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601760, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 1.000109 futex(0x601764, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x601760, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
 0.000139 futex(0x3f8b8f2fb0, FUTEX_WAKE_PRIVATE, 2147483647) = 0
 0.000043 futex(0x601720, FUTEX_WAKE_PRIVATE, 1) = 1
 0.000041 futex(0x601720, FUTEX_WAKE_PRIVATE, 1) = 1
 0.000037 futex(0x601720, FUTEX_WAKE_PRIVATE, 1) = 1
 0.000036 futex(0x601720, FUTEX_WAKE_PRIVATE, 1) = 1
 0.000034 futex(0x601720, FUTEX_WAKE_PRIVATE, 1) = 1
 0.000034 futex(0x601720, FUTEX_WAKE_PRIVATE, 1) = 1
nanosleep
 0.000025 nanosleep({1, 0}, 0x7fff70091d00) = 0
 0.000022 nanosleep({1, 0}, {0, 3925413}) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
 0.000021 nanosleep({1, 0}, 0x7fff70091d00) = 0
 0.000017 nanosleep({1, 0}, 0x7fff70091d00) = 0
 0.000017 nanosleep({1, 0}, 0x7fff70091d00) = 0
 0.000017 nanosleep({1, 0}, 0x7fff70091d00) = 0
 0.000017 nanosleep({1, 0}, 0x7fff70091d00) = 0
 0.000017 nanosleep({1, 0}, 0x7fff70091d00) = 0
rt_sig
 0.000045 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000044 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000043 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000040 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000038 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000037 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000036 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000036 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000035 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000035 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000035 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000035 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000034 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000031 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000027 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000027 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000027 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000027 rt_sigaction(SIGRT_1, {0x3f892067b0, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x3f8920f500}, NULL, 8) = 0
 0.000026 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000026 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000025 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000024 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000023 rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
 0.000023 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
 0.000022 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
 0.000021 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
 0.000019 rt_sigaction(SIGRTMIN, {0x3f89206720, [], SA_RESTORER|SA_SIGINFO, 0x3f8920f500}, NULL, 8) = 0

আমি এই 5 বছরের পুরানো বাগ রিপোর্টটি দেখতে পেয়েছি যা তুলনা করে একটি "পিং পং" পারফরম্যান্স পরীক্ষা রয়েছে

  1. একক থ্রেডযুক্ত লিবপথ্রেড মিউটেক্স
  2. libpthread শর্ত পরিবর্তনশীল
  3. সাধারণ পুরানো ইউনিক্স সংকেত

আমি যোগ করতে হবে

#include <stdint.h>

সংকলন করতে, যা আমি এই আদেশ দিয়েছিলাম

g++ -O3 -o condvar-perf condvar-perf.cpp -lpthread -lrt

কার্নেলটিতে 2.6.32

$ ./condvar-perf 1000000
NPTL
mutex                 elapsed:    29085 us; per iteration:   29 ns / 9.4e-05 context switches.
c.v. ping-pong test   elapsed:  4771993 us; per iteration: 4771 ns / 4.03 context switches.
signal ping-pong test elapsed:  8685423 us; per iteration: 8685 ns / 4.05 context switches.

কার্নেল এ 3.1.9

$ ./condvar-perf 1000000
NPTL
mutex                 elapsed:    26811 us; per iteration:   26 ns / 8e-06 context switches.
c.v. ping-pong test   elapsed: 10930794 us; per iteration: 10930 ns / 4.01 context switches.
signal ping-pong test elapsed: 10949670 us; per iteration: 10949 ns / 4.01 context switches.

আমি উপসংহারে পৌঁছেছি যে কার্নেল ২.6.৩২ এবং ৩.১.৯ এর মধ্যে কনটেক্সট সুইচটি প্রকৃতপক্ষে কমিয়েছে, যদিও আপনি কার্নেল ৩.২ তে যতটা পর্যবেক্ষণ করেছেন তেমন নয়। আমি বুঝতে পেরেছি এটি এখনও আপনার প্রশ্নের উত্তর দেয় না, আমি খনন করতে থাকব।

সম্পাদনা: আমি খুঁজে পেয়েছি যে প্রক্রিয়াটির রিয়েল টাইম অগ্রাধিকার (উভয় থ্রেড) পরিবর্তন করে ২.১.৩ এর সাথে মিলিত করতে পারফরম্যান্সটি 3.1.9 এ উন্নত করে .9 যাইহোক, ২.6.৩২ এ একই অগ্রাধিকার সেট করা এটি ধীর করে দেয় ... চিত্রটি যান - আমি এটি আরও দেখব।

এখানে এখন আমার ফলাফল:

কার্নেলটিতে 2.6.32

$ ./condvar-perf 1000000
NPTL
mutex                 elapsed:    29629 us; per iteration:   29 ns / 0.000418 context switches.
c.v. ping-pong test   elapsed:  6225637 us; per iteration: 6225 ns / 4.1 context switches.
signal ping-pong test elapsed:  5602248 us; per iteration: 5602 ns / 4.09 context switches.
$ chrt -f 1 ./condvar-perf 1000000
NPTL
mutex                 elapsed:    29049 us; per iteration:   29 ns / 0.000407 context switches.
c.v. ping-pong test   elapsed: 16131360 us; per iteration: 16131 ns / 4.29 context switches.
signal ping-pong test elapsed: 11817819 us; per iteration: 11817 ns / 4.16 context switches.
$ 

কার্নেল এ 3.1.9

$ ./condvar-perf 1000000
NPTL
mutex                 elapsed:    26830 us; per iteration:   26 ns / 5.7e-05 context switches.
c.v. ping-pong test   elapsed: 12812788 us; per iteration: 12812 ns / 4.01 context switches.
signal ping-pong test elapsed: 13126865 us; per iteration: 13126 ns / 4.01 context switches.
$ chrt -f 1 ./condvar-perf 1000000
NPTL
mutex                 elapsed:    27025 us; per iteration:   27 ns / 3.7e-05 context switches.
c.v. ping-pong test   elapsed:  5099885 us; per iteration: 5099 ns / 4 context switches.
signal ping-pong test elapsed:  5508227 us; per iteration: 5508 ns / 4 context switches.
$ 

আমি এটি ফেডোরা এবং সেন্টোজে চালিয়েছি, উবুন্টু নেই। আমি আমার ফলাফল পোস্ট করব।

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

ঠিক আছে, যা ফুটেক্স বাস্তবায়নকে বাতিল করে দেয় - আমরা আপনার প্রসঙ্গের সুইচ তত্ত্বে ফিরে এসেছি .... এই উত্তরটি সত্যই মন্তব্যে অন্তর্ভুক্ত হওয়ায় নির্দ্বিধায় দ্বিধা বোধ করি ... আমি কেবল আদেশগুলি বিন্যাস করার ক্ষমতা চেয়েছিলাম।
এএমডিএন

হ্যাঁ, সময়গুলি সেকেন্ডের মধ্যে ... এক সেকেন্ডের চেয়ে বেশি সময় ধরে থাকা ফিউটেক্সে কলগুলি শর্তটির জন্য অপেক্ষা করা থ্রেডের জন্য।
এএমডন

সুতরাং, আপনি যদি ফলাফল থেকে কিছু সংগ্রহ করেন তবে কী হবে?
মাইকেল গোল্ডশটেন

1

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

intel_pstate=disable

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