Linux 서버에서는 수많은 프로세스와 스레드가 동시에 실행됩니다. 하지만 CPU는 한 순간에 제한된 수의 작업만 수행할 수 있기 때문에 운영체제는 실행 중인 작업을 매우 빠르게 번갈아 실행합니다.
이 과정에서 현재 실행 중인 프로세스의 상태를 저장하고, 다른 프로세스의 상태를 복원하는 작업을 Context Switch(컨텍스트 스위치) 라고 합니다.
Context Switch는 Linux Kernel의 핵심 기능 중 하나이며, 너무 자주 발생하면 CPU 성능 저하의 원인이 되기도 합니다. 이번 글에서는 Context Switch의 개념과 동작 원리, 성능에 미치는 영향, 그리고 실무에서 확인하는 방법까지 알아보겠습니다.
Context Switch란?
Context Switch는 CPU가 현재 실행 중인 프로세스 또는 스레드의 실행 정보를 저장하고 다른 작업으로 전환하는 과정입니다.
간단한 흐름은 다음과 같습니다.
Process A 실행
↓
CPU 상태 저장
↓
Process B 상태 복원
↓
Process B 실행
이 과정을 통해 여러 프로그램이 동시에 실행되는 것처럼 보이게 됩니다.
Context란 무엇인가?
Context는 프로세스가 다시 실행되기 위해 필요한 모든 정보를 의미합니다.
대표적으로 다음과 같은 정보가 저장됩니다.
- CPU 레지스터
- Program Counter(PC)
- Stack Pointer(SP)
- CPU Flags
- 메모리 매핑 정보
- 스케줄링 정보
Kernel은 이러한 정보를 저장한 뒤 나중에 다시 복원하여 프로세스를 이어서 실행합니다.
Context Switch는 언제 발생할까?
대표적인 상황은 다음과 같습니다.
- Time Slice 종료
- 높은 우선순위 프로세스 실행
- I/O 대기 발생
- 프로세스 종료
- 인터럽트 발생
- 시스템 호출 후 스케줄링 필요
예를 들어 웹 서버가 디스크 읽기를 기다리는 동안 CPU는 다른 프로세스를 실행합니다.
Context Switch 과정
전체 흐름은 다음과 같습니다.
Process A 실행
↓
CPU 인터럽트
↓
Kernel 진입
↓
Process A 상태 저장
↓
다음 실행 대상 선택
↓
Process B 상태 복원
↓
User Space 복귀
↓
Process B 실행
이 모든 과정은 매우 짧은 시간 안에 수행됩니다.
Context Switch와 Mode Switch의 차이
많은 사람이 두 개념을 혼동합니다.
| 항목 | Context Switch | Mode Switch |
|---|---|---|
| 의미 | 프로세스 변경 | User Mode ↔ Kernel Mode 전환 |
| 대상 | 실행 프로세스 | CPU 실행 모드 |
| 발생 이유 | Scheduler | System Call, Interrupt |
| 프로세스 변경 | 발생 | 발생하지 않을 수도 있음 |
예를 들어 read() System Call은 Mode Switch를 발생시키지만 반드시 Context Switch가 일어나는 것은 아닙니다.
Context Switch 비용
Context Switch는 무료가 아닙니다.
다음 작업이 필요하기 때문입니다.
- CPU 레지스터 저장
- 레지스터 복원
- Kernel 진입
- Scheduler 실행
- 캐시(Cache) 일부 초기화
- TLB 영향
즉, 실제 업무를 하지 않는 시간이 발생합니다.
Context Switch가 너무 많으면 CPU 사용률은 높지만 실제 처리량은 감소할 수 있습니다.
Context Switch 확인하기
Linux에서는 여러 명령으로 확인할 수 있습니다.
전체 시스템 확인
vmstat 1
예시
procs -----------memory----------
cs
15432
16388
15891
cs는 초당 Context Switch 횟수를 의미합니다.
pidstat로 확인
프로세스별 정보를 확인하려면
pidstat -w 1
출력 예시
cswch/s
nvcswch/s
- cswch : Voluntary Context Switch
- nvcswch : Involuntary Context Switch
/proc에서 확인
특정 프로세스의 Context Switch 정보
cat /proc/PID/status
예시
voluntary_ctxt_switches
1452
nonvoluntary_ctxt_switches
38
각 프로세스별 Context Switch 횟수를 확인할 수 있습니다.
Voluntary와 Involuntary Context Switch
Linux에서는 Context Switch를 두 가지로 구분합니다.
Voluntary Context Switch
프로세스가 스스로 CPU를 양보하는 경우입니다.
예를 들어
- sleep()
- I/O 대기
- mutex 대기
Involuntary Context Switch
Kernel Scheduler가 강제로 CPU를 회수하는 경우입니다.
예를 들어
- Time Slice 종료
- 우선순위 높은 프로세스 실행
실무에서는 두 값을 함께 분석합니다.
Context Switch가 많으면 생기는 문제
다음과 같은 현상이 발생할 수 있습니다.
- CPU 사용률 증가
- 응답 속도 저하
- 캐시 효율 감소
- Throughput 감소
- 시스템 지연 증가
특히 수천 개의 스레드가 동작하는 서버에서는 Context Switch가 성능 병목의 원인이 될 수 있습니다.
실무 사례
예를 들어 API 서버의 응답 속도가 갑자기 느려졌다면 다음 순서로 확인합니다.
top으로 CPU 사용률 확인vmstat 1로 Context Switch 확인pidstat -w로 프로세스별 전환 횟수 확인- CPU 바인딩과 스레드 수 확인
- 불필요한 스레드 생성 여부 점검
이러한 절차를 통해 CPU 병목의 원인을 분석할 수 있습니다.
실무에서 자주 사용하는 명령어
전체 Context Switch 확인
vmstat 1
프로세스별 확인
pidstat -w 1
프로세스 상태
cat /proc/PID/status
CPU 사용률
top
CPU 정보
lscpu
실시간 CPU 통계
mpstat -P ALL 1
자주 묻는 질문
Context Switch는 많을수록 좋은가요?
아닙니다. 적절한 수준은 정상적인 동작이지만, 지나치게 많으면 CPU가 실제 작업보다 프로세스 전환에 더 많은 시간을 사용하게 되어 성능이 저하될 수 있습니다.
Context Switch와 Thread Switch는 같은 것인가요?
스레드 전환도 Context Switch의 한 형태입니다. 다만 동일한 프로세스 내부의 스레드 전환은 주소 공간을 공유하기 때문에 일반적인 프로세스 전환보다 비용이 적은 경우가 많습니다.
Context Switch를 줄이는 방법은 무엇인가요?
불필요한 스레드 수를 줄이고, 적절한 스레드 풀을 사용하며, CPU 코어 수에 맞는 프로세스 구성을 하는 것이 도움이 됩니다. 또한 과도한 락 경쟁이나 잦은 I/O 대기도 Context Switch 증가의 원인이 될 수 있습니다.
마무리
Context Switch는 Linux Kernel이 여러 프로세스를 효율적으로 실행하기 위해 반드시 수행하는 핵심 기능입니다. 하지만 전환 과정에는 일정한 비용이 발생하기 때문에 지나치게 많은 Context Switch는 시스템 성능 저하를 유발할 수 있습니다. vmstat, pidstat, /proc 정보를 활용하면 Context Switch를 분석하고 CPU 병목 현상을 보다 효과적으로 진단할 수 있습니다.