क्या आपने कभी दसियों या सैकड़ों गीगाबाइट डेटा कॉपी या मूव किया है? यदि आपने किया है, तो आपने निश्चित रूप से देखा होगा कि उस दौरान सिस्टम बहुत कम रिस्पॉन्सिव हो जाता है। लिनक्स पर आप ionice कमांड की मदद से इससे बच सकते हैं।
I/O प्राथमिकता क्या है?
I/O का अर्थ इनपुट/आउटपुट है। कई प्रकार के I/O डिवाइस हैं, लेकिन इस मामले में यह स्टोरेज डिवाइस के बारे में है।
ऐसा प्रत्येक प्रोसेस जो ऐसे डिवाइस से डेटा पढ़ना या लिखना चाहता है, उसे एक शेड्यूलिंग क्लास और प्राथमिकता संख्या (या "नाइस" वैल्यू) असाइन की जाती है। यह लिनक्स पर ext4 जैसे फाइल सिस्टम पर लागू होता है। अन्य फाइल सिस्टम, जैसे ZFS, डिस्क पर रीड/राइट ऑपरेशन शेड्यूल करने के लिए थोड़े अलग तरीके लागू कर सकते हैं। साथ ही, CFQ शेड्यूलर इसके लिए सक्रिय होना चाहिए। आप जांच सकते हैं:
cat /sys/block/*/queue/scheduler
एक उच्च "नाइस" वैल्यू वाले प्रोसेस की प्राथमिकता कम होती है। इसके पीछे तर्क यह है कि संख्या जितनी अधिक होगी, प्रोसेस अन्य प्रोसेस के प्रति उतना ही "अच्छा" होगा।
I/O प्राथमिकता कैसे काम करती है?
एक स्टोरेज डिवाइस में स्पष्ट रूप से प्रति सेकंड I/O ऑपरेशन की सीमित संख्या (IOPS) होती है जो यह कर सकता है। तो जब दो प्रोसेस एक ही समय में पढ़ना/लिखना चाहते हैं, तो उन्हें प्रत्येक को IOPS का एक हिस्सा मिलता है। यदि उनकी प्राथमिकता समान है, तो उन्हें लगभग 50% IOPS प्रत्येक मिलता है।
IOPS अमूर्त और जटिल लग सकता है। सरलता के लिए, आप केवल अंतिम परिणाम के बारे में सोच सकते हैं: रीड/राइट स्पीड। मान लें कि आपका डिस्क अधिकतम 100MB/s से लिख सकता है। प्रोसेस A एक राइट ऑपरेशन शुरू करता है। यह 100MB/s से डिस्क पर लिखता है। प्रोसेस B साथ आता है और उसी डिस्क पर लिखना चाहता है। यह लगभग 50MB/s से लिखेगा, जिससे प्रोसेस A की राइट स्पीड भी उसी मूल्य, 50MB/s पर आ जाएगी। अब, यदि आप प्रोसेस B को एक उच्च I/O नाइस वैल्यू असाइन करते हैं, तो यह 20MB/s से लिखेगा और प्रोसेस A को 80MB/s से लिखने देगा। जब प्रोसेस A पूरा हो जाता है, तो प्रोसेस B 100MB/s से लिखना शुरू कर देगा।
यह उदाहरण कुछ ऐसा समझने के लिए उपयोगी है जो कुछ लोगों को भ्रमित कर सकता है। यदि किसी प्रोसेस की प्राथमिकता बहुत कम है (उच्च नाइस वैल्यू), तो इसका मतलब यह नहीं है कि यह हर समय धीरे-धीरे लिखेगा। यदि यह डिस्क का उपयोग करने वाला एकमात्र प्रोसेस है, तो यह अधिकतम गति से पढ़ेगा/लिखेगा। लेकिन जब अन्य प्रोसेस को डिस्क की आवश्यकता होती है, तो यह अस्थायी रूप से रास्ते से हट जाएगा और उन्हें अधिक डिस्क बैंडविड्थ उपयोग करने देगा। एक कॉपी/राइट ऑपरेशन के लिए जिसे पूरा होने में घंटों लगेंगे, यदि आप उस समय अपने कंप्यूटर का उपयोग करना चाहते हैं तो इसे कम प्राथमिकता देना एक अच्छा विचार है।
ionice कमांड का उपयोग कैसे करें
कमांड का सामान्य सिंटैक्स है:
ionice -c scheduling_class -n priority_nice_value command
ionice शेड्यूलिंग क्लासेस
Idle (क्लास 3): इस क्लास में प्रोसेस केवल तभी पढ़ते/लिखते हैं जब कोई अन्य प्रोग्राम डिस्क एक्सेस की आवश्यकता नहीं रखता। इसका मतलब है कि प्रोसेस पूर्ण गति से पढ़ता/लिखता है जब इसकी कोई प्रतिस्पर्धा नहीं होती। जब कोई अन्य प्रोग्राम डिस्क समय की आवश्यकता रखता है, तो आइडल क्लास में प्रोसेस केवल शेष संसाधनों के साथ पढ़ेगा/लिखेगा। 100MB/s से यह अस्थायी रूप से 5MB/s से लिख सकता है, फिर 100MB/s पर वापस आ जाता है जब अन्य प्रोग्राम डिस्क एक्सेस करना समाप्त कर देता है। यह उन लंबे समय तक चलने वाले कार्यों के लिए एकदम सही क्लास है जिन्हें आप अपने सिस्टम को धीमा नहीं करना चाहते। इस क्लास के लिए किसी प्राथमिकता को निर्दिष्ट करने की आवश्यकता नहीं है।
उदाहरण कमांड:
ionice -c 3 cp /home/user/largefile /Backups
Best-effort (क्लास 2): 0 और 7 के बीच एक प्राथमिकता/नाइस वैल्यू लेता है। याद रखें, कम संख्या का अर्थ उच्च प्राथमिकता है। जब आप दो या अधिक प्रोसेस के लिए डिस्क समय को फाइन-ट्यून करना चाहते हैं तो इस क्लास का उपयोग करें।
उदाहरण के लिए, आप चाहते हैं कि आपका बैकअप तेजी से पूरा हो और इसे नाइस वैल्यू 0 असाइन करें। आप छह फिल्मों को दूसरे डिस्क पर भी ले जा रहे हैं लेकिन जल्दी में नहीं हैं, इसलिए आप इसे नाइस वैल्यू 7 असाइन करते हैं।
उदाहरण कमांड:
ionice -c 2 -n 0 backup_command
Realtime (क्लास 1): केवल तभी उपयोग किया जाना चाहिए यदि यह महत्वपूर्ण है कि प्रोसेस जल्द से जल्द लिखे, किसी अन्य प्रोग्राम द्वारा निर्बाध। अधिकांश यूजर्स को कभी भी इसकी आवश्यकता नहीं होगी और इससे बचना चाहिए, विशेष मामलों को छोड़कर। यह 0 और 7 के बीच नाइस वैल्यू को भी सपोर्ट करता है। केवल रूट इस क्लास का उपयोग कर सकता है, जिसका अर्थ है कि आप शायद कमांड को sudo से प्रीफिक्स करेंगे। ध्यान दें कि प्राथमिकता 0 के साथ रियलटाइम क्लास में एक प्रोसेस अन्य प्रोसेस को संसाधनों से वंचित कर सकता है। व्यावहारिक रूप से, इसका मतलब है कि एक अन्य प्रोग्राम को कुछ मेगाबाइट डेटा पढ़ने/लिखने को समाप्त करने के लिए मिनटों या घंटों तक इंतजार करना पड़ सकता है। सावधानी से उपयोग करें, केवल यदि आप सुनिश्चित हैं कि आपको इसकी आवश्यकता है। यदि क्लास 2 या 3 में एक महत्वपूर्ण प्रोसेस को डिस्क एक्सेस की आवश्यकता है, तो आपका सिस्टम तब तक फ्रीज हो सकता है जब तक रियलटाइम प्रोसेस लिखना समाप्त नहीं कर देता।
उदाहरण कमांड:
sudo ionice -c 1 -n 7 bash
उपयोगी ionice उदाहरण
पिछले उदाहरण में, कॉपी/मूव कमांड चलाने के बजाय, एक शेल लॉन्च किया गया है (Bash)। अब उस शेल में आपके द्वारा टाइप की गई प्रत्येक बाद की कमांड I/O शेड्यूलिंग क्लास और प्राथमिकता को विरासत में लेगी। आप इसे ग्राफिकल इंटरफेस पर भी कर सकते हैं।
ionice -c 3 pcmanfm
अंतिम कमांड LXDE डेस्कटॉप एनवायरनमेंट पर एक फाइल एक्सप्लोरर लॉन्च करेगा। "pcmanfm" को अपने विशेष डेस्कटॉप के फाइल एक्सप्लोरर के नाम से बदलें। अब वहां शुरू किए गए सभी डिस्क ऑपरेशन आइडल I/O शेड्यूलिंग क्लास के साथ किए जाएंगे।
अन्य स्थितियों में, एक कॉपी/मूव ऑपरेशन पहले से ही सक्रिय हो सकता है। इस मामले में आप ionice को एक अलग तरीके से उपयोग कर सकते हैं।
ionice -c 3 -p 4910
यह प्रोसेस ID 4910 के साथ चल रहे प्रोग्राम की प्राथमिकता क्लास को बदलता है। आप अपने टास्क मैनेजर या pgrep जैसी कमांड से PID (प्रोसेस ID) ढूंढ सकते हैं।
निष्कर्ष
ionice उन डेस्कटॉप पर उपयोगी हो सकता है जिन्हें आप बड़े फाइल कॉपी/मूव करते समय लैग नहीं करना चाहते। लेकिन ध्यान रखें कि यह सर्वर पर और भी अधिक उपयोगी हो सकता है। आप निश्चित रूप से नहीं चाहेंगे कि आपके द्वारा होस्ट की गई वेबसाइट आपके विज़िटर्स के लिए लैग करे जबकि आप फुल बैकअप करते हैं।