अधिकतम सीमा तक प्रक्रिया I / O प्रति थ्रॉटल कैसे करें?


32

मैं एक प्रक्रिया की गति को एक निर्धारित गति सीमा तक सीमित करने के लिए एक रास्ता खोज रहा हूं। आदर्श रूप से यह कार्यक्रम इसी तरह काम करेगा:

$ limitio --pid 32423 --write-limit 1M

प्रति सेकंड हार्ड ड्राइव राइटिंग स्पीड में 32423 से 1 मेगाबाइट तक सीमित करने की प्रक्रिया।

जवाबों:


33

यह निश्चित रूप से कोई तुच्छ कार्य नहीं है जो कि उपयोगकर्ताओं को नहीं किया जा सकता है। सौभाग्य से, मैकेनिज्मcgroup और इसके ब्लकिओ नियंत्रक का उपयोग करके लिनक्स पर करना संभव है ।

Cgroup सेट करना किसी तरह वितरण विशिष्ट है क्योंकि यह पहले से ही माउंट किया जा सकता है या कहीं इस्तेमाल किया जा सकता है। यहाँ सामान्य विचार है, हालाँकि (यह मानते हुए कि आपके पास उचित कर्नेल कॉन्फ़िगरेशन है):

mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio

अब आपके पास blkioनियंत्रक सेट है, आप इसका उपयोग कर सकते हैं:

mkdir -p /sys/fs/cgroup/blkio/limit1M/
echo "X:Y  1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device 

अब आपके पास एक cgroup है limit1Mजो प्रमुख / मामूली संख्या X: Y से 1MB / s तक डिवाइस पर लिखने की गति को सीमित करता है । जैसा कि आप देख सकते हैं, यह सीमा प्रति डिवाइस है। अब आपको बस इतना करना है कि उस समूह के अंदर कुछ प्रक्रिया डालनी चाहिए और यह सीमित होनी चाहिए:

echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks

मुझे नहीं पता कि यह अन्य ऑपरेटिंग सिस्टम पर किया जा सकता है या नहीं।


3
कृपया ध्यान दें कि आपको पहले उप-समूह बनाने के लिए डिवाइस को विस्तृत कुल नीति सेट करने की आवश्यकता है, echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_deviceऔर आप X और Y प्राप्त करते हैं जैसे किls -l /dev/sda
dothebart

cgroup v1 कैश कैशबैक के बाद समर्थन नहीं करता है। इसका मतलब है कि एक साधारण फाइल में एक साधारण फ़ाइल में एक मानक फ़ाइल पर परीक्षण करना (एक डिवाइस के बजाय) शायद कोई सीमा नहीं दिखाएगा। किसी भी लिखने का उपयोग नहीं काम dd ... oflag=directकरेगा : उम्मीद के मुताबिक काम करेंगे। cgroup v2 इसे संभाल सकता है अगर फाइलसिस्टम इसका समर्थन करता है। विवरण: I / O
AB

22

ioniceजैसा util-linuxचाहता है वैसा ही कुछ करता है।

यह पूर्ण IO सीमाएँ निर्धारित नहीं करता है, यह IO प्राथमिकता और 'अच्छाता' सेट niceकरता है - एक प्रक्रिया 'CPU प्राथमिकता' के लिए समान है ।

आदमी पृष्ठ से:

आयनिस - सेट या प्रक्रिया I / O शेड्यूलिंग क्लास और प्राथमिकता प्राप्त करें

विवरण
यह प्रोग्राम सेट करता है या I / O शेड्यूलिंग क्लास प्राप्त करता है और a के लिए प्राथमिकता देता है
कार्यक्रम। यदि कोई तर्क या जस्ट -p नहीं दिया जाता है, तो आयनिस क्वेरी करेगा
वर्तमान I / O शेड्यूलिंग क्लास और उस प्रक्रिया के लिए प्राथमिकता।

जब आदेश दिया जाता है, तो आयनिस दिए गए के साथ इस कमांड को चलाएगा
तर्क। यदि कोई वर्ग निर्दिष्ट नहीं है, तो कमांड निष्पादित किया जाएगा
"सर्वश्रेष्ठ-प्रयास" शेड्यूलिंग क्लास के साथ। डिफ़ॉल्ट प्राथमिकता स्तर 4 है।

5
एक को ध्यान में रखना चाहिए कि यह केवल CFQI / O शेड्यूलर के साथ काम करता है । कई आधुनिक प्रणालियों में deadlineडिफ़ॉल्ट रूप से एक सक्षम है।
हाईस्टैकर

8

systemd प्रक्रियाओं के cgroup- हेरफेर के लिए एक आवरण प्रदान करता है। सिस्टमड-रन (1) मैन पेज से:

निम्न कमांड अपडेटेड (8) टूल को आमंत्रित करता है, लेकिन इसके लिए ब्लॉक आईओ का वजन 10 तक कम करता है। ब्लॉकआईडाइट = संपत्ति के बारे में अधिक जानकारी के लिए systemd.resource-control (5) देखें।
systemd-run -p BlockIOWeight=10 updatedb

अग्रभूमि में प्रोग्राम चलाने के लिए --scopeविकल्प का उपयोग करने पर विचार करें systemd-run


7

फीच का जवाब एक बहुत अच्छा संकेत है, इसके लिए धन्यवाद, हालांकि यह वास्तव में समस्या को हल करने का कारण नहीं है क्योंकि प्रश्न को एक विशिष्ट बैंडविड्थ तक सीमित करना था।

मैं कुछ इस तरह का सुझाव दूंगा:

systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb

या पदावनत संस्करण:

systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb

फिर भी यह प्रश्न के योग्य नहीं है क्योंकि इसका उपयोग पहले से चल रही प्रक्रिया के लिए नहीं किया जा सकता है, लेकिन शायद यह कुछ अन्य मामलों में सहायक है।

लिंक:

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