본문 바로가기

Linux Unix

[ 리눅스 / Linux ] 네임스페이스, Cgroup을 알아보기

반응형

리눅스 커널의 namespacecgroup은 리소스 격리와 관리의 핵심 기술로, 특히 컨테이너 기술에서 중요하게 사용됩니다.
이 두 기술은 독립적으로 또는 함께 사용되어 프로세스와 시스템 리소스를 효과적으로 격리하고 제어합니다.

1. Namespace

namespace는 리눅스 커널에서 제공하는 기술로, 시스템 리소스의 독립된 인스턴스를 제공하여 프로세스들을 격리합니다. 각 네임스페이스는 다른 네임스페이스와 격리된 리소스 뷰를 제공하여 마치 독립된 시스템처럼 작동하게 합니다.

주요 네임스페이스 유형

  1. PID Namespace:
    • 프로세스 ID 번호 공간을 격리합니다.
    • 각 PID 네임스페이스는 자체 PID 번호를 가지며, 부모 네임스페이스의 PID를 볼 수 있지만 반대는 불가능합니다.
  2. Mount Namespace:
    • 파일 시스템 마운트 포인트를 격리합니다.
    • 서로 다른 마운트 네임스페이스에서 파일 시스템을 독립적으로 마운트하거나 언마운트할 수 있습니다.
  3. UTS Namespace:
    • 호스트 이름과 도메인 이름을 격리합니다.
    • 각 네임스페이스는 자체 호스트 이름과 도메인 이름을 가질 수 있습니다.
  4. IPC Namespace:
    • System V IPC 객체 및 POSIX 메시지 큐를 격리합니다.
    • 각 네임스페이스는 독립된 IPC 리소스를 사용합니다.
  5. Network Namespace:
    • 네트워크 스택(인터페이스, 라우팅 테이블, 방화벽 규칙 등)을 격리합니다.
    • 각 네트워크 네임스페이스는 자체 네트워크 인터페이스를 가질 수 있습니다.
  6. User Namespace:
    • 사용자 및 그룹 ID를 격리합니다.
    • 네임스페이스 내에서는 루트 권한을 가지지만, 외부에서는 일반 사용자로 보입니다.
  7. Cgroup Namespace:
    • Cgroup(컨트롤 그룹) 계층 구조를 격리합니다.
    • 각 네임스페이스는 자체 Cgroup 계층 구조를 가질 수 있습니다.

네임스페이스 예제

# 새로운 PID 네임스페이스에서 bash 실행
unshare --pid --fork --mount-proc /bin/bash

# 새로운 bash 세션에서의 프로세스 ID 확인
ps

2. Cgroup (Control Groups)

cgroup은 리눅스 커널에서 프로세스 그룹에 시스템 리소스를 할당하고 제한하는 기술입니다. 이를 통해 CPU, 메모리, 디스크 I/O, 네트워크 대역폭 등을 제어하고 모니터링할 수 있습니다.

주요 Cgroup 서브시스템

  1. cpu:
    • CPU 사용량을 제어합니다.
    • 각 그룹에 CPU 시간을 할당합니다.
  2. cpuacct:
    • CPU 사용량을 모니터링합니다.
    • 각 그룹의 CPU 사용량을 통계로 제공합니다.
  3. memory:
    • 메모리 사용량을 제한하고, 메모리 사용량 통계를 제공합니다.
    • OOM(Out-Of-Memory) 상황에서 특정 그룹의 프로세스를 종료할 수 있습니다.
  4. blkio:
    • 블록 장치 I/O 사용량을 제어합니다.
    • 디스크 읽기/쓰기 속도를 제한합니다.
  5. net_cls:
    • 네트워크 트래픽을 분류하고 제어합니다.
    • 각 그룹에 고유한 클래스 ID를 할당하여 트래픽을 관리합니다.
  6. devices:
    • 특정 장치에 대한 접근 권한을 제어합니다.
    • 각 그룹의 장치 접근을 허용하거나 차단합니다.
  7. freezer:
    • 프로세스를 일시 중단하거나 재개합니다.
    • 시스템 관리 작업 중에 프로세스를 중단할 수 있습니다.

Cgroup 예제

# cgroup-tools 설치
sudo apt-get install cgroup-tools

# 새로운 cgroup 생성
sudo cgcreate -g memory:/mygroup

# 메모리 제한 설정 (예: 500MB)
sudo cgset -r memory.limit_in_bytes=500M mygroup

# cgroup에 프로세스 추가
sudo cgclassify -g memory:mygroup <PID>

3. 네임스페이스와 Cgroup의 결합

컨테이너 기술(예: Docker, Kubernetes)은 네임스페이스와 Cgroup을 결합하여 격리된 환경에서 프로세스를 실행하고 리소스를 관리합니다. 네임스페이스는 격리된 시스템 뷰를 제공하고, Cgroup은 리소스 사용을 제어합니다. 이를 통해 각 컨테이너는 독립된 시스템처럼 동작하면서도 호스트 시스템의 리소스를 효율적으로 공유할 수 있습니다.

Docker 예제

Docker 컨테이너는 네임스페이스와 Cgroup을 결합하여 실행됩니다.

# 새로운 Docker 컨테이너 실행
docker run -d --name mycontainer nginx

# 컨테이너의 네임스페이스와 Cgroup 확인
docker inspect --format '{{.State.Pid}}' mycontainer
ls /proc/$(docker inspect --format '{{.State.Pid}}' mycontainer)/ns
ls /sys/fs/cgroup/memory/docker/$(docker inspect --format '{{.Id}}' mycontainer)/

이와 같이, 네임스페이스와 Cgroup은 리눅스 커널의 강력한 격리 및 리소스 관리 도구로, 현대적인 컨테이너 기반 아키텍처의 핵심을 구성합니다.

반응형