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

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

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

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

프로세스 32423의 하드 디스크 쓰기 속도를 초당 1MB로 제한합니다.

답변1

이는 확실히 사용자 공간에서 수행할 수 없는 사소한 작업이 아닙니다. 다행스럽게도 cgroupLinux와 Linux에서는 mechanizm을 사용할 수 있습니다.블록 컨트롤러.

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이제 메이저/마이너 번호가 있는 장치의 쓰기 속도를 제한하는 cgroup이 있습니다.X:Y1MB/초 보시다시피 이 제한은 장치별로 적용됩니다. 지금 해야 할 일은 해당 그룹에 일부 프로세스를 넣고 제한하는 것뿐입니다.

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

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

답변2

ioniceutil-linux당신이 원하는 것과 비슷한 일을 시작하십시오 .

절대적인 IO 제한을 설정하지 않고 nice프로세스의 CPU 우선순위와 유사하게 IO 우선순위와 "좋음"을 설정합니다.

매뉴얼 페이지에서:

ionice - 프로세스 I/O 스케줄링 카테고리 및 우선순위를 설정하거나 가져옵니다.

설명하다
이 프로그램은 I/O 스케줄링 범주 및 우선순위를 설정하거나 가져옵니다.
프로그램. 인수가 제공되지 않거나 -p만 제공되면 ionice가 쿼리합니다.
현재 I/O 스케줄링 클래스 및 이 프로세스의 우선순위입니다.

명령이 주어지면 ionice는 주어진 명령을 사용하여 명령을 실행합니다.
논쟁. 클래스가 지정되지 않으면 명령이 실행됩니다.
"최선의" 스케줄링 클래스를 사용합니다. 기본 우선순위는 4입니다.

답변3

정답은Faqie매우 좋은 팁입니다. 감사합니다. 문제가 프로세스를 특정 대역폭으로 제한하기 때문에 문제가 실제로 해결되지는 않습니다.

나는 다음과 같은 것을 제안하고 싶습니다 :

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

또는 더 이상 사용되지 않는 버전:

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

이는 이미 실행 중인 프로세스에서는 작동하지 않기 때문에 여전히 문제에 맞지 않지만 다른 경우에는 도움이 될 수 있습니다.

링크:

답변4

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

다음 명령은 Updateb(8) 도구를 호출하지만 블록 IO 가중치를 10으로 줄입니다. BlockIOWeight= 속성에 대한 자세한 내용은 systemd.resource-control(5)을 참조하세요.
systemd-run -p BlockIOWeight=10 updatedb

포그라운드에서 프로그램을 실행 하려면 이 --scope옵션을 사용하는 것이 좋습니다.systemd-run

관련 정보