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 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.
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
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.
CFQI / O. Nhiều hệ thống hiện đại có deadlinemộ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 --scopetùy chọn để thực hiện systemd-runchạ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_devicevà bạn có được X và Y tức làls -l /dev/sda