편집하다

편집하다

긴급 상황에서 tty 세션을 생성하고 메모리를 많이 차지하는 X 응용 프로그램을 종료할 수 있도록 소량의 CPU와 메모리를 예약하고 싶습니다.cgroup이 기능을 제공하세요. 모든 X 애플리케이션을 자동으로 cgroup에 넣는 방법은 무엇입니까?

답변1

저는 Debian을 사용하므로 솔루션은 systemdcgroup 구현을 기반으로 합니다.

첫 번째 단계는 cgroups 계층 구조를 확인하는 것입니다:

> systemd-cgls
-.slice
├─user.slice
│ └─user-1000.slice
│   ├─[email protected]
.....
│   └─session-2.scope
│     ├─1376 lightdm --session-child 14 21
│     ├─1400 x-window-manager
.....

systemdcgroup을 터미널 세션에 자동으로 할당합니다. cgroup 계층 구조 내에서 session-*.scopeX 애플리케이션이 있는지 확인해야 합니다 . 기본 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임)을 추가하는 것이 좋습니다 . 이렇게 하면 시스템 데몬이 항상 사용할 수 있는 리소스를 갖게 됩니다.

관련 정보