답변:
그것은 사용자 공간에서 할 수없는 사소한 작업이 아닙니다. 다행히도 Linux에서 다음을 사용하여 수행 할 수 있습니다.cgroup
mechanizm과 blkio controller를 .
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로 갖는 장치의 쓰기 속도를 제한 하는 cgroup 이 있습니다 . 보시다시피이 제한은 장치 당입니다. 이제 당신이해야 할 일은 프로세스를 그 그룹 안에 넣는 것입니다.
echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks
다른 운영 체제 에서이 작업을 수행 할 수 있는지 여부는 모르겠습니다.
dd ... oflag=direct
예상대로 작동합니다. 파일 시스템이 지원하는 경우 cgroup v2가이를 처리 할 수 있습니다 . 세부 정보 : cgroup을 사용하여 I / O 제한
ionice
~로부터 util-linux
당신이 원하는 것과 비슷한 일을합니다.
절대 IO 제한을 설정하지 않고 IO 우선 순위와 'niceness'를 설정합니다. nice
프로세스 우선 순위 CPU 우선 순위 .
매뉴얼 페이지에서 :
ionice-프로세스 I / O 스케줄링 클래스 및 우선 순위 설정 또는 가져 오기 기술 이 프로그램은 I / O 스케줄링 클래스와 우선 순위를 설정하거나 얻습니다. 프로그램. 인수가 없거나 -p 만 제공되면 ionice는 해당 프로세스의 현재 I / O 스케줄링 클래스 및 우선 순위. 명령이 주어지면 ionice는 주어진 명령 으로이 명령을 실행합니다 인수. 클래스를 지정하지 않으면 명령이 실행됩니다. "최선의 노력"스케줄링 클래스와 함께. 기본 우선 순위 레벨은 4입니다.
CFQ
I / O 스케줄러 에서만 작동한다는 점을 명심해야합니다 . 많은 최신 시스템에는 deadline
기본적으로 하나가 활성화되어 있습니다.
systemd는 cgroup이 조작 한 프로세스 호출을위한 래퍼를 제공합니다. systemd-run (1) 매뉴얼 페이지에서 :
다음 명령은 updatedb (8) 도구를 호출하지만 해당 블록 IO 가중치를 10으로 낮 춥니 다. BlockIOWeight = 속성에 대한 자세한 내용은 systemd.resource-control (5)를 참조하십시오.
systemd-run -p BlockIOWeight=10 updatedb
사용을 고려 --scope
하도록 옵션을 systemd-run
포 그라운드에서 프로그램을 실행합니다.
fche 의 대답은 문제를 해결할 수는 없지만 문제를 해결하지는 못하지만 프로세스를 특정 대역폭으로 제한하는 것이 었기 때문에 매우 좋은 힌트입니다.
나는 이와 같은 것을 제안 할 것이다 :
systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb
또는 더 이상 사용되지 않는 버전 :
systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb
여전히 이것은 이미 실행중인 프로세스에 사용할 수 없지만 다른 경우에는 도움이 될 수있는 질문에 맞지 않습니다.
모래밭:
echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
하고, 즉 의해 X와 Y를 얻을ls -l /dev/sda