# 실시간 성능 측정

실시간 시스템에서 성능 측정은 매우 중요한 요소이다. 시스템의 응답 시간, 주기적인 작업의 정확한 실행 여부, CPU 사용률 등을 모니터링하여 시스템의 안정성과 효율성을 확인할 수 있다. 이 장에서는 실시간 성능 측정의 기초와 주요 지표들을 다루겠다.

#### 실시간 성능 측정의 개요

실시간 성능 측정은 주로 시스템이 주어진 시간 내에 작업을 완료하는지 여부를 확인하는 데 중점을 둔다. 여기에는 주기적인 작업의 지연 시간, 처리 시간, 응답 시간 등이 포함된다. 이 외에도 자원 사용률, 특히 CPU와 메모리의 사용률을 모니터링하여 시스템의 전반적인 효율성을 평가한다.

#### 주요 성능 지표

**1. 지연 시간 (Latency)**

지연 시간은 특정 작업이 시작되기 전 대기하는 시간을 의미한다. 이는 시스템의 반응 속도를 측정하는 데 매우 중요한 지표이다. 예를 들어, 센서 입력이 들어온 후 이를 처리하는 데 걸리는 시간 등이 포함된다.

**2. 처리 시간 (Execution Time)**

처리 시간은 실제 작업을 수행하는 데 소요되는 시간을 의미한다. 이는 주로 CPU의 성능과 관련이 있으며, 작업의 복잡도에 따라 달라질 수 있다.

**3. 응답 시간 (Response Time)**

응답 시간은 시스템이 외부 이벤트에 반응하는 데 걸리는 전체 시간을 의미한다. 이는 지연 시간과 처리 시간을 모두 포함한다.

**4. 주기 시간 (Period)**

주기 시간은 주기적인 작업이 실행되는 간격을 의미한다. 주기 시간이 일정하게 유지되는지 확인하는 것이 중요하다.

**5. CPU 사용률 (CPU Utilization)**

CPU 사용률은 시스템이 작업을 수행하는 동안 CPU를 얼마나 많이 사용하는지를 나타낸다. 이는 시스템의 효율성을 평가하는 중요한 지표이다.

#### 실시간 성능 측정 도구

실시간 시스템에서 성능을 측정하기 위해 다양한 도구들이 사용된다. 대표적인 도구로는 다음과 같은 것들이 있다:

**1. Linux Trace Toolkit (LTTng)**

LTTng는 고성능 트레이싱 도구로, 커널과 사용자 공간의 이벤트를 추적할 수 있다. 이를 통해 시스템의 실시간 성능을 분석할 수 있다.

```shell
sudo apt-get install lttng-tools lttng-modules-dkms babeltrace
lttng create my-session
lttng enable-event -a -k
lttng start
lttng stop
lttng view
```

**2. perf**

perf는 성능 분석 도구로, CPU 사용률, 캐시 미스, 메모리 접근 패턴 등을 분석할 수 있다. 이는 주로 코드 최적화에 사용된다.

```shell
sudo apt-get install linux-tools-$(uname -r)
perf stat -e cpu-clock,task-clock,cycles,instructions,cache-references,cache-misses -p <PID>
```

**3. ftrace**

ftrace는 커널 내부의 함수 호출을 추적할 수 있는 도구이다. 이는 주로 커널 레벨에서의 실시간 성능 문제를 분석하는 데 사용된다.

```shell
echo function > /sys/kernel/debug/tracing/current_tracer
echo <function_name> > /sys/kernel/debug/tracing/set_ftrace_filter
cat /sys/kernel/debug/tracing/trace
```

#### 성능 측정 방법

**1. 주기적인 작업의 지연 시간 측정**

주기적인 작업의 지연 시간을 측정하려면 타이머를 사용하여 작업이 예상 시간에 실행되는지를 확인한다. 이를 위해 고정 주기 타이머와 실제 실행 시간을 비교한다.

```c
#include <stdio.h>
#include <time.h>

#define PERIOD_NS 1000000 // 1 ms

void measure_latency() {
    struct timespec start, end;
    clock_gettime(CLOCK_MONOTONIC, &start);
    
    // Perform periodic task
    // ...
    
    clock_gettime(CLOCK_MONOTONIC, &end);
    long latency = (end.tv_sec - start.tv_sec) * 1e9 + (end.tv_nsec - start.tv_nsec);
    printf("Latency: %ld ns\n", latency);
}

int main() {
    while (1) {
        measure_latency();
        struct timespec sleep_time = {0, PERIOD_NS};
        nanosleep(&sleep_time, NULL);
    }
    return 0;
}
```

**2. 처리 시간 측정**

처리 시간을 측정하려면 작업의 시작 시간과 종료 시간을 기록하여 그 차이를 계산한다.

```c
#include <stdio.h>
#include <time.h>

void perform_task() {
    // Perform some work
    // ...
}

void measure_execution_time() {
    struct timespec start, end;
    clock_gettime(CLOCK_MONOTONIC, &start);
    
    perform_task();
    
    clock_gettime(CLOCK_MONOTONIC, &end);
    long execution_time = (end.tv_sec - start.tv_sec) * 1e9 + (end.tv_nsec - start.tv_nsec);
    printf("Execution Time: %ld ns\n", execution_time);
}

int main() {
    measure_execution_time();
    return 0;
}
```

**3. CPU 사용률 측정**

CPU 사용률은 프로세스가 실행되는 동안 CPU를 얼마나 사용했는지 확인하는 지표이다. 이는 `top` 명령어나 `htop` 같은 도구를 통해 실시간으로 모니터링할 수 있다. 아래는 특정 시간 간격 동안 CPU 사용률을 측정하는 코드 예제이다.

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

void get_cpu_usage() {
    FILE* file;
    char buffer[128];
    unsigned long long int user, nice, system, idle;
    unsigned long long int total_time;

    file = fopen("/proc/stat", "r");
    fgets(buffer, sizeof(buffer) - 1, file);
    fclose(file);

    sscanf(buffer, "cpu %llu %llu %llu %llu", &user, &nice, &system, &idle);
    total_time = user + nice + system + idle;

    static unsigned long long int prev_total_time = 0, prev_idle_time = 0;
    unsigned long long int diff_total_time = total_time - prev_total_time;
    unsigned long long int diff_idle_time = idle - prev_idle_time;

    float cpu_usage = 100.0 * (diff_total_time - diff_idle_time) / diff_total_time;
    printf("CPU Usage: %.2f%%\n", cpu_usage);

    prev_total_time = total_time;
    prev_idle_time = idle;
}

int main() {
    while (1) {
        get_cpu_usage();
        sleep(1);
    }
    return 0;
}
```

#### 성능 최적화

성능 최적화는 실시간 시스템의 중요한 부분이다. 아래는 몇 가지 일반적인 최적화 기법들이다:

1. **실시간 우선순위 설정**: 특정 작업이 실시간 성능 요구 사항을 충족하도록 스케줄링 우선순위를 높인다.
2. **메모리 고정화**: 메모리 페이지 폴트를 방지하기 위해 필요한 데이터를 미리 메모리에 로드하고 고정한다.
3. **캐시 효율성**: 데이터 구조와 알고리즘을 최적화하여 CPU 캐시의 효율성을 극대화한다.
4. **비동기 I/O 사용**: 입력/출력 작업을 비동기적으로 처리하여 CPU가 블로킹되지 않도록 한다.
5. **타이머 정확성**: 고해상도 타이머를 사용하여 정밀한 시간 측정을 보장한다.

***

실시간 시스템에서의 성능 측정은 시스템의 안정성과 효율성을 보장하는 데 필수적이다. 주요 지표들을 이해하고, 이를 측정하는 방법과 도구들을 적절히 사용하면 시스템의 성능을 향상시킬 수 있다. 나아가 최적화 기법을 적용하여 실시간 요구 사항을 충족하는 시스템을 구축할 수 있다.

이로써 실시간 성능 측정에 관한 설명을 마치겠다.
