সর্বাধিক সীমাতে I / O প্রক্রিয়া প্রতি থ্রটল কীভাবে করবেন?


32

আমি একটি প্রক্রিয়া ডিস্ক io একটি সেট গতির সীমাতে সীমাবদ্ধ করার জন্য একটি উপায় খুঁজছি। আদর্শভাবে প্রোগ্রামটি এর সাথে একই রকম কাজ করবে:

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

সেকেন্ডে হার্ড ড্রাইভ লেখার গতি প্রতি 32423 থেকে 1 মেগাবাইট সীমাবদ্ধ করা হচ্ছে।

উত্তর:


33

এটি অবশ্যই তুচ্ছ কাজ নয় যা ব্যবহারকারীক্ষেত্রে করা যায় না। ভাগ্যক্রমে, লিনাক্সটিতে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 

এখন আপনার কাছে একটি সিগ্রুপ রয়েছে limit1Mযা বড় / গৌণ সংখ্যার X: Y থেকে 1MB / s পর্যন্ত ডিভাইসে লেখার গতি সীমিত করে । আপনি দেখতে পাচ্ছেন, এই সীমাটি প্রতি ডিভাইস is আপনাকে এখন যা করতে হবে তা হ'ল এই গোষ্ঠীর ভিতরে কিছু প্রক্রিয়া রাখা এবং এটি সীমাবদ্ধ হওয়া উচিত:

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

অন্যান্য অপারেটিং সিস্টেমে এটি কীভাবে করা যায় তা আমি জানি না।


3
অনুগ্রহ করে নোট করুন যে উপ-গোষ্ঠীগুলি তৈরি করার জন্য আপনাকে প্রথমে ডিভাইসটির মোট মোট নীতি সেট echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_deviceকরতে হবে এবং আপনি এক্স এবং ওয়াই অর্থাত্ ls -l /dev/sda
পেয়ে যাবেন

cgroup v1 ক্যাশের লিখনব্যাক অনুসরণ করে সমর্থন করে না। এর অর্থ হ'ল একটি ফাইল সিস্টেমে একটি স্ট্যান্ডার্ড ফাইলের (ডিভাইসের চেয়ে) একটি সাধারণ ডিডি কমান্ডের পরীক্ষা করা সম্ভবত কোনও সীমাবদ্ধতা প্রদর্শন করবে না। কোন লিটব্যাক ব্যবহার না করা কাজ dd ... oflag=directকরবে : প্রত্যাশার মতো কাজ করবে। cgroup v2 এটি পরিচালনা করতে পারে যদি ফাইল সিস্টেম সমর্থন করে। বিশদ: I / O সীমাবদ্ধ করতে cgroups ব্যবহার করে
এবি

22

ioniceথেকে util-linuxআপনি যা চান তেমন কিছু করে।

এটি নিখুঁত IO সীমা নির্ধারণ করে না, এটি IO অগ্রাধিকার এবং 'niceness' নির্ধারণ করে - niceকোনও প্রক্রিয়া 'CPU- এর অগ্রাধিকারের জন্য যা করতে হবে তার সমান ।

ম্যান পৃষ্ঠা থেকে:

আয়নিস - I / O সময়সূচী শ্রেণি এবং অগ্রাধিকার সেট করুন বা পান

বর্ণনা
এই প্রোগ্রামটি I / O সময়সূচী শ্রেণি সেট করে বা পায় এবং এর জন্য অগ্রাধিকার দেয়
কার্যক্রম. যদি কোনও আর্গুমেন্ট বা জাস্ট-পি দেওয়া না হয় তবে আয়নিস প্রশ্নটি করবে
বর্তমান I / O সময়সূচী শ্রেণি এবং সেই প্রক্রিয়াটির জন্য অগ্রাধিকার।

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

5
কারও মনে রাখা উচিত যে এটি কেবলমাত্র CFQI / O সময়সূচী নিয়ে কাজ করে। অনেকগুলি আধুনিক সিস্টেমে deadlineএকটি ডিফল্টরূপে সক্ষম হয়।
হাইস্টেকার

8

systemd সিগ্রুপ-ম্যানিপুলেটেড প্রসেসগুলির জন্য একটি মোড়ক সরবরাহ করে। সিস্টেম-চালিত (1) ম্যান পৃষ্ঠা থেকে:

নিম্নলিখিত কমান্ডটি আপডেটবিড (8) সরঞ্জামটি আহ্বান করেছে, তবে এটির জন্য ব্লক আইওর ওজন 10-এ কমিয়েছে ব্লকআইওউইট = সম্পত্তি সম্পর্কে আরও তথ্যের জন্য systemd.resource-control (5) দেখুন।
systemd-run -p BlockIOWeight=10 updatedb

অগ্রভাগে প্রোগ্রামটি চালানোর --scopeবিকল্পটি বিবেচনা করুন systemd-run


7

Fche- এর উত্তর একটি খুব ভাল ইঙ্গিত, এর জন্য ধন্যবাদ, যদিও এটি সমস্যার সমাধান সত্যিই করতে পারে না কারণ প্রশ্নটি একটি নির্দিষ্ট ব্যান্ডউইথের মধ্যে একটি প্রক্রিয়া সীমাবদ্ধ করেছিল।

আমি এই জাতীয় কিছু প্রস্তাব করব:

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

বা অবচিত সংস্করণ:

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

তবুও এটি প্রশ্নটির সাথে খাপ খায় না কারণ এটি ইতিমধ্যে চলমান প্রক্রিয়ার জন্য ব্যবহার করা যাচ্ছে না তবে এটি অন্য কোনও ক্ষেত্রে এটি সহায়ক।

লিঙ্ক:

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