Xenomai 시스템을 최적화하는 과정에서는 여러 가지 요소를 고려해야 한다. 이 장에서는 주로 시스템 설정에서 성능을 쉽게 개선할 수 있는 방법들을 다룬다. 각 방법은 Xenomai 환경 전체에서 전반적인 성능을 높이는데 중요한 역할을 한다.

커널 설정 최적화

CONFIG_SMP 사용

Xenomai 환경에서 다중 코어를 최대한 활용하려면 커널 설정에서 CONFIG_SMP(Symmetric MultiProcessing)를 활성화해야 한다. 이를 통해 여러 코어가 병렬로 작업을 수행할 수 있어 실시간 성능을 크게 향상시킬 수 있다.

PREEMPT_RT 패치 적용

PREEMPT_RT 패치는 리눅스 커널이 실시간 기능을 지원하도록 하는 중요한 요소이다. 이 패치를 적용하면 커널이 더 낮은 레이턴시로 작동하여 실시간 작업의 성능을 높일 수 있다.

patch -p1 < /path/to/patch/patch-<version>-rt.patch

CONFIG_IRQ_FORCED_THREADING

이 옵션을 활성화하면, 하드웨어 인터럽트 핸들러를 스레드로 실행할 수 있어, 커널 인터럽트 처리의 레이턴시를 줄일 수 있다.

CONFIG_IRQ_FORCED_THREADING=y

Xenomai 설정 최적화

CPU Isolation

Xenomai는 특정 CPU 코어를 실시간 작업 전용으로 할당할 수 있다. 이러한 코어는 일반적인 리눅스 스케줄러에 의해 사용되지 않는다면 실시간 작업의 지연 시간을 줄이는 데 도움이 된다.

isolcpus=1,2

Clocks and Timers

Xenomai 환경에서는 클록과 타이머가 중요한 역할을 한다. 고해상도 타이머(hrtimer)와 TSC(Time Stamp Counter) 같은 고정밀 클록 소스를 사용하면 타이밍 정확도를 크게 개선할 수 있다.

CONFIG_HIGH_RES_TIMERS=y
CONFIG_X86_TSC=y

사용자 공간 설정 최적화

Thread Affinity 설정

실시간 응용프로그램에서 스레드 어피니티(Thread Affinity)를 설정하여 특정 코어에서만 실행되도록 할 수 있다. 이는 캐시 로컬리티를 높이고 컨텍스트 스위칭 오버헤드를 줄이는 데 도움이 된다.

#include <pthread.h>

// Set thread affinity
pthread_t thread;
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(2, &cpuset);
pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);

Lock-Free Algorithms 사용

잠금을 사용하는 알고리즘은 경쟁 조건을 유발해 실시간 성능을 저하시킬 수 있으므로, 가능한 경우 무잠금(Lock-Free) 알고리즘을 사용하는 것이 좋다.

// Example of a lock-free data structure, like a circular buffer

네트워크 설정 최적화

네트워크 인터페이스 카드(NIC) 튜닝

네트워크 인터페이스 카드(NIC)를 튜닝하여 네트워크 관련 작업의 실시간 성능을 높일 수 있다. 이를 위해 가장 중요한 설정은 인터럽트 코얼레싱을 비활성화하는 것이다.

ethtool -C eth0 rx-usecs 0

NAPI (New API)

NAPI 기능을 사용하면 인터럽트와 폴링을 동적으로 조정할 수 있어 네트워크 성능의 변동성을 줄일 수 있다. 최신 커널에서는 NAPI가 기본적으로 활성화되어 있지만, 특정 설정을 통해 최적화할 수 있다.

CONFIG_NET_RX_BUSY_POLL=n

시스템 자원 관리

메모리 잠금

실시간 애플리케이션에서 메모리 잠금을 통해 페이지 폴트로 인해 발생할 수 있는 지연을 줄일 수 있다. mlockall 함수를 이용하면 프로세스의 가상 메모리 영역 전체를 잠글 수 있다.

#include <sys/mman.h>

// Lock all pages mapped into the address space
mlockall(MCL_CURRENT | MCL_FUTURE);

스와핑 비활성화

실시간 성능을 보장하기 위해 스와핑(Swapping)을 비활성화하는 것도 중요하다. 스와핑이 발생하면 페이지 폴트로 인한 지연이 발생할 수 있기 때문이다.

swapoff -a

cgroup과 nsjail

cgroup(control groups)와 nsjail 등의 컨테이너 기술을 사용하여 리소스 제한과 격리 또한 고려할 수 있다. 이를 통해 실시간 애플리케이션이 필요로 하는 자원을 안정적으로 확보할 수 있다.

cgcreate -g cpu:/realtime
cgset -r cpu.shares=1024 /realtime
cgclassify `pgrep my_realtime_app` /realtime

IRQ Balancing

ISR(Interrupt Service Routine)이 Xenomai에서 실시간 성능을 저하시키지 않도록 하기 위해 IRQ를 특정 코어에 바인딩할 수 있다. irqbalance 서비스를 비활성화하고 수동으로 IRQ를 할당하는 것이 좋다.

systemctl stop irqbalance
echo 2 > /proc/irq/XX/smp_affinity

실시간 우선순위 설정

SCHED_FIFO 및 SCHED_RR

스레드의 스케줄링 정책을 FIFO(first in, first out)나 RR(round-robin)으로 설정하여 실시간 우선순위를 높일 수 있다. 리눅스에서는 pthread_setschedparam 함수를 통해 이러한 설정을 적용할 수 있다.

#include <pthread.h>

// Set thread scheduling policy to FIFO
struct sched_param param;
param.sched_priority = 99;
pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);

라이브러리와 도구

RTnet

RTnet은 Xenomai에서 실시간 네트워킹을 지원하는 도구이다. 이를 통해 일반 네트워킹 성능을 상승시키고, 실시간 전달 보장을 할 수 있다.

modprobe rtnet
rtnet start

Xenomai Utilities

Xenomai 설치 시 제공되는 다양한 유틸리티와 도구들을 사용하여 시스템의 성능을 모니터링하고 최적화할 수 있다.

latency
xeno-test

이와 같은 설정을 통해 Xenomai 시스템에서의 실시간 성능을 최적화할 수 있다.