Làm thế nào để điều tiết trên mỗi quá trình I / O đến giới hạn tối đa?


32

Tôi đang tìm cách giới hạn đĩa io ở giới hạn tốc độ đã đặt. Lý tưởng nhất là chương trình sẽ hoạt động tương tự như thế này:

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

Giới hạn quá trình 32423 đến 1 megabyte mỗi giây tốc độ ghi ổ cứng.

Câu trả lời:


33

Đó chắc chắn không phải là nhiệm vụ tầm thường không thể thực hiện được trong không gian người dùng. May mắn thay, có thể thực hiện trên Linux, sử dụng cgroupcơ chế và bộ điều khiển blkio của nó .

Thiết lập cgroup bằng cách nào đó phân phối cụ thể vì nó có thể đã được gắn hoặc thậm chí được sử dụng ở đâu đó. Tuy nhiên, đây là ý tưởng chung (giả sử bạn có cấu hình kernel phù hợp):

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

Bây giờ bạn đã blkiothiết lập bộ điều khiển, bạn có thể sử dụng nó:

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

Bây giờ bạn có một nhóm limit1Mgiới hạn tốc độ ghi trên thiết bị với các số chính / phụ X: Y xuống còn 1MB / s. Như bạn có thể thấy, giới hạn này là trên mỗi thiết bị. Tất cả những gì bạn phải làm bây giờ là đưa một số quy trình vào trong nhóm đó và nó nên được giới hạn:

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

Tôi không biết nếu / làm thế nào điều này có thể được thực hiện trên các hệ điều hành khác.


3
Xin lưu ý rằng trước tiên bạn cần đặt chính sách tổng rộng cho thiết bị để tạo các nhóm phụ theo nghĩa là echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_devicevà bạn có được X và Y tức làls -l /dev/sda
dothebart

cgroup v1 không hỗ trợ sau khi ghi lại bộ đệm. Điều đó có nghĩa là việc kiểm tra một lệnh dd đơn giản ghi vào một tệp tiêu chuẩn trong một hệ thống tệp (chứ không phải cho một thiết bị) có thể sẽ không hiển thị bất kỳ giới hạn nào. Không sử dụng bất kỳ văn bản nào sẽ hoạt động: dd ... oflag=directsẽ hoạt động như mong đợi. cgroup v2 có thể xử lý việc này nếu hệ thống tập tin hỗ trợ nó. Chi tiết: Sử dụng các nhóm để giới hạn I / O
AB

22

ionicetừ util-linuxlàm một cái gì đó tương tự như những gì bạn muốn.

Nó không đặt giới hạn IO tuyệt đối, nó đặt mức độ ưu tiên IO và 'độ đẹp' - tương tự như nicemức độ ưu tiên CPU của quy trình.

Từ trang người đàn ông:

ionice - thiết lập hoặc nhận ưu tiên lớp lập lịch I / O

SỰ MIÊU TẢ
Chương trình này thiết lập hoặc nhận lớp lập lịch I / O và ưu tiên cho
chương trình. Nếu không có đối số hoặc chỉ -p được đưa ra, ionice sẽ truy vấn
lớp lập lịch I / O hiện tại và ưu tiên cho quá trình đó.

Khi lệnh được đưa ra, ionice sẽ chạy lệnh này với lệnh đã cho
lập luận. Nếu không có lớp nào được chỉ định, thì lệnh sẽ được thực thi
với lớp lập kế hoạch "nỗ lực nhất". Mức ưu tiên mặc định là 4.

5
Mọi người nên nhớ rằng nó chỉ hoạt động với bộ lập lịch CFQI / O. Nhiều hệ thống hiện đại có deadlinemột kích hoạt theo mặc định.
Highstaker

8

systemd cung cấp một trình bao bọc cho các quy trình được xử lý theo nhóm. Từ trang mand systemd-run (1):

Lệnh sau gọi công cụ updateb (8), nhưng giảm trọng lượng IO của khối xuống còn 10. Xem systemd.resource-control (5) để biết thêm thông tin về thuộc tính BlockIOWeight =.
systemd-run -p BlockIOWeight=10 updatedb

Cân nhắc sử dụng --scopetùy chọn để thực hiện systemd-runchạy chương trình ở nền trước.


7

Câu trả lời của fche là một gợi ý rất hay, cảm ơn vì điều đó, mặc dù nó không thực sự giải quyết được vấn đề gây ra câu hỏi là giới hạn một quy trình trong một băng thông cụ thể.

Tôi sẽ đề nghị một cái gì đó như thế này:

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

hoặc phiên bản không dùng nữa:

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

Tuy nhiên, điều này không phù hợp với câu hỏi vì nó không thể được sử dụng cho một quy trình đã chạy nhưng có thể nó hữu ích trong một số trường hợp khác.

Liên kết:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.