Netflix, 컨테이너 스케일링(Scaling) 병목 현상, CPU 아키텍처(CPU Architecture) 문제 해결

by DD
3개월 전
조회수 62

넷플릭스는 컨테이너 런타임(Container Runtime) 현대화 과정에서 CPU 아키텍처(CPU Architecture) 병목 현상을 발견, 컨테이너 시작 속도 저하(Container Startup Slowdown) 문제 직면

r5.metal 인스턴스(r5.metal Instance)에서 다수의 컨테이너 시작 시 마운트 락 경합(Mount Lock Contention) 발생, 시스템 전체 지연 시간 증가(Latency Increase) 초래

NUMA 아키텍처(NUMA Architecture)하이퍼스레딩(Hyperthreading)이 락 경합(Lock Contention)을 악화시키며, 분산 캐시 아키텍처(Distributed Cache Architecture)가 성능 개선에 기여

넷플릭스는 컨테이너드(containerd) 코드 수정을 통해 레이어별 마운트 연산 횟수를 줄여 병목 현상 해결(Bottleneck Resolution), CPU 아키텍처(CPU Architecture)에 종속되지 않는 스케일링(Scaling) 달성

컨테이너 시작 과정의 마운트 락 경합(Mount Lock Contention)

본문은 넷플릭스(Netflix)가 컨테이너 시작 시 커널 레벨 락(Kernel-level Lock) 경합으로 인해 성능 저하를 겪었다고 설명한다. 특히, user namespace를 사용하는 컨테이너에서 각 레이어(Layer)별로 `open_tree()`, `mount_setattr()`, `move_mount()` 호출이 빈번하게 발생하며, 이 과정에서 글로벌 마운트 락(Global Mount Lock)을 획득하기 위한 경쟁이 심화됨을 강조한다.

r5.metal 인스턴스(r5.metal Instance)에서 다수의 컨테이너를 동시에 시작할 때, CPU 코어(CPU Core)들이 마운트(Mount) 및 언마운트(Umount) 작업에 집중되어 시스템 전체의 응답성이 저하됨

컨테이너 이미지(Container Image)의 레이어(Layer) 수가 많을수록 마운트 연산 횟수가 증가하여 락 경합(Lock Contention) 빈도 증가

결과적으로, 넷플릭스는 컨테이너 시작 시간(Container Startup Time) 증가시스템 불안정성(System Instability) 문제를 경험

새로운 런타임 환경의 차이점: User Namespace와 ID 매핑

글에 따르면 넷플릭스는 기존의 가상 kubelet + 도커(Docker) 솔루션에서 kubelet + 컨테이너드(containerd) 솔루션으로 런타임을 변경하면서 보안(Security) 강화를 위해 각 컨테이너(Container)에 고유한 호스트 유저 범위(Host User Range)를 할당했다.

ID 매핑(ID Mapping): 각 컨테이너(Container)의 UID를 호스트(Host)의 UID로 매핑하여 파일 권한 문제를 해결

User Namespace: 컨테이너 탈출 시 다른 컨테이너에 미치는 영향을 제한하여 보안 강화(Security Enhancement)

문제점: 각 컨테이너(Container)의 고유한 ID 매핑(ID Mapping)을 위해 다수의 마운트(Mount) 연산 필요, 마운트 락 경합(Mount Lock Contention) 발생

결과적으로, 넷플릭스는 보안(Security)과 성능(Performance) 사이의 트레이드 오프(Trade-off)를 경험했다.

하드웨어 아키텍처(Hardware Architecture)의 영향

본문은 CPU 아키텍처(CPU Architecture)가 컨테이너(Container) 시작 성능에 미치는 영향을 분석한다. 특히, NUMA 아키텍처(NUMA Architecture)하이퍼스레딩(Hyperthreading)이 락 경합(Lock Contention)을 악화시키는 주요 원인임을 밝힌다.

NUMA(Non-Uniform Memory Access): r5.metal 인스턴스(r5.metal Instance)와 같이 2-소켓(Dual-socket) 환경에서 원격 메모리 접근 시 지연 시간(Latency) 증가

하이퍼스레딩(Hyperthreading): m7i.metal-24xl 인스턴스(m7i.metal-24xl Instance)에서 하이퍼스레딩(Hyperthreading) 비활성화 시 컨테이너 시작 시간(Container Startup Time) 20-30% 개선

분산 캐시 아키텍처(Distributed Cache Architecture): m7a.24xlarge 인스턴스(m7a.24xlarge Instance)와 같이 분산 캐시(Distributed Cache)를 사용하는 CPU는 락 경합(Lock Contention)에 더 강하며, 성능(Performance) 일관성 유지

결론적으로, 하드웨어 아키텍처(Hardware Architecture)는 컨테이너(Container) 시작 성능에 큰 영향을 미치며, CPU 선택(CPU Selection) 시 워크로드(Workload) 특성을 고려해야 한다.

성능 개선을 위한 소프트웨어 아키텍처(Software Architecture) 변경

넷플릭스는 컨테이너드(containerd) 코드 수정을 통해 마운트(Mount) 연산 횟수를 줄여 성능을 개선했다. 구체적으로, fsconfig() API를 사용하여 레이어(Layer)를 파일 시스템 경로 대신 파일 디스크립터(File Descriptor)로 제공하거나, 모든 레이어의 공통 상위 디렉토리를 매핑하는 방식을 사용했다.

fsconfig() API 활용: move_mount() 시스템 콜(System Call)을 피하여 글로벌 락(Global Lock) 경합 감소

공통 상위 디렉토리 매핑: 컨테이너(Container)당 마운트 연산 횟수를 O(n)에서 O(1)로 줄여 성능 향상(Performance Improvement)

결과: 넷플릭스는 CPU 아키텍처(CPU Architecture)에 종속되지 않고, 더 빠르고 안정적인 컨테이너 스케일링(Container Scaling) 달성

결론적으로, 하드웨어(Hardware)와 소프트웨어(Software)를 함께 고려하여 성능 문제를 해결하는 것이 중요함을 강조한다.

성능 벤치마크(Performance Benchmark) 및 마이크로벤치마크(Microbenchmark) 결과

본문은 다양한 AWS 인스턴스(AWS Instance) 유형에서 컨테이너(Container) 시작 성능을 벤치마킹(Benchmarking)한 결과를 제시한다. 또한, 락 경합(Lock Contention) 문제를 확인하기 위해 자체 제작한 마이크로벤치마크(Microbenchmark) 결과를 통해 NUMA, 하이퍼스레딩(Hyperthreading), CPU 아키텍처(CPU Architecture)의 영향을 입증했다.

r5.metal: 높은 동시성(Concurrency)에서 컨테이너 시작 실패율 증가

m7i.metal-24xl: 하이퍼스레딩(Hyperthreading) 비활성화 시 성능 개선

m7a.24xlarge: 분산 캐시 아키텍처(Distributed Cache Architecture)로 인해 가장 일관된 스케일링(Scaling) 성능

마이크로벤치마크(Microbenchmark): NUMA, 하이퍼스레딩(Hyperthreading), CPU 아키텍처(CPU Architecture)가 락 경합(Lock Contention)에 미치는 영향 확인

결과적으로, 넷플릭스는 벤치마크(Benchmark) 결과를 통해 하드웨어 아키텍처(Hardware Architecture)의 중요성을 입증하고, 최적의 인스턴스(Instance) 선택을 위한 근거를 마련했다.

Mount Mayhem at Netflix: Scaling Containers on Modern CPUs