🐳 AI/데이터 워크로드 필수 설정: Docker 공유 메모리 (shm_size와 ipc) 완벽 이해하기



AI 및 대용량 데이터 처리 워크로드에서 OSError: No space left on device와 같은 알 수 없는 에러를 경험했다면, 대개 도커 컨테이너의 공유 메모리(shm_size) 설정이 부족해서 발생합니다.

이 포스트는 컨테이너 환경에서 공유 메모리가 왜 중요하며, shm_sizeipc: host 옵션을 어떻게 올바르게 설정해야 하는지 명확하게 정리합니다.


1. shm_size의 역할과 중요성

역할: 컨테이너의 공유 메모리 크기 결정

shm_size는 컨테이너 내부의 /dev/shm (POSIX shared memory) 파일 시스템의 최대 크기를 설정하는 옵션입니다.

  • 도커 기본값은 64MB로 매우 작습니다.

  • 주의: /dev/shm호스트 RAM을 사용하는 tmpfs (임시 파일 시스템)이며, VRAM(GPU 메모리)과는 무관합니다.

왜 중요할까?

AI/데이터 처리 작업은 프로세스 간 대량의 데이터를 주고받을 때 이 공유 메모리를 핵심적으로 활용합니다.

  • PyTorch DataLoader: num_workers > 0 설정 시, 워커 프로세스 간 텐서/배치를 공유 메모리로 전달합니다. 이 공간이 부족하면 OSError: No space left on device 에러가 발생합니다.

  • TensorRT 엔진 빌드/서빙: 대용량 중간 아티팩트나 IPC 버퍼로 공유 메모리를 크게 사용하며, 부족할 경우 엔진 빌드 실패나 세그먼트 폴트가 발생할 수 있습니다.

  • 멀티 프로세싱 및 IPC 통신: NCCL, OpenCV, NumPy 등에서 프로세스 간 대용량 배열/버퍼 공유에 필수적입니다.


2. ipc 설정: 공유 메모리의 격리 범위



IPC (Inter-Process Communication) namespace는 컨테이너의 프로세스 간 통신 공간(공유 메모리, 세마포어 등)을 어떤 범위로 격리할지 정하는 도커 옵션입니다.

ipc 설정 동작 방식 /dev/shm 크기 결정
기본 (생략) 컨테이너 자체 IPC 네임스페이스 사용 (격리) shm_size로 지정된 크기 (기본값 64MB)
ipc: host 컨테이너가 호스트의 IPC 네임스페이스 공유 호스트의 /dev/shm 크기 (일반적으로 RAM의 절반)
ipc: container:<ID> 지정한 다른 컨테이너와 IPC 공유 공유 대상 컨테이너의 설정 따름

3. shm_size와 ipc: host 동시 사용 시 동작 원리 (예제 분석)

일반적으로 AI/LLM 작업에서 shm_size: "16g"ipc: host를 함께 설정하는 경우가 많습니다. 이때 어떤 설정이 적용되는지 실제 예제를 통해 알아봅니다.

예제: 설정 및 결과 분석

Docker Compose 설정 스니펫 컨테이너 내부 df -h /dev/shm 확인 결과
shm_size: "16g"
ipc: host
Filesystem tmpfs Size 60G
Used 8.3M
Avail 60G
Use% 1%
Mounted on /dev/shm

결론: ipc: hostshm_size를 무시합니다.

  1. ipc: host가 적용되면: 컨테이너는 호스트의 IPC 네임스페이스를 그대로 씁니다.

  2. shm_size: "16g"는 무시됩니다: 이 옵션은 자체 IPC 네임스페이스를 쓸 때만 의미가 있습니다.

  3. 60G의 출처: 호스트 리눅스 시스템은 기본적으로 /dev/shm전체 RAM의 절반 정도로 설정하는 경우가 많습니다. 따라서 위 예시에서 컨테이너는 호스트의 120G 중 절반인 60G를 그대로 보고 있는 것입니다.

핵심 요약

ipc: host를 설정하면 컨테이너는 호스트의 공유 메모리 공간을 그대로 사용하므로, shm_size 설정은 실제로 적용되지 않습니다.


4. 권장 운영법 및 메모리 상한 관리

💡 실무 권장 선택지

  1. ✅ 안정성 우선 (추천): ipc: host 유지

    • 설정: ipc: host만 유지 (혹은 shm_size와 함께 두어도 됨)

    • 결과: 호스트의 넉넉한 /dev/shm 크기를 사용합니다 (예: 60G).

    • 장점: 대부분의 AI/데이터 작업에서 공유 메모리 부족 에러를 원천적으로 방지하며 가장 안정적입니다. 60G는 최대치일 뿐, 실제 사용량만 RAM을 차지하므로 메모리 압박이 없다면 그대로 두는 것이 편합니다.

  2. ✅ 컨테이너별 상한 강제: ipc: host 제거

    • 설정: ipc: host 제거 + shm_size: "8g" 또는 "16g" 명시

    • 결과: 컨테이너 전용의 16GB /dev/shm가 생성됩니다.

    • 장점: 여러 컨테이너가 돌 때 각 컨테이너의 공유 메모리 사용 상한을 명확하게 제한할 수 있어, 호스트 RAM 보호 및 격리에 유리합니다.

⚙️ 호스트 /dev/shm 크기 조정 방법 (선택지 1 사용 시)

ipc: host를 사용하면서 호스트의 /dev/shm 크기 자체를 변경하고 싶다면, tmpfs 설정을 바꿔야 합니다.

  • 일시적으로 크기 변경 (재부팅 시 원복):
sudo mount -o remount,size=16G /dev/shm
(모든 프로세스/컨테이너에 즉시 적용됩니다.)
  • 영구적으로 크기 변경 (/etc/fstab 수정):
# /etc/fstab 파일에 다음 라인 추가/수정
tmpfs /dev/shm tmpfs defaults,size=16G 0 0
저장 후 재부팅하거나 위 `remount` 명령어로 즉시 적용합니다.

언제 키워야 할까? DataLoader 워커가 많거나 TensorRT 엔진 빌드 중 간헐적으로 No space left on device 에러가 발생할 때 shm_size 또는 호스트 /dev/shm 크기를 최소 8G 이상으로 조정해야 합니다.