| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- docker
- Reflected
- fork-bomb
- wireshark
- c
- datastructure
- pwnable
- bWAPP
- Dreamhack
- EC2
- cloud
- htmlinjection
- 백준
- AWS
- backjoon
- basicrce3
- 유석종교수님
- 자료구조
- mount
- Reversing
- python
- cgroup
- beebox
- 와이어샤크
- CodeEngn
- Systemhacking
- Linux
- acc
- SISS
- System
- Today
- Total
Ctrl + Shift + ESC
cgroup으로 stress 명령어 CPU 사용 제한하기 본문
* 해당 포스트는 실무 초밀착 리눅스: 클라우드 환경 운영부터 성능분석까지 강의를 듣고 정리한 것입니다.
실습 개요
실제 시나리오: 새벽 2시에 주기적으로 데이터 베이스 서버 응답 성능이 크게 증가했고, 원인 분석 결과 Anti-Virus앱의 주기적인 수행 작업에 영향을 받은 것을 확인했다. Anti-Virus 앱의 수행 작업이 CPU에 영향을 미치는 작업을 줄이기 위해 CPU 사용을 제한한다.
하지만 현재 실습을 진행 중인 t2.micro 인스턴스는 CPU Credit 기반이라 한 번 크레딧을 다 써버리면 EC2가 굉장히 느려진다.
따라서 Anti-Virus 앱을 통해 실습하는 대신 CPU 스트레스 툴을 이용해서 stress 커맨드로 실행시킨다.
또한 강의의 Ubuntu는 이전 버전이었기 때문에 cgroup v1이었지만, 현재 ubuntu 24.04 LTS 버전은 cgroup v2를 사용하고 있다. 이로 인해 실습에서 사용하는 명령어가 달라졌다.
ls /sys/fs/cgroup
/sys/fs/cgroup/cpu/
/sys/fs/cgroup/memory/
/sys/fs/cgroup/pids/
위의 명령어(ls /sys/fs/cgroup)를 입력했을 때 아래와 같은 결과가 나온다면 설치한 ubuntu가 cgroup v1을 사용하므로 강의의 실습을 그대로 따라가도 된다.
ls /sys/fs/cgroup
cgroup.controllers
cgroup.max.depth
cgroup.max.descendants
cgroup.procs
cpu.max
cpu.weight
memory.max
memory.current
...
위의 명령어(ls /sys/fs/cgroup)를 입력했을 때 아래와 같은 결과가 나온다면 설치한 ubuntu가 cgroup v2를 사용한다.
cgroup v2는 서브시스템별 디렉터리가 존재하지 않는다.
실습 진행
sudo apt update
sudo apt install -y stress
stress를 설치한다.
mkdir utils
echo 10000 100000 > cpu.max
echo PID > cgroup.procs
실습대로 utils 폴더를 만들어 CPu 사용량을 제한하면 실제 stress를 실행했을 때 적용되지 않는다.
왜냐하면 /sys/fs/cgroup/utils가 실제 CPU 컨트롤러가 attach되지 않은 프라이빗 cgroup이기 때문이다.
이에 대해 두 가지 해결책이 있다.
방법 1: systemd-run 사용
sudo systemd-run --unit=cpulimit --scope -p CPUQuota=10% stress -c 1
systemd-run은 직접 cgroup 트리를 만들어서 cpu controller를 올바르게 attach시키기 때문에 해당 명령어로 stress를 실행시키면 top으로 cpu 점유율을 확인했을 때 10%만 사용되는 것을 확인할 수 있다.
방법 2: cgroup v2 디렉토리 직접 만들고 제한 걸기
ls /sys/fs/cgroup
cat /sys/fs/cgroup/cgroup.controllers
먼저 root cgroup의 controller를 확인한다.
sudo mkdir /sys/fs/cgroup/utils
sudo echo "+cpu" > /sys/fs/cgroup/cgroup.subtree_control
utils라는 cgroup을 만들고 CPU controller를 활성화한다.
echo $$ > /sys/fs/cgroup/utils/cgroup.procs
현재 프로세스를 cgroup에 넣는다.
echo "10000 100000" > /sys/fs/cgroup/utils/cpu.max
CPU 사용량을 10%로 제한한다.
기존에는 cpu.cfs_period_us, cpu.cfs_quota_us로 분리되어 있었지만 현재는 cpu.max = <max quota> <period> 로 하나의 값 안에 들어가 있다.
stress -c 1
동일한 쉘에서 stress 명령어를 cpu 1개에 적용하는 명령어를 입력한다.
top
쉘을 하나 추가로 열여서 cpu 사용률을 확인한다.

stress 커맨드가 10%의 CPU 사용률을 보이는 것을 확인할 수 있다.
해당 작업을 하지 않으면 100%의 CPU 사용률을 확인할 수 있다.