Ubuntu cgroups를 사용하여 명령의 CPU 및 메모리 사용량을 제한합니다.

만약 특정 명령어가 우분투 데스크톱 속도를 저하시키거나 서버 메모리 부족 현상을 일으킨다면, 해당 명령어와 그 자식 프로세스들을 CPU 할당량과 메모리 사용량 제한이 있는 systemd 관리형 cgroup에 넣어두세요. 최신 우분투 버전에서는 `cgroup.com` 명령어가 systemd-run --scope가장 빠르고 실용적인 방법입니다. 이 명령어는 명령어를 임시 스코프에서 실행하고, systemd는 cgroup 제어를 통해 제한을 적용합니다.

아래 예시는 작업 부하를 CPU 용량의 절반과 1GiB의 메모리로 제한합니다. 이러한 제한은 자식 프로세스를 포함한 전체 범위에 적용되며, 프로그램이 특정 속도로 실행될 것이라는 보장은 아닙니다.

프로세스에 cgroup 제한이 필요한 이유

사용량이 많은 프로세스는 대화형 애플리케이션과 경쟁할 수 있으며, 메모리 사용량이 많은 프로세스는 시스템이 메모리 회수 요청이나 메모리 부족 상태를 유발하게 할 수 있습니다. cgroup은 프로세스와 그 하위 프로세스를 그룹화하여 커널이 해당 그룹을 관리하고 제한할 수 있도록 합니다. 우분투의 systemd는 이러한 제어에 편리한 인터페이스를 제공합니다.

CPU 및 메모리 설정은 서로 다르게 동작합니다. CPUQuota=50%CPU 사용 시간은 스케줄링 기간 동안 평균적으로 하나의 CPU 용량의 절반으로 제한됩니다. 1 값은 200%사용 가능한 경우 최대 두 개의 CPU에 해당하는 시간을 나타냅니다. 이는 상한선이며, CPU 우선순위 또는 예약이 아닙니다. MemoryMax=1Gcgroup에 할당되는 메모리에 대한 엄격한 상한선을 설정합니다. 작업 부하가 이 상한선 이하로 유지되지 않으면 커널은 메모리를 회수하거나 해당 cgroup에 속한 프로세스에 대해 메모리 부족으로 인한 종료를 호출할 수 있습니다. 애플리케이션과 자식 프로세스를 위한 여유 공간을 확보하여 제한값을 선택하십시오.

1. Ubuntu에서 cgroup v2를 사용하고 있는지 확인하십시오.

systemd를 사용하는 Ubuntu 시스템은 일반적으로 통합 cgroup v2 계층 구조를 사용합니다. 다음에 표시되는 경로를 사용하기 전에 현재 설정을 확인하십시오.

stat -fc %T /sys/fs/cgroup
systemctl --version | head -n 1

첫 번째 명령은 올바른 파일 시스템 유형을 반환해야 합니다 cgroup2fs. 다른 파일 시스템 유형이 반환되면 이 문서의 cgroup v2 파일 경로는 그대로 적용할 수 없습니다. systemd 속성은 다른 계층 구조에서도 지원될 수 있지만, v2 경로를 복사하는 대신 해당 배포판의 문서를 참조하십시오.

속성이 거부되는 경우 정확한 systemd 버전을 확인하십시오. Ubuntu의 Noble 문서에서는 CPUQuota=이를 MemoryMax=리소스 제어 설정으로 설명하고 있으며, 이전 Ubuntu 릴리스에는 다른 systemd 버전이 포함될 수 있습니다.

2. 제한된 범위 내에서 작업량을 시작하십시오.

프로그램을 실행하려면 systemd-run실제 실행 파일과 인수를 입력하세요. 현재 디렉터리의 명령을 실행하려면 를 사용 ./하고 모든 인수를 뒤에 전달하세요 --.

systemd-run --scope \
  -p CPUQuota=50% \
  -p MemoryMax=1G \
  -- ./my-program --input data.csv
CPUQuota를 50%, MemoryMax를 1G로 설정한 systemd-run이 실행 중인 Ubuntu 터미널에서 명령어를 실행합니다.
CPU 및 메모리 제한이 있는 임시 systemd 스코프 내에서 명령을 실행합니다.

사용자 소유 명령의 경우, sudo먼저 루트 권한 없이 시도해 보세요. systemd에서 요청한 컨트롤러 또는 속성을 사용할 수 없다고 보고하는 경우, 사용자 관리자에게 해당 권한을 위임할 권한이 없을 수 있습니다. 시스템 전체 워크로드의 경우 루트 권한으로 다시 시도하는 것이 적절할 수 있지만, 이렇게 하면 명령의 보안 컨텍스트가 변경됩니다. 신뢰할 수 없는 프로그램을 루트 권한으로 함부로 실행하지 마세요. 시스템 관리자를 루트 권한으로 사용해야 하는 경우, sudo systemd-run --scope ...해당 변경 사항을 고려한 후에만 사용하세요.

명령이 실행되는 동안 터미널은 스코프에 연결된 상태를 유지합니다. 키를 누르면 Ctrl+C포그라운드 작업이 중단됩니다. 스코프는 일시적이며 일반적으로 프로세스가 종료되면 사라집니다. 이는 향후 실행에 대한 영구적인 정책이 아니라, 제한된 조건 하에서 명령을 시작하는 편리한 방법입니다.

3. 범위를 파악하고 그 한계를 검토하십시오.

systemd-run명령이 생성된 유닛 이름을 출력합니다. 일반적으로 와 같은 형식입니다 run-….scope. 명령이 실행 중인 동안 cgroup 트리를 나열합니다.

systemd-cgls

임시 스코프를 찾고 대상 프로그램과 그 하위 프로그램이 해당 스코프 아래에 나타나는지 확인하십시오. 이는 중요합니다. 스코프 외부에서 실행되는 하위 프로그램은 동일한 cgroup 상한의 적용을 받지 않기 때문입니다.

터미널 cgroup 트리는 프로그램과 두 개의 작업자 프로세스를 포함하는 임시 실행 범위를 보여줍니다.
cgroup 트리를 사용하여 프로그램과 해당 워커가 임시 범위 아래에 그룹화되었는지 확인하십시오.

다음 명령에서 출력된 범위 이름을 사용하십시오. <범위 이름> 부분을 run-abc.scope실제 이름으로 바꾸십시오.

systemctl show run-abc.scope \
  -p ControlGroup -p CPUQuotaPerSecUSec -p MemoryMax

CPUQuotaPerSecUSec=50000systemd의 할당 주기가 100ms일 때 50% 할당량과 일치합니다. MemoryMax=10737418241GiB는 바이트 단위입니다. 상위 cgroup 및 사용 가능한 컨트롤러가 실제 결과에 영향을 미칠 수 있으므로 모든 호스트가 모든 요청을 변경 없이 수락한다고 가정하는 것보다 실시간 값을 사용하는 것이 더 유용합니다.

systemctl show 명령의 출력 결과에는 ControlGroup, CPU 할당량 및 메모리 최대값이 일시적인 범위에 대해 표시됩니다.
범위에 보고된 제어 그룹과 구성된 CPU 및 메모리 제한을 확인하십시오.

4. 커널 cgroup 파일을 확인하고 안전하게 조정하십시오.

이 ControlGroup속성은 cgroup 경로를 기준으로 상대적인 경로를 제공합니다 /sys/fs/cgroup. 이 경로를 셸 변수에 저장하면 명령어가 컴퓨터에 실제로 할당된 경로를 따라 실행됩니다.

UNIT=run-abc.scope
CG=$(systemctl show "$UNIT" -p ControlGroup --value)
printf 'Group: %s\n' "$CG"
cat "/sys/fs/cgroup$CG/cpu.max"
cat "/sys/fs/cgroup$CG/memory.max"

cgroup v2에서는 cpu.max할당량과 주기를 마이크로초 단위로 지정합니다. 예를 들어, 50000 100000는 100ms 주기마다 50ms의 CPU 시간을 의미합니다. 는 memory.max메모리 상한을 바이트 단위로 표시합니다. 파일이 누락된 경우, 스코프가 여전히 활성화되어 있고 커널이 cgroup v2를 사용하고 있는지 확인하십시오.

터미널에서 sysfs cgroup v2의 systemd 범위에서 cpu.max 및 memory.max 값을 읽는 중
커널의 cgroup v2 파일을 읽어 구성된 할당량과 메모리 상한을 확인합니다.

이름이 지정된 장기 실행 유닛을 시작하고 해당 유닛의 제한을 조정해야 하는 경우, systemd는 활성 유닛의 리소스 속성을 변경하는 기능을 지원합니다 sudo systemctl set-property --runtime my-worker.service CPUQuota=50% MemoryMax=1G. 예를 들어, `service_unique_resource_property`와 같은 속성을 변경할 수 있습니다. 이 기능은 해당 서비스의 cgroup에 적용되며 적절한 권한이 필요합니다. systemd는 PID를 알고 있다는 이유만으로 이미 실행 중인 프로세스를 임의로 연결하지 않습니다. 일회성 프로세스의 경우, 해당 프로세스를 정상적으로 종료한 후 제한된 범위에서 다시 시작하십시오. 지속적인 서비스의 경우, 서비스 유닛 또는 systemd 드롭인에서 속성을 구성하고 적절한 유지 관리 기간 동안 다시 시작하십시오.

결과를 ​​확인하세요

검사하는 동안 작업 부하를 활성 상태로 유지하십시오. systemd-cgls프로세스와 그 하위 프로세스가 의도한 범위 내에 배치되는지, systemctl show요청된 속성이 보고되는지, 그리고 해당 cpu.max파일 memory.max이 유한한 값을 가지고 존재하는지 확인하십시오. 프로세스가 종료되면 임시 범위가 제거되므로 cgroup 파일이 사라질 수 있습니다.

할당량은 CPU 시간을 제한하지만 데스크톱 모니터에서 고정된 백분율을 보장하지는 않으며, 하드웨어 메모리 제한은 애플리케이션이 제한량보다 더 많은 메모리를 필요로 할 경우 오류를 발생시킬 수 있습니다. 작업 부하가 불안정해지면 애플리케이션을 중지하고 측정된 안전 값으로 제한량을 높이거나, MemoryHigh=더 높은 할당량과 함께 더 완화된 부하 임계값을 사용하십시오 MemoryMax=. 정확한 동작 방식은 설치된 systemd 및 커널 문서를 참조하십시오. 가장 권위 있는 참조 자료는 Ubuntu systemd-run 설명서 , Ubuntu systemd 리소스 제어 설명서 및 Linux 커널 cgroup v2 설명서 입니다 .

댓글 남기기

3상 전압, 전류, kW, kVA 및 역률 변환 방법

3상 전압, 전류, kW, kVA 및 역률 변환 방법

균형 잡힌 3상 공식을 배우고, 선간 전압, 전류, kW, kVA 및 역률을 단계별로 변환하는 방법을 예제와 함께 확인하고 점검 범위를 살펴보세요.

Ubuntu cgroups를 사용하여 명령의 CPU 및 메모리 사용량을 제한합니다.

Ubuntu cgroups를 사용하여 명령의 CPU 및 메모리 사용량을 제한합니다.

CPUQuota 및 MemoryMax를 사용하여 systemd 범위 내에서 워크로드를 실행한 다음 cgroup v2를 통해 제한 사항을 확인합니다.

Ubuntu Server 24.04에서 Pi-hole 업스트림 DNS를 암호화합니다.

Ubuntu Server 24.04에서 Pi-hole 업스트림 DNS를 암호화합니다.

Ubuntu 24.04에서 dnscrypt-proxy를 Pi-hole의 로컬 DoH 브리지로 설정하고, localhost 전용 리스너, 리졸버 선택, DNS 전환 전 검사 기능을 추가합니다.

Wayland 환경에서 Ubuntu 24.04 터치패드 제스처를 작동시키는 방법

Wayland 환경에서 Ubuntu 24.04 터치패드 제스처를 작동시키는 방법

앱이나 하드웨어 문제를 해결하기 전에 우분투의 터치패드 설정을 확인하고, 웨이랜드(Wayland)가 제대로 작동하는지 확인하고, GNOME에 내장된 스와이프 기능을 테스트해 보세요.

mdadm을 사용하여 Debian 12 RAID 1 미러 구축하기

mdadm을 사용하여 Debian 12 RAID 1 미러 구축하기

데비안 12에서 디스크 두 개를 사용하여 RAID 1 데이터 어레이를 생성 및 검증하고, 안전하게 포맷한 다음, 재부팅 후 자동으로 구성 및 마운트되도록 설정합니다.

매 부팅 시 새로운 키로 Debian 12 Swap을 암호화합니다.

매 부팅 시 새로운 키로 Debian 12 Swap을 암호화합니다.

기존 Debian 12 스왑 파티션에 대한 임의 키 암호화를 설정하고, 활성 dm-crypt 매핑을 확인하고, 최대 절전 모드의 장단점을 이해합니다.

우분투 24.04에서 SSH 사용자의 접근을 특정 디렉터리로 제한하는 방법 (SFTP Chroot 가이드)

우분투 24.04에서 SSH 사용자의 접근을 특정 디렉터리로 제한하는 방법 (SFTP Chroot 가이드)

Ubuntu 24.04 SSH 계정을 chroot 환경, 적절한 권한, 일치 규칙 및 안전한 테스트를 통해 지정된 SFTP 폴더로 제한하고 셸 액세스 권한은 부여하지 않습니다.

우분투의 APT 잠금을 안전하게 해제하고 업데이트를 완료하세요

우분투의 APT 잠금을 안전하게 해제하고 업데이트를 완료하세요

우분투의 dpkg 프런트엔드 잠금을 소유하는 프로세스를 찾아 패키지 작업이 완료될 때까지 기다리고, 잠금 파일을 삭제하지 않고 중단된 설치를 복구합니다.

우분투 데스크톱에서 Btrfs 스냅샷을 자동으로 설정하는 방법

우분투 데스크톱에서 Btrfs 스냅샷을 자동으로 설정하는 방법

Timeshift를 사용하여 Ubuntu Desktop에서 Btrfs 시스템 스냅샷을 예약 설정하고, Ubuntu 서브볼륨 레이아웃을 확인하고, 보존 기간을 선택하고, 스냅샷으로 보호할 수 없는 항목을 이해합니다.

종속성 손상 없이 Debian 12를 Testing으로 마이그레이션하는 방법

종속성 손상 없이 Debian 12를 Testing으로 마이그레이션하는 방법

보다 안전한 데비안 12에서 테스팅 버전으로의 마이그레이션을 계획하세요: 스테이블 버전을 거쳐 업그레이드하고, 백업하고, APT 소스를 정리하고, 종속성 변경 사항을 시뮬레이션하고, 변경 사항을 확인하세요.