반응형
리눅스 커널의 namespace
와 cgroup
은 리소스 격리와 관리의 핵심 기술로, 특히 컨테이너 기술에서 중요하게 사용됩니다.
이 두 기술은 독립적으로 또는 함께 사용되어 프로세스와 시스템 리소스를 효과적으로 격리하고 제어합니다.
1. Namespace
namespace
는 리눅스 커널에서 제공하는 기술로, 시스템 리소스의 독립된 인스턴스를 제공하여 프로세스들을 격리합니다. 각 네임스페이스는 다른 네임스페이스와 격리된 리소스 뷰를 제공하여 마치 독립된 시스템처럼 작동하게 합니다.
주요 네임스페이스 유형
- PID Namespace:
- 프로세스 ID 번호 공간을 격리합니다.
- 각 PID 네임스페이스는 자체 PID 번호를 가지며, 부모 네임스페이스의 PID를 볼 수 있지만 반대는 불가능합니다.
- Mount Namespace:
- 파일 시스템 마운트 포인트를 격리합니다.
- 서로 다른 마운트 네임스페이스에서 파일 시스템을 독립적으로 마운트하거나 언마운트할 수 있습니다.
- UTS Namespace:
- 호스트 이름과 도메인 이름을 격리합니다.
- 각 네임스페이스는 자체 호스트 이름과 도메인 이름을 가질 수 있습니다.
- IPC Namespace:
- System V IPC 객체 및 POSIX 메시지 큐를 격리합니다.
- 각 네임스페이스는 독립된 IPC 리소스를 사용합니다.
- Network Namespace:
- 네트워크 스택(인터페이스, 라우팅 테이블, 방화벽 규칙 등)을 격리합니다.
- 각 네트워크 네임스페이스는 자체 네트워크 인터페이스를 가질 수 있습니다.
- User Namespace:
- 사용자 및 그룹 ID를 격리합니다.
- 네임스페이스 내에서는 루트 권한을 가지지만, 외부에서는 일반 사용자로 보입니다.
- 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 서브시스템
- cpu:
- CPU 사용량을 제어합니다.
- 각 그룹에 CPU 시간을 할당합니다.
- cpuacct:
- CPU 사용량을 모니터링합니다.
- 각 그룹의 CPU 사용량을 통계로 제공합니다.
- memory:
- 메모리 사용량을 제한하고, 메모리 사용량 통계를 제공합니다.
- OOM(Out-Of-Memory) 상황에서 특정 그룹의 프로세스를 종료할 수 있습니다.
- blkio:
- 블록 장치 I/O 사용량을 제어합니다.
- 디스크 읽기/쓰기 속도를 제한합니다.
- net_cls:
- 네트워크 트래픽을 분류하고 제어합니다.
- 각 그룹에 고유한 클래스 ID를 할당하여 트래픽을 관리합니다.
- devices:
- 특정 장치에 대한 접근 권한을 제어합니다.
- 각 그룹의 장치 접근을 허용하거나 차단합니다.
- 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은 리눅스 커널의 강력한 격리 및 리소스 관리 도구로, 현대적인 컨테이너 기반 아키텍처의 핵심을 구성합니다.
반응형
'Linux Unix' 카테고리의 다른 글
[ Linux ] service 등록 (2) - 서비스 파일 옵션 알아보기 (2) | 2024.10.21 |
---|---|
[ Linux ] service 등록 (1) - 서비스로 등록해서 서버 (Daemon) 사용하기 (0) | 2024.10.21 |
[ Linux ] service 등록 - bash script를 서비스로 등록하기 (0) | 2024.10.21 |
[ 리눅스 / Linux ] 리눅스 ABI란? (0) | 2024.07.02 |
[ 리눅스 / Linux ] Windows와 듀얼 부팅으로 설치하기 (0) | 2024.06.19 |