Linux SoftIRQ와 HardIRQ란? 인터럽트 처리 구조와 성능 최적화 이해하기

Linux 서버는 초당 수천에서 수백만 건의 하드웨어 이벤트를 처리합니다. 네트워크 패킷이 도착하거나 SSD가 읽기 작업을 완료하거나 USB 장치가 연결될 때마다 인터럽트가 발생합니다.

하지만 인터럽트가 발생할 때마다 모든 작업을 즉시 처리하면 CPU는 인터럽트 처리에만 대부분의 시간을 사용하게 됩니다. 이를 해결하기 위해 Linux Kernel은 HardIRQSoftIRQ라는 두 단계의 인터럽트 처리 방식을 사용합니다.

이번 글에서는 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의 차이

항목HardIRQSoftIRQ
발생 원인하드웨어 이벤트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 사용률은 높지 않은데 응답 속도가 느려질 수 있습니다.

이때 확인 순서는 다음과 같습니다.

  1. top으로 CPU 사용률 확인
  2. cat /proc/softirqs로 NET_RX 증가 여부 확인
  3. cat /proc/interrupts로 특정 CPU에 인터럽트 집중 여부 확인
  4. irqbalance 서비스 상태 확인
  5. 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를 함께 분석하면 네트워크와 저장장치의 성능 문제를 보다 효과적으로 진단할 수 있습니다.

댓글 남기기