systemd로 시스템 자원 제한하기

markyang92·2021년 5월 7일
0

systemd

목록 보기
6/7

다수의 사람들이 공동으로 사용하는 시스템, 여러 프로세스들이 돌아가는 서버라면 특정 사용자특정 프로세스가 자원을 독점하여 다른 작업에 지장이 생기는 문제에 대해 민감하다.

  • systemd limitation feature
    • cpu, memory, nums of process, IO 제한
    • systemd는 hierarchy 적으로 서비스를 관리
      • 특정 사용자, 컨테이너, 서비스 하위 모든 프로세스에 대해 제한이 가능하다.
    • 다만 이러한 limitation 기능을 사용하려면 2가지 Prerequisite이 있다.
      • systemd version >= v240: 2018.12 release
      • CGroup v2를 사용하도록 해야한다.
        • 부팅 때 커널 옵션으로 systemd.unified_cgroup_hierarchy=1을 넣어야한다.
        • systemd version < v241는 default로 CGroup v1 사용함을 주의
        • systemd version v241 부터는 default CGroup v2, 해당 버전 이후로는 커널 옵션 필요없음
        • Ubuntu 20.04인 본인 컴퓨터에서는 systemd --version 결과 245로 나옴
  • systemd 리소스 제한 옵션
    • CPUQuota: CPU 할당 비율(%)
    • MemoryHigh: 메모리 제한 크기
    • MemoryMax: 메모리 최대 사용 크기
    • TaskMax: 최대 프로세스 수
    • systemd.resource-control(5) man page see more features
  1. CPUQuota
    • CPU의 얼마만큼을 할당할 지에 관한 % 값을 받는 옵션
    • 100% = CPU의 한 코어를 전부 사용할 수 있다는 뜻
    • 200% = CPU 코어를 최대 2개까지로 제한
  1. MemoryHigh

    • 메모리가 제한될 크기
    • 이 옵션에 설정된 메모리까지 사용한다면 시스템은 공격적으로 메모리를 회수하여 프로세스는 느려진다.
    • 어쩔 수 없는 경우는 이 값을 넘어 메모리를 할당하기도한다.
  2. MemoryMax

    • 말그대로 최대 메모리 제한
  3. TasksMask

    • 최대 프로세스 수
    • 여기 설정된 값 넘어 프로세스를 생성하지 않는다.

사용 예:
$ sudo systemctl set-property <NAME> MemoryHigh=3G MemoryMax=4G
$ sudo systemctl --runtime set-property <NAME> MemoryHigh=3G MemoryMax=4G


systemd-cgls: systemd 계층확인

$ systemd-cgls

  • 현재 실행되고 있는 서비스들과 각 계층 확인
    • -.slice로 부터 모든 프로세스가 시작
    • .slice, .service, .scope리소스 제한 걸수 있다.
  • 일시적 리소스 제한은 systemctl--runtime 옵션을 주면, 리부팅시 걸었던 옵션 사라진다.

리소스 제한 예


system.slice에 뭐가 많이 달려 있는데 한번 확인해보자.

  • Tasks: 815
  • Memory: 27.8G
  • CGroup: /user.slice

메모리 제한을 위해서는 systemctl의 set-property명령을 사용한다.

$ sudo systemctl --runtime set-property user.slice MemoryHigh=3G MemoryMax=4G

설정 후,

$ sudo systemctl status user.slice


특정 사용자 제한: edit

  1. systemd-cgls에서 user-UID.slice에 자원 제한걸면 되는데..
  2. user-.slice는 특수한 slice이므로 set-property를 사용할 수 없다!!!
    edit이라는 명령을 사용해야한다!!
  3. $ sudo systemctl --runtime --force edit user-.slice
  4. editor가 뜬다! editor에서 제한 명령입력
  5. 저장후 나감
  6. $ sudo systemctl status user-1000.slice

default 되돌리기

$ sudo systemctl revert <NAME>

$ sudo systemctl revert user.slice

$ sudo systemctl revert user-1000.slice
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글