유저들의 메모리 사용량 총량 제한하기
예전에 구글링하면서 시도했었는데 잘 안 됐다. 설정파일 편집하고 어쩌고... 이런건 걸렸는데 적용하는 방법을 몰랐다. 하지만 지금은 챗gpt가 있으니까~
https://gist.github.com/AliKhadivi/bd1fa0fee51a06841f03961b5945f3cf
/etc/cgconfig.conf 파일을 만들자.
group rnd_group {
memory {
memory.limit_in_bytes = 20G;
}
}
/etc/cgrules.conf 파일도 만들자.
user1 memory rnd_group
user2 memory rnd_group
user3 memory rnd_group
* sudo cgconfigparser -l /etc/cgconfig.conf (cgconfig.conf 적용)
* sudo cgrulesengd -vvv (cgrules.conf 적용)
* stress -m 4 --vm-bytes 10G --vm-keep -t 10 (4개 worker + 10G per worker로 총 40G의 램 점유 시도)
stress는 우분투 기준 stress 패키지가 필요하다. 나머지는 cgroup관련 명령어들은 cgroup-tools 패키지가 필요함.
위에서 제시한 cgconfig.conf에서 메모리 점유를 20G로 세팅했으니 40G를 점유하려는 시도는 실패할 것이다. 이렇게:
$ stress -m 4 --vm-bytes 10G --vm-keep -t 10
stress: info: [3753582] dispatching hogs: 0 cpu, 0 io, 4 vm, 0 hdd
stress: FAIL: [3753582] (415) <-- worker 3753585 got signal 9
stress: WARN: [3753582] (417) now reaping child worker processes
stress: FAIL: [3753582] (451) failed run completed in 3s
나중에 램 허용량을 100G까지 올리고 다시 stress test를 해보면
$ stress -m 4 --vm-bytes 10G --vm-keep -t 10
stress: info: [3884900] dispatching hogs: 0 cpu, 0 io, 4 vm, 0 hdd
stress: info: [3884900] successful run completed in 11s
이렇게 결과가 바뀐다.
재부팅후에도 규칙들이 적용되게 하려면 systemctl 세팅을 만들어야하는데 좀 귀찮다...;; askubuntu.com 링크에 적힌대로 하면 됨...;; 이하 복붙한다.
-------------------------------
We have to make this persistent (so that this is all not lost after reboots). We'll create systemd services for doing this.
Create a service for parsing
vi /etc/systemd/system/cgconfigparser.service
Enter the following
[Unit]
Description=cgroup config parser
After=network.target
[Service]
User=root
Group=root
ExecStart=/usr/sbin/cgconfigparser -l /etc/cgconfig.conf
Type=oneshot
[Install]
WantedBy=multi-user.target
Create a service for applying the rules
vi /etc/systemd/system/cgrulesgend.service
Enter the following
[Unit]
Description=cgroup rules generator
After=network.target cgconfigparser.service
[Service]
User=root
Group=root
Type=forking
EnvironmentFile=-/etc/cgred.conf
ExecStart=/usr/sbin/cgrulesengd
Restart=on-failure
[Install]
WantedBy=multi-user.target
Now reload the systemd daemon, enable the services, and start them
# Reload context daemon to 'discover' everything
sudo systemctl daemon-reload
# Enable services to run on boot
sudo systemctl enable cgconfigparser
sudo systemctl enable cgrulesgend
# Start them
sudo systemctl start cgconfigparser
sudo systemctl start cgrulesgend
2024-11-04 추가
/usr/sbin/cgconfigparser; error loading /etc/cgconfig.conf: Cgroup, requested group parameter does not exist
이런 에러가 나올 때가 있다. cgrules v2에서는 cgconfig.conf 에서 요구하는 parameter 이름이 좀 다르다.
memory.limit_in_bytes -> memory.max 가 되었다.
그리고 그외 memory.high 같은 다른 옵션도 생겨서 soft limit도 적용 가능해졌다.