Docker 시니어 성능 최적화 면접

Docker 시니어 (7년+) 성능 최적화 5문항 조회수 51 · 2026-09-10 (목) 17:41:26
1 컨테이너 I/O 성능 최적화
Hard

Q. 프로덕션 환경에서 데이터베이스 컨테이너의 디스크 I/O 성능이 예상보다 50% 낮게 측정되었습니다. Docker의 스토리지 성능을 진단하고 최적화하기 위해 어떤 메트릭을 측정하고, 어떤 최적화 전략을 적용하시겠습니까? 특히 볼륨 드라이버 선택, Direct I/O, fsync 동작, 그리고 호스트 파일시스템 튜닝을 포함해서 설명해주세요.

컨테이너 스토리지 레이어 구조와 호스트 파일시스템의 관계, 그리고 I/O 경로 최적화를 생각해보세요.

A. 모범답안

먼저 iostat, docker stats, blktrace로 IOPS, 처리량, 지연시간을 측정하고 CoW 오버헤드를 확인합니다. 볼륨 드라이버는 overlay2 대신 직접 볼륨 마운트를 사용하고, 호스트에 XFS나 ext4를 noatime 옵션으로 마운트하여 메타데이터 업데이트를 최소화합니다. 데이터베이스 컨테이너는 --storage-opt로 direct I/O를 활성화하고, 볼륨을 tmpfs로 분리하여 임시 파일 I/O를 메모리로 처리합니다. 호스트 커널 파라미터(vm.dirty_ratio, vm.swappiness)를 튜닝하고, 필요시 raw block device를 직접 마운트하여 파일시스템 오버헤드를 제거합니다. SSD 환경에서는 I/O 스케줄러를 noop이나 deadline으로 변경하고, 컨테이너별 I/O 가중치(--blkio-weight)를 설정하여 리소스 경합을 관리합니다.

핵심 포인트
  • • iostat, blktrace로 IOPS와 지연시간 측정 및 CoW 오버헤드 확인
  • • 볼륨 직접 마운트와 noatime 옵션으로 메타데이터 오버헤드 제거
  • • direct I/O 활성화 및 tmpfs 분리로 I/O 경로 최적화
  • • 커널 파라미터 튜닝과 I/O 스케줄러 최적화로 호스트 레벨 성능 개선
답변에 넣으면 좋은 키워드
iostat IOPS direct I/O noatime blkio-weight fsync CoW 오버헤드
실무에서는

고성능 데이터베이스나 분석 워크로드를 컨테이너로 운영할 때 I/O 병목을 해결하는 상황

Follow-up 질문

NVMe SSD 환경에서 컨테이너 I/O 성능을 극대화하기 위해 io_uring이나 SPDK 같은 최신 I/O 기술을 Docker 환경에 어떻게 적용할 수 있을까요?

2 컨테이너 네트워크 성능 최적화
Hard

Q. 마이크로서비스 환경에서 컨테이너 간 통신 지연이 호스트 간 직접 통신 대비 2배 이상 높게 측정되었습니다. Docker 네트워크 스택의 성능 병목을 진단하고, NAT 오버헤드, 브리지 네트워크의 패킷 경로, 그리고 네트워크 드라이버 선택을 통해 레이턴시와 처리량을 개선하는 방법을 설명해주세요. 특히 host 네트워크와 macvlan의 트레이드오프를 포함해주세요.

패킷이 컨테이너에서 호스트를 거쳐 다른 컨테이너로 가는 경로와 각 단계의 오버헤드를 분석해보세요.

A. 모범답안

먼저 tcpdump, netstat, iperf3로 패킷 지연과 처리량을 측정하고, docker network inspect로 네트워크 토폴로지를 확인합니다. 브리지 네트워크는 veth pair와 iptables NAT를 거치면서 오버헤드가 발생하므로, 같은 호스트 내 통신은 host 네트워크 모드로 전환하여 네트워크 스택을 우회합니다. 멀티 호스트 환경에서는 overlay 대신 macvlan을 사용해 컨테이너에 직접 MAC 주소를 할당하여 브리지를 제거합니다. hairpin NAT 문제는 --userland-proxy=false로 해결하고, 커널의 conntrack 테이블 크기를 늘려 연결 추적 병목을 제거합니다. CPU 바운드 워크로드는 --network=host로 최대 성능을 얻되, 포트 충돌과 격리 약화를 감안해야 합니다. SR-IOV나 DPDK 같은 하드웨어 가속을 지원하는 CNI 플러그인 도입도 고려합니다.

핵심 포인트
  • • tcpdump, iperf3로 패킷 경로와 지연 측정
  • • host 네트워크 모드로 veth와 NAT 오버헤드 제거
  • • macvlan으로 브리지 우회 및 직접 네트워크 액세스
  • • conntrack 튜닝과 userland-proxy 비활성화로 커널 레벨 최적화
답변에 넣으면 좋은 키워드
veth pair NAT 오버헤드 macvlan host 네트워크 conntrack hairpin NAT SR-IOV
실무에서는

고빈도 트레이딩이나 실시간 처리 시스템에서 마이크로서비스 간 통신 레이턴시를 최소화해야 하는 상황

Follow-up 질문

서비스 메시(Istio, Linkerd)를 도입할 때 사이드카 프록시가 추가하는 네트워크 레이턴시를 어떻게 측정하고 최소화할 수 있을까요?

3 컨테이너 메모리 성능 최적화
Hard

Q. 대규모 트래픽 처리 중 일부 컨테이너에서 OOM Killer가 빈번히 발생하고, 다른 컨테이너들은 메모리 스왑을 과도하게 사용하여 성능이 저하되고 있습니다. Docker의 메모리 관리 메커니즘을 설명하고, 메모리 제한(--memory), 예약(--memory-reservation), 스왑(--memory-swap), OOM 스코어 조정을 활용하여 안정적인 메모리 사용 전략을 수립하는 방법을 설명해주세요.

cgroups의 메모리 제어 메커니즘과 커널의 메모리 회수 정책을 고려해보세요.

A. 모범답안

먼저 docker stats와 cAdvisor로 컨테이너별 메모리 사용량, 캐시, RSS, 스왑을 모니터링하고 메모리 압박 상황을 식별합니다. --memory로 하드 리미트를 설정하되, --memory-reservation으로 소프트 리미트를 두어 평상시엔 유연하게 사용하고 호스트 메모리 부족 시 우선 회수되도록 합니다. --memory-swap=0 또는 --memory와 동일하게 설정하여 스왑 사용을 제한하고, I/O 병목을 방지합니다. 중요한 서비스는 --oom-score-adj로 OOM Killer 우선순위를 낮추고, 배치 작업은 높여서 메모리 부족 시 희생 순서를 제어합니다. 애플리케이션 레벨에서는 힙 크기를 컨테이너 메모리 제한의 75% 이하로 설정하고, 메모리 프로파일링으로 누수를 제거합니다. cgroups v2 환경에서는 memory.high를 활용해 throttling을 통한 점진적 압박 관리가 가능합니다.

핵심 포인트
  • • 메모리 사용량과 스왑 모니터링으로 병목 식별
  • • memory-reservation으로 soft limit 설정 및 유연한 메모리 관리
  • • 스왑 제한과 OOM 스코어 조정으로 안정성 확보
  • • 애플리케이션 힙 크기 조정 및 메모리 누수 제거
답변에 넣으면 좋은 키워드
OOM Killer memory-reservation memory-swap oom-score-adj cgroups RSS 메모리 throttling
실무에서는

대용량 데이터 처리나 캐시 서버를 운영할 때 메모리 부족으로 인한 장애를 예방하는 상황

Follow-up 질문

Java 애플리케이션 컨테이너에서 JVM이 컨테이너 메모리 제한을 인식하지 못하는 문제를 어떻게 해결하고, 네이티브 메모리 누수를 진단할 수 있을까요?

4 컨테이너 CPU 성능 최적화
Medium

Q. 멀티테넌트 컨테이너 환경에서 일부 노이지 네이버(noisy neighbor) 컨테이너가 CPU를 독점하여 다른 컨테이너의 응답 시간이 급격히 증가했습니다. Docker의 CPU 제한 옵션(--cpus, --cpu-shares, --cpu-quota, --cpuset-cpus)의 차이점을 설명하고, CPU throttling과 컨텍스트 스위칭을 최소화하면서 공정한 CPU 분배를 달성하는 전략을 제시해주세요.

CFS 스케줄러의 동작 방식과 하드 리미트 vs 상대적 가중치의 차이를 생각해보세요.

A. 모범답안

먼저 docker stats로 CPU 사용률과 throttling을 확인하고, perf나 top으로 컨텍스트 스위칭과 CPU 경합을 측정합니다. --cpus는 절대적 CPU 코어 수를 제한하여 하드 캡을 설정하고, --cpu-shares는 상대적 가중치로 CPU가 경합할 때만 작동하므로 우선순위 기반 분배에 사용합니다. --cpu-quota와 --cpu-period는 CFS 스케줄러의 시간 슬라이스를 직접 제어하여 세밀한 조정이 가능하지만, 과도한 제한은 throttling을 유발합니다. --cpuset-cpus로 특정 CPU 코어를 할당하여 NUMA 노드 최적화와 캐시 친화성을 개선하고, 중요 서비스는 전용 코어를 배정합니다. CPU 바운드 워크로드는 --cpus로 명확히 제한하고, 버스트 가능한 워크로드는 --cpu-shares로 유연성을 확보합니다. 모니터링으로 nr_throttled, throttled_time 메트릭을 추적하여 과도한 throttling을 감지하고 제한을 조정합니다.

핵심 포인트
  • • CPU 사용률과 throttling 메트릭 모니터링
  • • cpus로 하드 리미트, cpu-shares로 상대적 우선순위 설정
  • • cpuset-cpus로 코어 고정 및 NUMA 최적화
  • • throttled_time 추적으로 과도한 제한 조정
답변에 넣으면 좋은 키워드
CPU throttling cpu-shares CFS 스케줄러 cpuset-cpus NUMA noisy neighbor 컨텍스트 스위칭
실무에서는

공유 클러스터에서 배치 작업과 실시간 서비스를 함께 운영할 때 CPU 리소스를 공정하게 분배하는 상황

Follow-up 질문

하이퍼스레딩 환경에서 물리 코어와 논리 코어를 구분하여 컨테이너에 할당해야 하는 이유와 방법은 무엇인가요?

5 컨테이너 동시성 및 스케일링 성능
Hard

Q. 트래픽 급증 시 컨테이너를 수평 확장했지만, 전체 처리량이 선형적으로 증가하지 않고 특정 시점 이후 오히려 감소하는 현상이 발생했습니다. Docker 환경에서 컨테이너 스케일링의 성능 병목을 진단하고, 공유 리소스 경합(파일 디스크립터, 네트워크 포트, 데이터베이스 커넥션), 로드 밸런서 설정, 그리고 호스트 커널 파라미터 튜닝을 통해 스케일링 효율성을 개선하는 방법을 설명해주세요.

Amdahl의 법칙과 공유 리소스의 직렬화 지점을 생각해보세요.

A. 모범답안

먼저 부하 테스트로 처리량과 응답 시간의 관계를 측정하고, 어느 지점에서 성능이 포화되는지 식별합니다. 파일 디스크립터 제한은 ulimit과 --ulimit nofile로 증가시키고, 호스트의 fs.file-max, net.core.somaxconn을 튜닝합니다. 네트워크 포트 고갈은 net.ipv4.ip_local_port_range를 확장하고, TIME_WAIT 소켓은 net.ipv4.tcp_tw_reuse로 재사용을 활성화합니다. 데이터베이스 커넥션 풀은 컨테이너 수에 맞춰 조정하고, 커넥션 풀 크기를 (CPU 코어 수 * 2 + 효과적인 스핀들 수)로 설정합니다. 로드 밸런서는 least_conn이나 IP 해시로 세션 친화성을 관리하고, keep-alive로 연결 재사용을 활성화합니다. 호스트의 IRQ 밸런싱과 네트워크 카드 RSS(Receive Side Scaling)를 설정하여 멀티코어 활용을 극대화하고, 컨테이너별 CPU affinity를 설정하여 캐시 미스를 줄입니다. 공유 상태는 Redis 같은 외부 캐시로 분리하여 컨테이너 간 경합을 제거합니다.

핵심 포인트
  • • 부하 테스트로 포화 지점 식별 및 병목 분석
  • • 파일 디스크립터와 네트워크 포트 제한 증가
  • • 데이터베이스 커넥션 풀 최적화 및 외부 캐시 활용
  • • IRQ 밸런싱과 RSS로 멀티코어 활용 극대화
답변에 넣으면 좋은 키워드
Amdahl의 법칙 파일 디스크립터 커넥션 풀 TIME_WAIT IRQ 밸런싱 RSS 수평 확장
실무에서는

이커머스 플래시 세일이나 실시간 이벤트 처리에서 급격한 트래픽 증가에 대응하는 상황

Follow-up 질문

Kubernetes HPA(Horizontal Pod Autoscaler)를 사용할 때 스케일 아웃/인 속도와 메트릭 선택이 성능에 미치는 영향을 어떻게 최적화할 수 있을까요?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!