Câu trả lời:
Đó 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 cgroup
cơ 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 đã blkio
thiế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 limit1M
giớ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.
dd ... oflag=direct
sẽ 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
ionice
từ util-linux
là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ư nice
mứ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.
CFQ
I / O. Nhiều hệ thống hiện đại có deadline
một kích hoạt theo mặc định.
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 --scope
tùy chọn để thực hiện systemd-run
chạy chương trình ở nền trước.
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:
echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
và bạn có được X và Y tức làls -l /dev/sda