성능 모니터링
PLEM 모니터링 시스템은 1kHz 제어 루프의 성능을 ROS2 토픽으로 제공합니다. RT 루프를 절대 블록하지 않는 wait-free 설계입니다.
주요 토픽
| 토픽 | 레이트 | QoS | 설명 |
|---|---|---|---|
/rt_raw | 1kHz | BestEffort | 타이밍, 관절 상태, 제어 값 |
/rt_events | 이벤트 발생 시 | ReliableTransient | 폴트, 모드 변경, 안전 트리거 |
/rt_monitor_stats | 10Hz | Reliable | 큐 상태, 오버플로 카운트 |
다중 로봇 환경
robot_id가 설정된 경우 /{robot_id}/rt_raw처럼 namespace가 자동 적용됩니다.
RtSample 주요 필드
| 필드 | 타입 | 설명 |
|---|---|---|
loop_exec_us | float | 루프 처리 시간 [µs] |
loop_jitter_us | float | 목표 주기(1000µs)로부터의 편차 [µs] |
deadline_miss | uint8 | 데드라인 미스 여부 (0/1) |
actual_pos[0..5] | float | 관절 위치 [rad] |
actual_vel[0..5] | float | 관절 속도 [rad/s] |
actual_torque[0..5] | float | 관절 토크 [Nm] |
cmd_torque[0..5] | float | 명령 토크 [Nm] |
전체 필드 목록: ros2 topic echo /rt_raw --once
타이밍 메트릭
loop_exec_us: 루프 깨우기부터 완료까지의 처리 시간. 정상: 30-60 µsloop_jitter_us:실제 주기 - 목표 주기. 양수면 늦은 깨우기 (커널 스케줄링 지연). 정상: 5-15 µs
PlotJuggler 시각화
# 설치
sudo apt install ros-humble-plotjuggler-ros
# 실행
ros2 run plotjuggler plotjuggler
설정:
- Streaming → Start: ROS2 Topic Subscriber →
/rt_raw체크 → OK - 왼쪽 패널에서 필드를 플롯으로 드래그:
loop_jitter_us(타이밍 안정성)loop_exec_us(계산 부하)
- 시간 윈도우를 10초로 설정
임계값 표시: 플롯 우클릭 → Custom Series로 경고선(50µs 노란색)과 에러선(200µs 빨간색) 추가.
레이아웃 저장: File → Save Layout As... → plem_rt_monitor.xml
성능 기준 및 임계값
성능 임계값
다음 임계값을 초과하면 즉시 조치가 필요합니다. 지속적인 경고 상태는 시스템 안정성에 영향을 줄 수 있습니다.
| 메트릭 | 건강함 | 경고 | 에러 | 조치 |
|---|---|---|---|---|
loop_jitter_us | < 15 µs | 50-100 µs | > 100 µs | 아래 진단 패턴 참조 |
loop_exec_us | < 60 µs | 80-100 µs | > 100 µs | 제어 매개변수 검토 |
deadline_miss | 0 | > 0 | > 10/초 | 즉시 조사 필요 |
rt_overflow_delta | 0 | > 0 | > 100/초 | 큐 크기 증가 고려 |
성능 저하 진단
높은 지터 패턴
| 패턴 | 증상 | 가능한 원인 | 해결책 |
|---|---|---|---|
| 주기적 스파이크 | 5초마다 180µs 스파이크 | 커널 백그라운드 작업 (RCU, kworker) | CPU 격리 및 커널 스레드 선호도 확인 |
| 점진적 증가 | 시간 경과에 따라 10→80µs | 메모리 압박 (힙 단편화, 스와핑) | 메모리 잠금 설정 확인 |
| 무작위 대형 스파이크 | 843µs, 1205µs 등 불규칙 | CPU 미격리 또는 RT 우선순위 미설정 | RT 우선순위 및 CPU 격리 확인 |
느린 실행 시간 패턴
| 패턴 | 증상 | 가능한 원인 | 해결책 |
|---|---|---|---|
| 지속적 높은 실행 | 계속 > 80µs | 비싼 제어 계산 | 제어 매개변수 검토, 최적화 옵션 확인 |
| 갑작스러운 점프 | 52µs → 153µs 단계 변화 | 모드 변경 (TRAJECTORY 진입) | 예상 동작. exec_us < 100µs 유지 확인 |
진단 명령
# 지터 패턴 모니터링
ros2 topic echo /rt_raw --field loop_jitter_us
# 실행 시간 평균 (1000 샘플)
ros2 topic echo /rt_raw --field loop_exec_us | \
awk '{sum+=$1; count++} count==1000 {print "평균: " sum/count " µs"; exit}'
# 높은 지터 알림
ros2 topic echo /rt_raw --field loop_jitter_us | \
awk '$1 > 50 {print "경고: 지터 " $1 " µs"}'
# 이벤트와 상관관계 분석
ros2 topic echo /rt_events
큐 관리
RT 루프에서 ROS2 토픽으로의 데이터 전달은 wait-free 큐를 사용합니다. 큐가 가득 차면 새 샘플이 드롭됩니다.
# 오버플로 모니터링 (0이면 정상)
ros2 topic echo /rt_monitor_stats --field rt_overflow_delta
| 시나리오 | 큐 크기 | 근거 |
|---|---|---|
| 개발 (기본값) | 8192 | 8초 버퍼, 디버거 일시 중지 처리 |
| 프로덕션 | 4096 | 4초 버퍼, 낮은 메모리 사용 |
| Rosbag 녹화 | 16384 | 디스크 I/O 버스트를 위한 16초 버퍼 |
큐 크기 권장사항
RAM이 심각하게 제한되지 않는 한 기본값(8192) 사용을 권장합니다.
빠른 레퍼런스
# RT 성능
ros2 topic hz /rt_raw # 퍼블리싱 레이트 (~1kHz여야 함)
ros2 topic echo /rt_raw --field loop_jitter_us
ros2 topic echo /rt_raw --field loop_exec_us
ros2 topic echo /rt_monitor_stats
# 이벤트 모니터링
ros2 topic echo /rt_events
# 다중 로봇 환경
ros2 topic echo /arm_left/rt_raw --field loop_jitter_us
다음 단계:
- 권장 레이아웃으로 PlotJuggler 설정
- 애플리케이션의 기준 메트릭 확인
- 문제 발생 시 진단 패턴 테이블과 명령으로 원인 분석