운영체제 시니어 트러블슈팅 면접

운영체제 시니어 (7년+) 트러블슈팅 7문항 조회수 61 · 2026-09-11 (금) 07:42:08
1 프로세스 스케줄링
Hard

Q. 프로덕션 서버에서 특정 애플리케이션의 응답 시간이 불규칙하게 급증하는 현상이 발생했습니다. top 명령으로 확인했을 때 CPU idle은 충분하지만 load average가 CPU 코어 수의 3배를 초과하고 있습니다. 프로세스 상태를 확인했을 때 대부분이 D state(uninterruptible sleep)에 있습니다. 이 상황의 원인을 진단하는 절차와 근본 원인을 파악하기 위해 확인해야 할 시스템 메트릭, 그리고 해결 방안을 단계별로 설명해주세요.

D state 프로세스는 주로 I/O 대기 상태이며, load average에는 포함되지만 CPU 사용률에는 반영되지 않습니다.

A. 모범답안

D state 프로세스는 I/O 작업을 기다리며 인터럽트할 수 없는 상태로, 디스크나 네트워크 I/O 병목을 의미합니다. iostat, iotop으로 디스크 I/O 대기 시간과 iowait%를 확인하고, vmstat으로 블록 I/O 통계를 분석해야 합니다. /proc/[pid]/stack을 통해 커널 스택 트레이스를 확인하여 어떤 시스템 콜에서 블로킹되는지 파악합니다. 스토리지 레이어에서는 디스크 큐 깊이, RAID 컨트롤러 상태, 파일시스템 메타데이터 경합을 점검해야 합니다. 단기 해결책으로는 I/O 스케줄러 변경(deadline, noop), 장기적으로는 스토리지 업그레이드나 애플리케이션의 I/O 패턴 최적화(배치 처리, 비동기 I/O)를 고려해야 합니다. 재발 방지를 위해 iowait, disk latency에 대한 알림을 설정하고 I/O 부하 테스트를 정기적으로 수행해야 합니다.

핵심 포인트
  • • D state는 I/O 대기로 인한 uninterruptible sleep 상태
  • • iostat, iotop, /proc/[pid]/stack으로 I/O 병목 진단
  • • 디스크 큐 깊이, 파일시스템 메타데이터 경합 확인
  • • I/O 스케줄러 튜닝과 애플리케이션 I/O 패턴 최적화
답변에 넣으면 좋은 키워드
D state uninterruptible sleep iowait iostat iotop /proc/stack I/O 스케줄러
실무에서는

데이터베이스나 로그 처리 서버에서 디스크 I/O 병목으로 인한 응답 지연을 진단하고 해결할 때 필수적입니다.

Follow-up 질문

I/O 스케줄러를 CFQ에서 deadline으로 변경했을 때 어떤 워크로드에서 성능 개선을 기대할 수 있으며, 반대로 성능이 저하될 수 있는 경우는 무엇인가요?

2 메모리 관리
Hard

Q. 대용량 데이터 처리 애플리케이션에서 메모리 누수 의심 상황이 발생했습니다. 프로세스의 RSS는 계속 증가하지만 애플리케이션 레벨의 힙 메모리 사용량은 안정적입니다. pmap과 /proc/[pid]/smaps를 분석했을 때 anonymous 영역이 지속적으로 증가하고 있으며, 특히 64MB 단위의 메모리 영역이 반복적으로 할당되어 있습니다. 이러한 현상의 원인을 진단하는 방법과 glibc malloc, mmap threshold, 메모리 단편화 관점에서의 분석 접근법을 설명해주세요.

glibc의 메모리 할당자는 일정 크기 이상의 할당 요청에 대해 mmap을 사용하며, 해제된 메모리를 즉시 OS에 반환하지 않을 수 있습니다.

A. 모범답안

glibc malloc은 작은 메모리는 arena에서 관리하고, MMAP_THRESHOLD(기본 128KB) 이상은 mmap으로 직접 할당합니다. 64MB 단위 할당은 mmap 영역이며, malloc_trim()이 호출되지 않으면 해제 후에도 OS에 반환되지 않습니다. /proc/[pid]/smaps에서 각 메모리 영역의 Rss, Pss, Referenced 값을 비교하여 실제 사용 중인 메모리와 할당만 된 메모리를 구분해야 합니다. malloc_stats(), mallopt()로 arena 개수와 메모리 할당 정책을 확인하고, MALLOC_MMAP_THRESHOLD_ 환경변수로 threshold를 조정할 수 있습니다. strace로 mmap/munmap 시스템 콜 패턴을 추적하고, valgrind나 AddressSanitizer로 실제 메모리 누수 여부를 검증해야 합니다. 해결책으로는 주기적인 malloc_trim() 호출, jemalloc이나 tcmalloc 같은 대체 allocator 사용, 또는 메모리 풀 패턴으로 애플리케이션 재설계를 고려할 수 있습니다.

핵심 포인트
  • • glibc malloc의 mmap threshold와 arena 메커니즘 이해
  • • /proc/[pid]/smaps로 메모리 영역별 실제 사용량 분석
  • • malloc_trim()을 통한 메모리 반환과 대체 allocator 고려
  • • strace, valgrind로 시스템 콜과 실제 누수 검증
답변에 넣으면 좋은 키워드
glibc malloc mmap threshold arena malloc_trim smaps 메모리 단편화 jemalloc
실무에서는

장시간 실행되는 서버 애플리케이션에서 RSS 증가로 인한 메모리 부족 상황을 진단하고 해결할 때 사용됩니다.

Follow-up 질문

jemalloc과 tcmalloc의 메모리 할당 전략 차이와 각각 어떤 워크로드에 적합한지 설명해주세요.

3 파일시스템
Hard

Q. 프로덕션 환경에서 특정 디렉토리에 대한 ls 명령이 수십 초 이상 소요되며, 해당 디렉토리를 사용하는 애플리케이션의 파일 오픈 성능이 급격히 저하되었습니다. 디렉토리에는 수백만 개의 작은 파일이 있으며, ext4 파일시스템을 사용 중입니다. inode 고갈은 아니며 디스크 공간도 충분합니다. 이 상황의 원인을 파일시스템 메타데이터 구조 관점에서 분석하고, 진단 도구와 단기/장기 해결 방안을 제시해주세요.

ext4의 디렉토리 인덱싱 기능(dir_index)과 디렉토리 엔트리 조회 성능 간의 관계를 생각해보세요.

A. 모범답안

ext4에서 대량의 파일이 있는 디렉토리는 dir_index(HTree) 기능이 활성화되어 있어도 디렉토리 엔트리 조회 시 성능 저하가 발생할 수 있습니다. dumpe2fs나 tune2fs로 dir_index 플래그 활성화 여부를 확인하고, debugfs의 htree 명령으로 디렉토리 인덱스 구조를 분석해야 합니다. stat 시스템 콜이 느리다면 getdents64 호출 시 대량의 디렉토리 엔트리를 순회하는 것이 원인이며, strace로 시스템 콜 레이턴시를 측정할 수 있습니다. 단기 해결책으로는 디렉토리를 해시 기반 서브디렉토리로 재구성하거나(예: 파일명 첫 2자로 분산), 파일 접근 패턴을 최적화하여 stat 호출을 줄여야 합니다. 장기적으로는 XFS 파일시스템 마이그레이션(더 나은 대용량 디렉토리 처리), 또는 객체 스토리지나 데이터베이스 기반 메타데이터 관리로 아키텍처를 변경하는 것을 고려해야 합니다. 재발 방지를 위해 디렉토리당 파일 수 제한 정책과 모니터링을 수립해야 합니다.

핵심 포인트
  • • ext4 dir_index(HTree) 기능과 대용량 디렉토리 성능 한계
  • • dumpe2fs, debugfs, strace로 파일시스템 메타데이터 분석
  • • 해시 기반 서브디렉토리 구조로 재구성
  • • XFS 마이그레이션 또는 아키텍처 레벨 해결책 고려
답변에 넣으면 좋은 키워드
ext4 dir_index HTree getdents64 debugfs XFS 디렉토리 엔트리
실무에서는

로그 파일이나 임시 파일을 대량으로 생성하는 시스템에서 파일 접근 성능 저하를 해결할 때 필요합니다.

Follow-up 질문

XFS와 ext4의 디렉토리 구조 차이와 각각 어떤 파일 접근 패턴에 유리한지 설명해주세요.

4 네트워크 스택
Hard

Q. 고성능 API 서버에서 간헐적으로 클라이언트 연결이 끊어지는 현상이 발생합니다. 서버 로그에는 에러가 없지만, 클라이언트는 connection reset by peer 오류를 받습니다. ss 명령으로 확인했을 때 CLOSE_WAIT 상태의 소켓이 수천 개 누적되어 있고, netstat의 overflowed 카운터가 지속적으로 증가하고 있습니다. TCP 연결 수립 과정과 백로그 큐 메커니즘 관점에서 원인을 분석하고, 커널 파라미터 튜닝과 애플리케이션 레벨 대응 방안을 설명해주세요.

CLOSE_WAIT는 애플리케이션이 소켓을 닫지 않아 발생하며, overflowed는 accept 큐와 관련이 있습니다.

A. 모범답안

CLOSE_WAIT 상태는 원격에서 FIN을 보냈지만 애플리케이션이 소켓을 close()하지 않아 발생하며, 이는 애플리케이션의 소켓 누수를 의미합니다. netstat의 overflowed는 accept 큐가 가득 차서 SYN+ACK를 받은 연결을 처리하지 못한 경우이며, somaxconn과 애플리케이션의 listen backlog 설정을 확인해야 합니다. lsof나 ss -p로 CLOSE_WAIT 소켓을 소유한 프로세스를 식별하고, 애플리케이션 코드에서 연결 종료 처리 로직(finally 블록, connection pool 관리)을 점검해야 합니다. /proc/sys/net/ipv4/tcp_abort_on_overflow를 1로 설정하면 큐 오버플로우 시 명시적으로 RST를 보내며, net.core.somaxconn과 net.ipv4.tcp_max_syn_backlog를 증가시켜 연결 대기 큐를 확장할 수 있습니다. 근본 원인은 애플리케이션이 accept()를 충분히 빠르게 호출하지 못하거나 소켓을 제대로 닫지 않는 것이므로, 비동기 I/O 모델 도입, 워커 스레드 증설, graceful shutdown 로직 개선이 필요합니다. 재발 방지를 위해 CLOSE_WAIT 소켓 수와 accept queue overflow를 모니터링해야 합니다.

핵심 포인트
  • • CLOSE_WAIT는 애플리케이션 소켓 누수, overflowed는 accept 큐 부족
  • • somaxconn, tcp_max_syn_backlog 커널 파라미터 튜닝
  • • lsof, ss로 소켓 소유 프로세스 식별 및 코드 레벨 수정
  • • 비동기 I/O와 graceful shutdown으로 근본 해결
답변에 넣으면 좋은 키워드
CLOSE_WAIT accept queue somaxconn tcp_abort_on_overflow connection reset 소켓 누수
실무에서는

높은 동시 접속을 처리하는 웹 서버나 API 게이트웨이에서 연결 거부 문제를 해결할 때 필수적입니다.

Follow-up 질문

SYN queue와 accept queue의 차이, 그리고 SYN flooding 공격 시 각 큐에 미치는 영향을 설명해주세요.

5 동기화 및 데드락
Hard

Q. 멀티스레드 애플리케이션에서 간헐적으로 전체 워커 스레드가 응답하지 않는 행잉 현상이 발생합니다. gdb로 스레드 덤프를 확인했을 때 여러 스레드가 pthread_mutex_lock에서 블로킹되어 있고, 각 스레드가 서로 다른 뮤텍스를 기다리는 순환 대기 상태입니다. 커널 레벨에서 futex 시스템 콜 관점에서 데드락을 진단하는 방법과, strace, perf, /proc/[pid]/task 정보를 활용한 분석 절차, 그리고 사후 분석을 위한 코어 덤프 수집 전략을 설명해주세요.

pthread 뮤텍스는 내부적으로 futex 시스템 콜을 사용하며, 데드락 탐지는 락 순서 그래프 분석이 필요합니다.

A. 모범답안

pthread_mutex는 커널의 futex(fast userspace mutex)를 사용하며, 경합 시 futex 시스템 콜로 대기 큐에 들어갑니다. strace -f -e futex로 각 스레드의 futex 대기 상태를 추적하고, 어떤 주소의 뮤텍스를 기다리는지 확인할 수 있습니다. gdb로 모든 스레드의 백트레이스를 수집하고(thread apply all bt), 각 스레드가 보유한 락과 대기 중인 락을 매핑하여 순환 대기 그래프를 그려야 합니다. /proc/[pid]/task/[tid]/wchan으로 각 스레드가 대기 중인 커널 함수를 확인하고, perf record -g로 스택 샘플을 수집하여 락 경합 핫스팟을 식별할 수 있습니다. 사후 분석을 위해서는 ulimit -c unlimited 설정 후 kill -ABRT로 코어 덤프를 생성하거나, gcore로 라이브 프로세스의 코어를 덤프해야 합니다. 근본 해결책은 락 획득 순서를 일관되게 강제하거나(lock ordering), 타임아웃 기반 락(pthread_mutex_timedlock), 또는 락 프리 자료구조 도입을 고려해야 합니다. 재발 방지를 위해 ThreadSanitizer나 Helgrind 같은 데드락 탐지 도구를 CI에 통합해야 합니다.

핵심 포인트
  • • futex 시스템 콜과 pthread 뮤텍스의 관계
  • • strace, gdb, /proc/wchan으로 락 대기 상태 분석
  • • 순환 대기 그래프를 그려 데드락 확인
  • • 코어 덤프 수집과 락 순서 강제 또는 락 프리 구조 도입
답변에 넣으면 좋은 키워드
futex 데드락 pthread_mutex 순환 대기 gdb backtrace wchan ThreadSanitizer
실무에서는

고성능 멀티스레드 서버에서 간헐적 행잉 문제를 진단하고 데드락을 제거할 때 필요합니다.

Follow-up 질문

락 프리(lock-free) 자료구조의 ABA 문제와 이를 해결하기 위한 기법들을 설명해주세요.

6 시스템 콜 및 성능
Medium

Q. 마이크로서비스 아키텍처의 API 게이트웨이에서 레이턴시가 평소보다 2배 이상 증가했습니다. 애플리케이션 코드는 변경되지 않았으며, CPU와 메모리 사용률도 정상입니다. perf를 사용하여 프로파일링한 결과 시스템 콜 오버헤드가 크게 증가했고, 특히 context switch 횟수가 급증했습니다. vmstat에서 cs(context switch) 값이 평소의 10배이며, in(interrupt) 값도 함께 증가했습니다. 이 상황의 원인을 진단하는 절차와 인터럽트, 스케줄링, IRQ affinity 관점에서의 분석 방법을 설명해주세요.

과도한 컨텍스트 스위치는 스레드 경합, 인터럽트 처리, 또는 스케줄러 설정과 관련이 있을 수 있습니다.

A. 모범답안

컨텍스트 스위치 급증은 과도한 스레드 경합, 인터럽트 처리 부하, 또는 스케줄러 정책 변경이 원인일 수 있습니다. pidstat -w로 프로세스별 voluntary/involuntary 컨텍스트 스위치를 구분하여, voluntary가 높으면 I/O 대기나 락 경합, involuntary가 높으면 CPU 시간 만료나 우선순위 선점을 의미합니다. /proc/interrupts로 인터럽트 분포를 확인하고, 특정 CPU 코어에 인터럽트가 집중되는지 점검해야 하며, irqbalance 데몬 상태와 /proc/irq/[num]/smp_affinity 설정을 확인합니다. perf sched record로 스케줄링 이벤트를 기록하고 perf sched latency로 스케줄 지연을 분석하여 어떤 프로세스가 CPU를 과도하게 경합하는지 파악합니다. 네트워크 카드의 인터럽트 코어레싱이나 NUMA 노드 배치 문제도 확인해야 하며, ethtool -l로 NIC의 RX/TX 큐 수와 CPU 매핑을 점검합니다. 해결책으로는 IRQ affinity 조정, 애플리케이션 스레드 풀 크기 최적화, CPU pinning으로 캐시 지역성 개선, 또는 인터럽트 통합(interrupt coalescing) 설정을 고려할 수 있습니다.

핵심 포인트
  • • pidstat으로 voluntary/involuntary 컨텍스트 스위치 구분
  • • /proc/interrupts와 IRQ affinity 설정 확인
  • • perf sched로 스케줄링 지연 분석
  • • NIC 큐 매핑과 NUMA 배치 최적화
답변에 넣으면 좋은 키워드
context switch perf sched IRQ affinity pidstat 인터럽트 irqbalance NUMA
실무에서는

고성능 네트워크 서비스에서 갑작스러운 레이턴시 증가 원인을 진단하고 시스템 레벨 최적화를 수행할 때 사용됩니다.

Follow-up 질문

NUMA 아키텍처에서 원격 메모리 접근이 성능에 미치는 영향과 numactl을 사용한 최적화 방법을 설명해주세요.

7 커널 및 시스템 안정성
Hard

Q. 프로덕션 서버에서 커널 패닉이 발생하여 시스템이 재부팅되었습니다. /var/crash에 vmcore 파일이 생성되었으며, dmesg 로그에는 RIP(instruction pointer)와 Call Trace가 기록되어 있습니다. 로그 분석 결과 특정 커널 모듈의 함수에서 NULL 포인터 역참조가 발생한 것으로 보입니다. crash 유틸리티를 사용한 커널 덤프 분석 절차와 커널 오류 원인 파악 방법, 그리고 재발 방지를 위한 커널 파라미터 설정 및 모니터링 전략을 설명해주세요.

커널 덤프 분석에는 crash 유틸리티와 디버그 심볼이 필요하며, 스택 트레이스에서 문제 함수를 역추적할 수 있습니다.

A. 모범답안

커널 패닉 분석은 crash 유틸리티로 vmcore와 디버그 심볼(debuginfo 패키지)을 로드하여 시작합니다. crash 내에서 bt(backtrace) 명령으로 패닉 시점의 커널 스택을 확인하고, dis(disassemble)로 RIP 주소의 어셈블리 코드를 분석하여 어떤 명령에서 실패했는지 파악합니다. log 명령으로 커널 메시지 버퍼를 확인하고, mod 명령으로 로드된 모듈 목록과 주소를 점검하여 문제 모듈을 식별합니다. NULL 포인터 역참조라면 해당 모듈의 버그이므로 커널 버전과 모듈 버전을 확인하고, 알려진 버그인지 upstream 패치가 있는지 검색해야 합니다. 단기 대응으로는 문제 모듈을 블랙리스트에 추가하거나(/etc/modprobe.d/blacklist.conf), 모듈 파라미터를 조정하여 회피할 수 있습니다. kdump 설정을 점검하여 향후 패닉 시 자동으로 덤프가 수집되도록 하고, kernel.panic 파라미터로 패닉 후 자동 재부팅 시간을 설정합니다. 재발 방지를 위해 커널과 드라이버를 최신 안정 버전으로 유지하고, 하드웨어 오류 가능성도 함께 점검해야 합니다.

핵심 포인트
  • • crash 유틸리티로 vmcore 분석 및 스택 트레이스 확인
  • • RIP 주소 디스어셈블과 문제 모듈 식별
  • • 모듈 블랙리스트 또는 파라미터 조정으로 회피
  • • kdump 설정과 커널 버전 관리로 재발 방지
답변에 넣으면 좋은 키워드
커널 패닉 vmcore crash kdump backtrace NULL 포인터 커널 모듈
실무에서는

프로덕션 환경에서 커널 패닉 발생 시 원인을 정확히 진단하고 신속하게 복구하는 데 필수적입니다.

Follow-up 질문

kdump의 메모리 예약 메커니즘과 crashkernel 파라미터 설정 시 고려사항을 설명해주세요.

댓글 0

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

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