लिनक्स I / O शेड्यूलर का चयन करना


82

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

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

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

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

जवाबों:


109

जैसा कि प्रलेखित है /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 अक्सर मेमोरी-समर्थित ब्लॉक डिवाइस (जैसे रैमडिस्क) और अन्य गैर-घूर्णी मीडिया (फ्लैश) के लिए सबसे अच्छा विकल्प होता है, जहां I / O को पुनर्निर्धारित करने का प्रयास संसाधनों की बर्बादी है
  • deadline एक हल्का अनुसूचक है जो विलंबता पर एक कठिन सीमा लगाने की कोशिश करता है
  • cfq I / O बैंडविड्थ की सिस्टम-वाइड निष्पक्षता बनाए रखने की कोशिश करता है

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


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

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

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

@ दानी_एल आपको इसका विस्तार करना चाहिए और इसे उत्तर के रूप में जोड़ना चाहिए।
रॉबर्ट एस। बार्न्स

1
क्या रनटाइम के दौरान सभी ड्राइव्स के लिए इसे बदलने का कोई तरीका है? इसी तरह कर्नेल कमांड लाइन परम "लिफ्ट" द्वारा डिफ़ॉल्ट शेड्यूलर की स्थापना। धन्यवाद।
स्काईट्रैप

20

सिस्टम को hw की कुछ विशेषताओं के आधार पर अनुसूचक पर निर्णय लेने के लिए एक udv नियम का उपयोग करना संभव है।
SSDs और अन्य गैर-घूर्णी ड्राइव के लिए एक उदाहरण udev नियम की तरह लग सकता है

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

एक नए udv नियम फ़ाइल (जैसे, /etc/udev/rules.d/60-ssd-scheduler.rules) के अंदर। यह उत्तर डेबियन विकी पर आधारित है

यह जांचने के लिए कि ssd डिस्क नियम का उपयोग करेगी या नहीं, अग्रिम में ट्रिगर विशेषता की जांच करना संभव है:

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

गैर-घूर्णी मीडिया का पता लगाने और केवल उन पर IO अनुसूचक को लागू करने पर शानदार उत्तर। न केवल कताई मीडिया के लिए समय सीमा की सिफारिश की जाती है। Oracle डेटाबेस कार्यभार के लिए समय सीमा io अनुसूचक की सिफारिश करता है। ओरेकल की यह सिफारिश शायद इस तथ्य से आती है कि समय सीमा अन्य IO अनुसूचियों की तुलना में बेहतर तुल्यकालिक लेखन को संभाल सकती है। उदाहरण के लिए / sys / block / sdX / कतार / iosched / write_starved "समय सीमा" अनुसूचक tunable (रीड के लिए ऐसा कोई ट्यून करने योग्य नहीं है)। डेटाबेस में खराब प्रदर्शन हो सकता है यदि इसके तुल्यकालिक रीडो जल्दी से नहीं आ रहे हैं।
तगर

7

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

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


आप वास्तव में इसे रनटाइम में कैसे बदलेंगे?
रॉबर्ट एस। बार्न्स

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

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

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

ephemient> जो DELL PERC नियंत्रकों पर था, DELL पॉवर्ल्ट MD3000 पर भी। यह दोनों पर डिफ़ॉल्ट (सीएफक्यू) से बेहतर लग रहा था।
MarkR

0

आप कर्नेल cmdline को "एलेवेटर" पैरामीटर जोड़कर इसे बूट पर सेट कर सकते हैं (जैसे grub.cfgg में)

उदाहरण:

elevator=deadline

यह सभी ब्लॉक उपकरणों के लिए डिफ़ॉल्ट I / O अनुसूचक को "समय सीमा" बना देगा।

यदि आप सिस्टम को बूट करने के बाद शेड्यूलर को क्वेरी या बदलना चाहते हैं, या किसी विशिष्ट ब्लॉक डिवाइस के लिए एक अलग शेड्यूलर का उपयोग करना चाहते हैं, तो मैं इस आसान को बनाने के लिए टूल ioschedset को स्थापित करने और उपयोग करने की सलाह देता हूं ।

https://github.com/kata198/ioschedset

यदि आप आर्कलिनक्स पर हैं तो यह और में उपलब्ध है:

https://aur.archlinux.org/packages/ioschedset

कुछ उदाहरण उपयोग:

# Get i/o scheduler for all block devices
[username@hostname ~]$ io-get-sched
sda:    bfq
sr0:    bfq

# Query available I/O schedulers
[username@hostname ~]$ io-set-sched --list
mq-deadline kyber bfq none

# Set sda to use "kyber"
[username@hostname ~]$ io-set-sched kyber /dev/sda
Must be root to set IO Scheduler. Rerunning under sudo...

[sudo] password for username:
+ Successfully set sda to 'kyber'!

# Get i/o scheduler for all block devices to assert change
[username@hostname ~]$ io-get-sched
sda:    kyber
sr0:    bfq

# Set all block devices to use 'deadline' i/o scheduler
[username@hostname ~]$ io-set-sched deadline
Must be root to set IO Scheduler. Rerunning under sudo...

+ Successfully set sda to 'deadline'!
+ Successfully set sr0 to 'deadline'!

# Get the current block scheduler just for sda
[username@hostname ~]$ io-get-sched sda
sda:    mq-deadline

उपयोग आत्म-व्याख्यात्मक होना चाहिए। उपकरण स्टैंडअलोन हैं और केवल बैश की आवश्यकता होती है।

उम्मीद है की यह मदद करेगा!

संपादित करें: अस्वीकरण, ये मेरे द्वारा लिखी गई स्क्रिप्ट हैं।


-3

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

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


8
मुझे नहीं लगता कि यह उत्तर इतने सारे डाउनवोट का हकदार क्यों है। यह वास्तव में गलत नहीं है।
डिप्रैडडैनियल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.