라즈베리파이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.txt의 kernel= 항목으로 어느 걸 부팅할지 고르는 구조라서, /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
-m은 메모리를 잠가(mlockall) 페이지 폴트로 인한 지연을 배제하고, -Sp99는 모든 CPU 코어마다 SCHED_FIFO 최고 우선순위(99)로 측정 스레드를 띄운다는 뜻이다. -i200은 200마이크로초 간격으로 타이머를 걸어 반복 측정하고, -h400은 400마이크로초까지의 지연 분포를 히스토그램으로 뽑는다. 확인해야 할 값은 평균(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.txt의 kernel= 값만 원래대로 돌리면 된다.
kernel=kernel8.img
수정 후 재부팅하면 기존 표준 커널로 돌아온다. linux-image-rpi-v8-rt 패키지 자체를 지우지 않아도 config.txt만 바꾸면 두 커널을 필요에 따라 오갈 수 있다.
주의사항
- RT 커널은 라즈베리파이 공식 문서에 정식으로 등재된 기능이 아니라 포럼과 커뮤니티 빌드로 배포되는 실험적 성격이 강하므로, 프로덕션에 적용하기 전에 실제 워크로드로 충분히 검증해야 한다.
- Pi 3B+ 같은 구형 보드는 부팅 실패 사례가 보고되어 있으므로, 적용 전에 반드시 모델별 지원 현황을 먼저 확인해야 한다.
- cyclictest 결과는 시스템 부하 상태에 따라 크게 달라지므로, 실제 애플리케이션과 비슷한 부하를 걸어둔 상태에서 측정해야 의미가 있다.
마무리
PREEMPT_RT가 메인라인에 병합되면서 예전처럼 커널 전체를 다시 빌드하지 않아도 라즈베리파이에서 실시간 커널을 시험해볼 수 있게 됐다. apt 한 줄과 config.txt 몇 줄로 적용과 롤백이 모두 가능하다는 점에서, 모터 제어나 오디오처럼 지연시간에 민감한 프로젝트를 라즈베리파이로 시작하기 전에 가볍게 테스트해보기 좋은 방법이다. 다만 아직 커뮤니티 빌드 단계인 만큼, cyclictest로 직접 재보고 나서 도입하는 게 안전하다.