긴급 상황에서 tty 세션을 생성하고 메모리를 많이 차지하는 X 응용 프로그램을 종료할 수 있도록 소량의 CPU와 메모리를 예약하고 싶습니다.cgroup이 기능을 제공하세요. 모든 X 애플리케이션을 자동으로 cgroup에 넣는 방법은 무엇입니까?
답변1
저는 Debian을 사용하므로 솔루션은 systemd
cgroup 구현을 기반으로 합니다.
첫 번째 단계는 cgroups 계층 구조를 확인하는 것입니다:
> systemd-cgls
-.slice
├─user.slice
│ └─user-1000.slice
│ ├─[email protected]
.....
│ └─session-2.scope
│ ├─1376 lightdm --session-child 14 21
│ ├─1400 x-window-manager
.....
systemd
cgroup을 터미널 세션에 자동으로 할당합니다. cgroup 계층 구조 내에서 session-*.scope
X 애플리케이션이 있는지 확인해야 합니다 . 기본 X 세션 범위 번호는 항상 동일합니다.
범위 내의 모든 프로그램에 대한 메모리 제한을 설정하려면 다음을 입력하십시오.
> systemctl set-property session-2.scope MemoryLimit=14G
이 명령은 재부팅할 때까지 메모리 제한을 세션 2로 설정합니다.
이 규칙을 영구적으로 만들려면 다음을 실행하세요.
> sudo systemctl edit session-2.scope
텍스트 편집기에 입력
[Scope]
MemoryLimit=14G
그리고 저장하세요. 이 규칙은 재부팅 후에도 유지됩니다. 동일한 파일에서 다른 리소스 제한을 설정할 수 있습니다.
편집하다
derobert가 지적했듯이 X 세션 범위 번호는 동일하다고 보장되지 않습니다. 보다 안정적인 솔루션은 런타임에 이 숫자를 결정하는 것입니다.
문서 /usr/local/bin/resource_limit.sh
:
#!/bin/bash
for s in $(systemd-cgls --no-pager --user-unit \
| grep --extended-regexp --only-matching \
'session-.{1,3}\.scope');do
systemctl set-property --runtime "$s" MemoryLimit="$1"
done
문서 /etc/systemd/system/resource_limit.service
:
[Unit]
Description=Limit resources
Requires=multi-user.target
After=multi-user.target
[Service]
Type=oneshot
ExecStartPre=/bin/sleep 5
ExecStart=/usr/local/bin/resource_limit.sh 14G
ExecStop=/usr/local/bin/resource_limit.sh 20G
RemainAfterExit=true
[Install]
WantedBy=graphical.target
위 파일을 시스템에 복사하고 명령을 실행하십시오.
systemctl daemon-reload
그런 다음 명령을 사용하여 지정된 제한(이 경우 14G)을 설정할 수 있습니다.
systemctl start resource_limit.service
설정을 해제하려면 명령을 사용하세요(일부 더 높은 제한 설정).
systemctl stop resource_limit.service
재부팅 시 이 스크립트를 자동으로 실행하려면 다음 명령을 실행하십시오.
systemctl enable resource_limit.service
참고 1
X 세션이 충분히 빠르게 시작되지 않으면 ExecStartPre
서비스를 수동으로 활성화하여 서비스 대기 시간을 늘려야 할 수도 있습니다.
노트 2
[email protected]
약간 더 큰 제한(여기서 1000은 UID임)을 추가하는 것이 좋습니다 . 이렇게 하면 시스템 데몬이 항상 사용할 수 있는 리소스를 갖게 됩니다.