라즈베리파이 PREEMPT_RT 실시간 커널 적용기

라즈베리파이OS 기본 커널은 일반 목적 스케줄러를 쓰기 때문에, 인터럽트가 몰리거나 시스템 부하가 커지면 특정 태스크의 응답 시간이 수 밀리초에서 수십 밀리초까지 튈 수 있다. 로봇 제어, 모터 구동, 오디오 프로세싱처럼 일정한 주기 안에 반드시 처리를 끝내야 하는 작업에는 이런 지연 편차가 치명적이다. PREEMPT_RT는 커널 내부의 거의 모든 락을 선점 가능하게 바꿔 이 문제를 줄이는 패치셋인데, 최근 메인라인에 병합되면서 라즈베리파이 진영에서도 apt 패키지로 RT 커널을 직접 배포하기 시작해 예전처럼 커널을 통째로 빌드하지 않아도 적용할 수 있게 됐다. 이 글에서는 라즈베리파이 4/5에 PREEMPT_RT 커널을 설치하고 부팅 설정을 맞춘 뒤, cyclictest로 실시간성이 실제로 개선됐는지 확인하는 과정을 정리한다.

PREEMPT_RT란

PREEMPT_RT는 리눅스 커널의 스핀락 대부분을 뮤텍스로 바꾸고 인터럽트 핸들러를 커널 스레드로 옮겨, 우선순위가 높은 태스크가 인터럽트 처리나 락 경합 때문에 무한정 기다리지 않도록 만드는 패치셋이다. 오랫동안 별도 패치로 유지되다가 6.12 커널부터 메인라인에 병합되면서, 커널 설정에서 Fully Preemptible Kernel(Real-Time) 프리엠션 모델을 고르기만 하면 켜지는 정식 기능이 됐다. 라즈베리파이 쪽에서도 이 흐름에 맞춰 RT 커널 변형(variant)을 별도 apt 패키지로 배포하기 시작했다.

RT 커널 설치와 부팅 설정

패키지 이름은 linux-image-rpi-v8-rt다. v8은 ARMv8(64비트) 아키텍처를 뜻하므로 64비트 라즈베리파이OS에서만 설치할 수 있다.

sudo apt update
sudo apt full-upgrade -y
sudo apt install linux-image-rpi-v8-rt

패키지를 설치해도 곧바로 RT 커널로 부팅되지는 않는다. 라즈베리파이OS는 여러 커널 이미지를 동시에 설치해두고 config.txtkernel= 항목으로 어느 걸 부팅할지 고르는 구조라서, /boot/firmware/config.txt(Bookworm 이전 버전은 /boot/config.txt)를 직접 편집해야 한다.

kernel=kernel8_rt.img
arm_64bit=1
auto_initramfs=0

arm_64bit=1은 커널 이미지 파일명이 표준 이름(kernel8.img 등)이 아닐 때 부트로더가 64비트 모드로 인식하도록 명시하는 옵션인데, Pi 4/CM4에서는 특히 빠뜨리면 부팅이 실패할 수 있어 반드시 넣어야 한다. 설정을 저장한 뒤 재부팅한다.

sudo reboot

부팅 확인과 cyclictest로 지연시간 측정

재부팅 후 uname -a로 실제로 RT 커널이 올라왔는지 확인한다. PREEMPT_RT 커널은 버전 문자열에 PREEMPT_RT 표시가 붙어서 나온다.

uname -a

정확한 버전 숫자는 설치 시점의 패키지 버전에 따라 달라지지만, 출력에 PREEMPT_RT 문자열이 포함되어 있으면 RT 커널로 정상 부팅된 것이다. 실시간성이 실제로 개선됐는지는 감이 아니라 cyclictest로 직접 재봐야 정확한데, Debian/Ubuntu 계열의 rt-tests 패키지에 들어 있다.

sudo apt install rt-tests
sudo cyclictest -m -Sp99 -i200 -h400 -q
옵션의미
-mmlockall로 메모리를 잠가 페이지 폴트로 인한 지연 배제
-Sp99모든 CPU 코어에 SCHED_FIFO 최고 우선순위(99)로 측정 스레드 실행
-i200200마이크로초 간격으로 타이머를 걸어 반복 측정
-h400400마이크로초까지의 지연 분포를 히스토그램으로 출력

확인해야 할 값은 평균(avg)보다 최대(max) 지연시간과 편차다. 일반 커널은 부하 중 max 값이 크게 튀는 반면 RT 커널은 좁은 범위로 유지되는 경향을 보인다. stress-ng 등으로 부하를 걸어둔 상태에서 몇 분 이상 돌리고 Ctrl+C로 종료하면 코어별 최소/평균/최대 지연시간 요약이 출력된다.

지원 모델과 한계

RT 커널 변형은 라즈베리파이 공식 이미지에 기본 포함된 기능이 아니라 커뮤니티 빌드로 배포되는 성격이 강해서, 보드마다 지원 수준이 다르다.

  • Pi 5, Pi 4/CM4: RT 커널 부팅이 정상 확인됐다. Pi 4/CM4는 앞서 설정한 arm_64bit=1이 필수다.
  • Pi Zero 2W: 부팅은 되지만 F2FS 루트 파일시스템을 쓰는 경우 별도 initramfs를 직접 만들어 넣어야 하는 등 추가 작업이 필요하다.
  • Pi 3B+: 부팅 실패 사례가 보고돼 있어 아직 안정적으로 쓰기 어렵다.

기본 커널로 되돌리기

RT 커널이 특정 주변장치 드라이버와 충돌하거나 안정성 문제가 생기면 config.txtkernel= 값만 원래대로 돌리면 된다.

kernel=kernel8.img

수정 후 재부팅하면 기존 표준 커널로 돌아온다. linux-image-rpi-v8-rt 패키지 자체를 지우지 않아도 config.txt만 바꾸면 두 커널을 필요에 따라 오갈 수 있다.

주의사항

  • RT 커널은 라즈베리파이 공식 문서에 정식으로 등재된 기능이 아니라 포럼과 커뮤니티 빌드로 배포되는 실험적 성격이 강하므로, 프로덕션에 적용하기 전에 실제 워크로드로 충분히 검증해야 한다.
  • Pi 3B+ 같은 구형 보드는 부팅 실패 사례가 보고되어 있으므로, 적용 전에 반드시 모델별 지원 현황을 먼저 확인해야 한다.
  • cyclictest 결과는 시스템 부하 상태에 따라 크게 달라지므로, 실제 애플리케이션과 비슷한 부하를 걸어둔 상태에서 측정해야 의미가 있다.

마무리

PREEMPT_RT가 메인라인에 병합되면서 예전처럼 커널 전체를 다시 빌드하지 않아도 라즈베리파이에서 실시간 커널을 시험해볼 수 있게 됐다. apt 한 줄과 config.txt 몇 줄로 적용과 롤백이 모두 가능하다는 점에서, 모터 제어나 오디오처럼 지연시간에 민감한 프로젝트를 라즈베리파이로 시작하기 전에 가볍게 테스트해보기 좋은 방법이다. 다만 아직 커뮤니티 빌드 단계인 만큼, cyclictest로 직접 재보고 나서 도입하는 게 안전하다.

참고

답글 남기기