2009-06-17 34 views
76

का चयन करना मैंने पढ़ा है कि//ss/block/[disk]/queue/शेड्यूलर को लिखकर चल रहे कर्नेल पर किसी विशेष डिवाइस के लिए I/O शेड्यूलर को बदलना संभव है। उदाहरण के लिए मैं अपने सिस्टम पर देख सकते हैं:लिनक्स I/O शेड्यूलर

[email protected]:~$ cat /sys/block/sda/queue/scheduler 
noop anticipatory deadline [cfq] 

कि डिफ़ॉल्ट पूरी तरह से निष्पक्ष कतार अनुसूचक है। मैं क्या सोच रहा हूं कि अगर मेरे कस्टम कर्नेल में सभी चार शेड्यूलर शामिल करने में कोई उपयोग है। ऐसा प्रतीत होता है कि एक से अधिक शेड्यूलर संकलित होने में बहुत अधिक बिंदु नहीं है जब तक कि कर्नेल सही हार्डवेयर के लिए सही शेड्यूलर का चयन करने के लिए पर्याप्त स्मार्ट न हो, विशेष रूप से फ़्लैश आधारित ड्राइव के लिए 'नोप' शेड्यूलर और पारंपरिक में से एक अन्य हार्ड ड्राइव।

क्या यह मामला है?

उत्तर

103

/usr/src/linux/Documentation/block/switching-sched.txt में प्रलेखित के रूप में, किसी भी विशेष ब्लॉक डिवाइस पर I/O शेड्यूलर रनटाइम पर बदला जा सकता है। कुछ विलंबता हो सकती है क्योंकि पिछले शेड्यूलर के अनुरोधों को नए शेड्यूलर को उपयोग में लाने से पहले सभी फ्लश किए गए हैं, लेकिन डिवाइस को भारी उपयोग के दौरान भी समस्याओं के बिना बदला जा सकता है।

# cat /sys/block/hda/queue/scheduler 
noop deadline [cfq] 
# echo anticipatory > /sys/block/hda/queue/scheduler 
# cat /sys/block/hda/queue/scheduler 
noop [deadline] cfq 

आदर्श रूप से, सभी आवश्यकताओं को पूरा करने के लिए एक शेड्यूलर होगा। यह अभी तक अस्तित्व में प्रतीत नहीं होता है। गिरी अक्सर अपने काम का बोझ के लिए सबसे अच्छा अनुसूचक चयन करने के लिए पर्याप्त ज्ञान नहीं है:

  • noop अक्सर स्मृति समर्थित ब्लॉक उपकरणों के लिए सबसे अच्छा विकल्प है (उदाहरण के लिए ramdisks) और अन्य गैर आवर्ती मीडिया (फ्लैश) जहां मैं पुनर्निर्धारित करने की कोशिश कर/ओ संसाधनों की बर्बादी है
  • deadline एक हल्के अनुसूचक जो विलंबता
  • cfq प्रयासों में वे एक हार्ड सीमा डाल करने के लिए मैं/हे बैंडविड्थ की पूरे सिस्टम में निष्पक्षता बनाए रखने की कोशिश करता है

डिफ़ॉल्ट रूप से anticipatory था, और इसे बहुत ट्यूनिंग मिली, लेकिन 2.6.33 (2010 की शुरुआत में) में हटा दिया गया था। cfq कुछ समय पहले डिफ़ॉल्ट बन गया, क्योंकि इसका प्रदर्शन उचित है और निष्पक्षता बहु-उपयोगकर्ता प्रणालियों (और यहां तक ​​कि एकल-उपयोगकर्ता डेस्कटॉप) के लिए एक अच्छा लक्ष्य है। कुछ परिदृश्यों के लिए - डेटाबेस अक्सर उदाहरण के रूप में उपयोग किए जाते हैं, क्योंकि उनके पास पहले से ही अपने अनोखे शेड्यूलिंग और एक्सेस पैटर्न होते हैं, और अक्सर अधिकतर महत्वपूर्ण सेवा (इसलिए निष्पक्षता की परवाह कौन करता है?) - anticipatory का एक लंबा इतिहास है इन वर्कलोड पर सर्वोत्तम प्रदर्शन के लिए ट्यून करने योग्य होने के कारण, और deadline बहुत ही जल्दी अंतर्निहित डिवाइस के माध्यम से सभी अनुरोधों को पास करता है।

+1

बढ़िया जानकारी, धन्यवाद! लेकिन मेरा मूल प्रश्न अभी भी अनुत्तरित नहीं है, अगर मैं फ्लैश ड्राइव प्लग करता हूं या मेरी नेटबुक फ्लैश डिस्क से बाहर निकलती है क्योंकि यह मुख्य ड्राइव है तो कर्नेल स्मार्ट सीएफक्यू के बजाए नोप लेने के लिए पर्याप्त स्मार्ट है? या यह मैन्युअल रूप से करने के लिए पूरी तरह से मेरे ऊपर है? –

+3

आप डिफ़ॉल्ट रूप से एक अलग शेड्यूलर का उपयोग करने के लिए कर्नेल को कॉन्फ़िगर कर सकते हैं। गैर-घूर्णन मीडिया पर स्वचालित रूप से 'नोओप' का उपयोग करने के लिए चालाक होगा, लेकिन कर्नेल में उस कार्यक्षमता नहीं है। इस तरह के गैर घूर्णनशील मीडिया का पता लगाना है, लेकिन यह विश्वसनीय नहीं है क्योंकि कुछ डिस्क स्वयं को गलत तरीके से रिपोर्ट करते हैं, और यह अभी तक I/O शेड्यूलर कोड तक किसी भी तरह से वायर्ड नहीं है। – ephemient

+7

आप डिवाइस विशेषताओं के आधार पर शेड्यूलर को परिभाषित करने के लिए udev नियम जोड़ सकते हैं, जैसे डेबियन विकी (https://wiki.debian.org/SSDOptimization#Low-Latency_IO-Scheduler) # गैर-घूर्णन डिस्क के लिए समय सीमा शेड्यूलर सेट करें कार्रवाई == "जोड़ने | परिवर्तन", कर्नेल == "एसडी [az]", ATTR {कतार/घूर्णी} == "0", ATTR {कतार/अनुसूचक} = "समय सीमा" –

7

कर्नेल समर्थन अलग रखने का उद्देश्य यह है कि आप उन्हें रीबूट किए बिना आज़मा सकते हैं; फिर आप sytsem के माध्यम से परीक्षण वर्कलोड चला सकते हैं, प्रदर्शन माप सकते हैं, और उसके बाद अपने ऐप के लिए मानक बना सकते हैं।

आधुनिक सर्वर-ग्रेड हार्डवेयर पर, केवल नोप एक उपयोगी होता प्रतीत होता है। अन्य मेरे परीक्षणों में धीमे लगते हैं।

+0

कैसे आप वास्तव में यह कार्यावधि में बदल सकता हूँ? –

+0

अन्य शेड्यूलर के सापेक्ष नोप का प्रदर्शन हार्डवेयर और विशेष भार पर निर्भर करता है। जिज्ञासा से बाहर, आप क्या डिस्क, नियंत्रक, और परीक्षण चल रहे थे? – ephemient

+1

हाँ, जब आपके पास स्मार्ट RAID नियंत्रक और अन्य सामान होते हैं तो नोप अच्छा होता है जहां यह सर्वोत्तम पहुंच पैटर्न के बारे में कर्नेल से अधिक जानता है। समय सीमा भी खराब नहीं है। –

-5

लिनक्स कर्नेल स्वचालित रूप से रन-टाइम पर आईओ शेड्यूलर को स्वचालित रूप से परिवर्तित नहीं करता है। इसका मतलब है कि, लिनक्स कर्नेल, आज के रूप में, माध्यमिक भंडारण तैयार करने के प्रकार के आधार पर स्वचालित रूप से "इष्टतम" शेड्यूलर चुनने में सक्षम नहीं है। स्टार्ट-अप के दौरान, या रन-टाइम के दौरान, IO शेड्यूलर मैन्युअल रूप से को बदलना संभव है।

डिफ़ॉल्ट शेड्यूलर /linux-2.6 /block/Kconfig.iosched पर स्थित फ़ाइल में सामग्री के आधार पर स्टार्ट-अप पर चुना गया है। हालांकि, यह पर/sys/ब्लॉक/[देव]/कतार/अनुसूचक स्थित फाइल में एक वैध अनुसूचक नाम ing echo से चलाने के समय के दौरान आईओ शेड्यूलर को बदलने के लिए संभव है। उदाहरण के लिए, echo deadline > /sys/block/hda/queue/scheduler

+7

के लिए अच्छा नहीं है मैं नहीं मिलता है। यह वास्तव में गलत नहीं है। – DepressedDaniel

+0

@DepressedDaniel गैर घूर्णी मीडिया का पता लगाने के स्वचालित और केवल उन लोगों के लिए आईओ शेड्यूलर को लागू करने पर संपादित – Spookbuster

17

एचडब्ल्यू की कुछ विशेषताओं के आधार पर सिस्टम शेड्यूलर पर निर्णय लेने के लिए एक udev नियम का उपयोग करना संभव है।
SSDs और अन्य गैर घूर्णी ड्राइव के लिए एक उदाहरण udev नियम एक नया udev नियम फ़ाइल (उदाहरण, /etc/udev/rules.d/60-ssd-scheduler.rules) के अंदर की तरह

# set noop scheduler for non-rotating disks 
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop" 

लग सकता है। इस उत्तर debian wiki

पर आधारित है जानने के लिए कि SSD डिस्क नियम का प्रयोग करेंगे, यह पहले से ट्रिगर विशेषता के लिए जाँच करने के लिए संभव है:

for f in /sys/block/sd?/queue/rotational; do printf "$f "; cat $f; done 
+0

ग्रेट उत्तर देखें।गैर-कताई मीडिया के लिए न केवल समय सीमा की सिफारिश की जाती है। ओरेकल डेटाबेस वर्कलोड के लिए समय सीमा io शेड्यूलर की सिफारिश करता है। यह ओरेकल की सिफारिश शायद इस तथ्य से आती है कि समय सीमा अन्य आईओ शेड्यूलरों की तुलना में बेहतर सिंक्रोनस लिख सकती है। उदाहरण के लिए/sys/block/sdX/queue/iosched/write_starved "समय सीमा" शेड्यूलर ट्यूनेबल के लिए उदाहरण देखें (पढ़ने के लिए कोई ट्यून करने योग्य नहीं है)। डेटाबेस में खराब प्रदर्शन हो सकता है यदि इसके सिंक्रोनस रेडो लिखने से जल्दी से नहीं आ रहा है। – Tagar

संबंधित मुद्दे