프로세스 당 I / O를 최대 제한으로 제한하는 방법은 무엇입니까?


32

프로세스 디스크 io를 설정된 속도 제한으로 제한하는 방법을 찾고 있습니다. 이상적으로 프로그램은 다음과 유사하게 작동합니다.

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

프로세스 32423을 초당 1MB의 하드 드라이브 쓰기 속도로 제한합니다.

답변:


33

그것은 사용자 공간에서 할 수없는 사소한 작업이 아닙니다. 다행히도 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

다른 운영 체제 에서이 작업을 수행 할 수 있는지 여부는 모르겠습니다.


3
제발 참고 당신 예에 의해 하위 그룹을 생성하기 위해 다양한 장치 전체 정책을 설정하려면 먼저 필요 echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device하고, 즉 의해 X와 Y를 얻을ls -l /dev/sda
dothebart

cgroup v1은 다음 캐시의 쓰기 저장을 지원하지 않습니다. 이는 장치가 아닌 파일 시스템의 표준 파일에 쓰는 간단한 dd 명령을 테스트해도 아무런 제한이 없음을 의미합니다. 쓰기 저장을 사용하지 않으면 작동합니다. dd ... oflag=direct예상대로 작동합니다. 파일 시스템이 지원하는 경우 cgroup v2가이를 처리 할 수 ​​있습니다 . 세부 정보 : cgroup을 사용하여 I / O 제한
AB

22

ionice ~로부터 util-linux 당신이 원하는 것과 비슷한 일을합니다.

절대 IO 제한을 설정하지 않고 IO 우선 순위와 'niceness'를 설정합니다. nice 프로세스 우선 순위 CPU 우선 순위 .

매뉴얼 페이지에서 :

ionice-프로세스 I / O 스케줄링 클래스 및 우선 순위 설정 또는 가져 오기

기술
이 프로그램은 I / O 스케줄링 클래스와 우선 순위를 설정하거나 얻습니다.
프로그램. 인수가 없거나 -p 만 제공되면 ionice는
해당 프로세스의 현재 I / O 스케줄링 클래스 및 우선 순위.

명령이 주어지면 ionice는 주어진 명령 으로이 명령을 실행합니다
인수. 클래스를 지정하지 않으면 명령이 실행됩니다.
"최선의 노력"스케줄링 클래스와 함께. 기본 우선 순위 레벨은 4입니다.

5
CFQI / O 스케줄러 에서만 작동한다는 점을 명심해야합니다 . 많은 최신 시스템에는 deadline기본적으로 하나가 활성화되어 있습니다.
Highstaker

8

systemd는 cgroup이 조작 한 프로세스 호출을위한 래퍼를 제공합니다. systemd-run (1) 매뉴얼 페이지에서 :

다음 명령은 updatedb (8) 도구를 호출하지만 해당 블록 IO 가중치를 10으로 낮 춥니 다. BlockIOWeight = 속성에 대한 자세한 내용은 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.