Context Switching은 CPU가 하나의 작업에서 다른 작업으로 전환하는 과정이다.
멀티태스킹 환경에서 여러 프로세스를 동시에 실행하기 위해 필수적인 동작이다.
하지만 Context Switching은 비용이 없는 작업이 아니다.
과도하게 발생하면 CPU 성능이 떨어지고 시스템 전체가 느려질 수 있다.
1. Context Switching이란
CPU는 한 번에 하나의 작업만 실행할 수 있다.
여러 프로세스를 번갈아 실행하기 위해 현재 상태를 저장하고 다른 작업으로 전환한다.
이 과정이 Context Switching이다.
여기서 Context는 다음 정보를 포함한다.
- 레지스터 값
- 프로그램 카운터
- 스택 상태
- 메모리 정보
2. 왜 발생하는가
Context Switching은 다음 상황에서 발생한다.
- 타임 슬라이스 종료
- I/O 대기
- 우선순위 변경
- 인터럽트 발생
운영체제는 공정하게 CPU를 분배하기 위해 일정 시간마다 작업을 교체한다.
이 과정이 반복되면서 여러 프로그램이 동시에 실행되는 것처럼 보인다.
3. 프로세스 vs 스레드 Context Switching
Context Switching은 프로세스 단위와 스레드 단위에서 발생한다.
두 경우의 비용은 다르다.
프로세스 Context Switching
- 메모리 공간 변경 필요
- 비용이 큼
스레드 Context Switching
- 같은 메모리 공간 공유
- 비용이 상대적으로 적음
그래서 고성능 서버에서는 멀티프로세스보다 멀티스레드를 사용하는 경우가 많다.
4. Context Switching 비용
Context Switching은 CPU 연산을 하지 않는 시간이다.
즉 실제 작업이 아니라 “전환 비용”이다.
다음과 같은 오버헤드가 발생한다.
- 레지스터 저장/복원
- 캐시 무효화
- 메모리 접근 증가
이 비용이 누적되면 CPU 사용률은 높지만 실제 처리량은 낮아지는 현상이 발생한다.
5. 과도한 Context Switching의 문제
Context Switching이 과도하게 발생하면 다음 문제가 생긴다.
- CPU 효율 저하
- 응답 속도 지연
- 시스템 전체 성능 저하
특히 스레드 수가 CPU 코어 수보다 과도하게 많으면
오히려 성능이 더 나빠질 수 있다.
6. 확인 방법
리눅스에서는 Context Switching 발생 횟수를 확인할 수 있다.
vmstat 1
cs 값이 Context Switching 횟수다.
이 값이 비정상적으로 높다면 병목을 의심해야 한다.
또는 다음 명령어로도 확인 가능하다.
pidstat -w
7. 성능 개선 방법
- 불필요한 스레드/프로세스 수 줄이기
- CPU 코어 수에 맞게 워커 설정
- I/O 작업 비동기 처리
- 락 경쟁 줄이기
특히 웹 서버에서는 PHP-FPM, Node 워커 수를 적절히 설정하는 것이 중요하다.
무작정 늘리면 Context Switching만 증가한다.
8. 실무에서의 의미
CPU 사용률이 높은데 처리량이 낮다면 Context Switching을 의심해야 한다.
이 경우 단순히 서버 스펙을 올리는 것으로 해결되지 않는다.
구조적으로 스레드 수, 작업 분배 방식을 조정해야 한다.
즉 튜닝은 “얼마나 돌리느냐”가 아니라 “어떻게 돌리느냐”의 문제다.
한 줄 요약
Context Switching은 CPU가 작업을 전환하는 과정으로 필수지만 비용이 발생한다. 과도하게 증가하면 CPU 효율이 떨어지므로 스레드 수와 작업 구조를 적절히 조정하는 것이 중요하다.
댓글 0