Linux 서버는 초당 수천에서 수백만 건의 하드웨어 이벤트를 처리합니다. 네트워크 패킷이 도착하거나 SSD가 읽기 작업을 완료하거나 USB 장치가 연결될 때마다 인터럽트가 발생합니다.
하지만 인터럽트가 발생할 때마다 모든 작업을 즉시 처리하면 CPU는 인터럽트 처리에만 대부분의 시간을 사용하게 됩니다. 이를 해결하기 위해 Linux Kernel은 HardIRQ와 SoftIRQ라는 두 단계의 인터럽트 처리 방식을 사용합니다.
이번 글에서는 HardIRQ와 SoftIRQ의 차이점, 처리 과정, 성능에 미치는 영향, 그리고 실무에서 확인하는 방법을 자세히 알아보겠습니다.
HardIRQ란?
HardIRQ(Hardware Interrupt)는 하드웨어에서 직접 발생하는 인터럽트입니다.
대표적인 예는 다음과 같습니다.
- 네트워크 카드 패킷 수신
- SSD 읽기 완료
- USB 장치 연결
- 키보드 입력
- 마우스 이동
- 시스템 타이머
이러한 이벤트가 발생하면 CPU는 현재 작업을 잠시 멈추고 HardIRQ Handler를 실행합니다.
HardIRQ의 특징
HardIRQ는 매우 높은 우선순위를 가집니다.
특징은 다음과 같습니다.
- 즉시 실행
- 매우 짧게 수행
- 다른 인터럽트보다 우선 처리
- CPU 응답성 유지
HardIRQ에서는 시간이 오래 걸리는 작업을 수행하지 않습니다.
SoftIRQ란?
SoftIRQ(Software Interrupt)는 HardIRQ 이후 실행되는 지연 처리 작업입니다.
HardIRQ에서 모든 작업을 처리하지 않고 필요한 작업만 예약한 뒤, 실제 무거운 처리는 SoftIRQ가 담당합니다.
예를 들어
네트워크 패킷 수신
↓
HardIRQ
↓
패킷 수신 확인
↓
SoftIRQ 예약
↓
패킷 분석
↓
TCP 처리
↓
응용 프로그램 전달
이렇게 역할을 나누면 인터럽트 처리 시간이 크게 줄어듭니다.
HardIRQ와 SoftIRQ의 처리 과정
전체 흐름은 다음과 같습니다.
Hardware Event
↓
HardIRQ 발생
↓
Interrupt Handler 실행
↓
SoftIRQ 예약
↓
HardIRQ 종료
↓
SoftIRQ 실행
↓
실제 작업 수행
Linux는 이러한 구조를 통해 빠른 응답성과 높은 처리량을 동시에 확보합니다.
HardIRQ와 SoftIRQ의 차이
| 항목 | HardIRQ | SoftIRQ |
|---|---|---|
| 발생 원인 | 하드웨어 이벤트 | HardIRQ 예약 |
| 실행 시점 | 즉시 | 이후 실행 |
| 처리 시간 | 매우 짧음 | 상대적으로 길 수 있음 |
| 목적 | 이벤트 확인 | 실제 데이터 처리 |
| 우선순위 | 매우 높음 | HardIRQ보다 낮음 |
간단히 말하면 HardIRQ는 “알림”, SoftIRQ는 “실제 작업”을 담당합니다.
SoftIRQ의 주요 종류
현재 Linux에서는 다양한 SoftIRQ가 사용됩니다.
대표적인 항목은 다음과 같습니다.
- NET_RX (네트워크 수신)
- NET_TX (네트워크 송신)
- TIMER
- BLOCK
- TASKLET
- SCHED
- RCU
특히 대용량 트래픽 서버에서는 NET_RX SoftIRQ 사용량이 매우 높습니다.
SoftIRQ 확인하기
현재 SoftIRQ 통계는 다음 명령으로 확인할 수 있습니다.
cat /proc/softirqs
예시
CPU0 CPU1
NET_RX
23452 19871
NET_TX
10233 11002
TIMER
98765 99543
각 CPU가 처리한 SoftIRQ 횟수를 확인할 수 있습니다.
HardIRQ 확인하기
HardIRQ는 다음 파일에서 확인합니다.
cat /proc/interrupts
출력 예시
CPU0 CPU1
24:
123456
234567
eth0
네트워크 카드와 저장장치 인터럽트 발생 횟수를 확인할 수 있습니다.
ksoftirqd 프로세스
SoftIRQ가 너무 많아 즉시 처리하지 못하면 Kernel은 ksoftirqd 스레드를 사용합니다.
확인
ps -ef | grep ksoftirqd
예시
ksoftirqd/0
ksoftirqd/1
ksoftirqd/2
CPU 코어마다 하나씩 존재하는 경우가 많습니다.
SoftIRQ가 많으면 생기는 문제
SoftIRQ가 과도하게 증가하면 다음과 같은 문제가 발생할 수 있습니다.
- CPU 사용률 증가
- 네트워크 지연
- 패킷 드롭
- 응답 속도 저하
- Throughput 감소
특히 10Gbps 이상의 네트워크 환경에서는 SoftIRQ 분석이 매우 중요합니다.
실무에서 자주 확인하는 명령어
SoftIRQ 확인
cat /proc/softirqs
HardIRQ 확인
cat /proc/interrupts
ksoftirqd 확인
ps -ef | grep ksoftirqd
CPU 사용률
top
CPU별 통계
mpstat -P ALL 1
Kernel 로그
dmesg
실무 사례
예를 들어 웹 서버에서 초당 수십만 개의 요청을 처리하는 경우 CPU 사용률은 높지 않은데 응답 속도가 느려질 수 있습니다.
이때 확인 순서는 다음과 같습니다.
top으로 CPU 사용률 확인cat /proc/softirqs로 NET_RX 증가 여부 확인cat /proc/interrupts로 특정 CPU에 인터럽트 집중 여부 확인irqbalance서비스 상태 확인- NIC의 RSS(Receive Side Scaling) 설정 점검
이러한 과정을 통해 인터럽트 병목 현상을 분석할 수 있습니다.
자주 묻는 질문
HardIRQ에서 모든 작업을 처리하면 안 되나요?
HardIRQ는 가능한 한 짧게 실행되어야 합니다. 시간이 오래 걸리는 작업까지 수행하면 다른 인터럽트 처리가 지연되어 시스템 전체의 응답성이 떨어질 수 있습니다.
ksoftirqd의 CPU 사용률이 높은 것은 문제가 되나요?
항상 문제는 아닙니다. 다만 지속적으로 높은 CPU를 사용한다면 네트워크 트래픽 증가나 인터럽트 처리 병목이 발생했는지 확인하는 것이 좋습니다.
SoftIRQ와 Tasklet은 같은 것인가요?
Tasklet은 SoftIRQ를 기반으로 구현된 지연 처리 메커니즘 중 하나입니다. 현재 최신 Linux에서는 Tasklet 사용이 줄어드는 추세이며, 일부 기능은 다른 메커니즘으로 대체되고 있습니다.
마무리
HardIRQ와 SoftIRQ는 Linux Kernel이 인터럽트를 효율적으로 처리하기 위해 사용하는 핵심 구조입니다. HardIRQ는 하드웨어 이벤트를 빠르게 감지하고, SoftIRQ는 시간이 더 필요한 작업을 나중에 처리하여 시스템의 응답성과 처리 성능을 모두 확보합니다. /proc/interrupts, /proc/softirqs, ksoftirqd를 함께 분석하면 네트워크와 저장장치의 성능 문제를 보다 효과적으로 진단할 수 있습니다.