linux system에서 trace replay중 trace 추적 및 측정에 필요했던 것들

kyungminLim·2024년 5월 21일
0

Linux system에서 성능을 평가할 때, 검증된 data로 trace replay를 돌려봄으로써 성능 측정이 가능하다.
오늘은 YCSB trace data에서 내가 원하는 data를 추출해서 trace replay를 돌리는 도중, trace 추적 및 측정을 위해 필요한 자료구조에 대해 코드를 통해 간략하게 정리해본다.

struct trace_info_t{                                                                                    
    pthread_spinlock_t trace_lock;                                                                    
    FILE *trace_fp;                                                                                   
    int trace_buf_size;                                                                               
    struct trace_io_req *trace_buf;                                                                   
    int trace_io_cnt;
    int trace_io_cur;
    int trace_io_issue_count;
    char tracename[STR_SIZE];
    char filename[STR_SIZE];
    int fd;
    int synthetic;
    long long wanted_io_count;
    int utilization; // % Percent 
    int working_set_size; // in MB
    int working_set_pages; // in pages
    int io_size; // in bytes
    int io_pages; // in pages

    int synth_rand;
    int synth_read;
    int synth_write;
    int synth_mixed;

    int trace_repeat_count;
    int trace_repeat_num;
    long long total_capacity;
    long long total_pages;
    long long total_sectors;
    long long start_partition;
    long long start_page;
    double trace_timescale;
    double timeout;

};

'trace_info_t' 구조체는 trace 관련 정보를 저장하고 관리하는 데 사용된다. trace는 일반적으로 system의 I/O 활동을 기록하여 분석하는 데 사용된다. 이 구조체는 다양한 필드들을 통해 trace data, 상태 및 설정을 관리한다. 각 필드의 역할을 분석하면

'trace_info_t' 구조체 분석

'pthread_spinlock_t trace_lock'

  • trace data를 다루는 동안 동기화를 위해 사용되는 spinlock이다. 여러 thread가 동시에 trace data를 수정하지 않도록 상호 배제를 보장한다.

'FILE *trace_fp'

  • trace data를 기록할 file pointer이다. trace data는 이 file에 기록된다.

'int trace_buf_size'

  • trace buffer의 크기를 나타낸다. trace data를 임시로 저장하는 buffer의 크기다.

'struct trace_io_req *trace_buf'

  • trace buffer에 대한 포인터이다. trace data는 이 buffer에 저장된다.

'int trace_io_cnt'

  • 현재까지 기록된 I/O 요청의 수를 나타낸다.

'int trace_io_cur'

  • 현재 처리 중인 I/O 요청의 index를 나타낸다.

'int trace_io_issue_count'

  • 발행된 I/O 요청의 수를 나타낸다. 이는 실제로 disk에 요청된 I/O 작업의 수이다.

'char tracename[STR_SIZE]'

  • trace의 이름을 저장하는 문자열이다.

'char filename[STR_SIZE]'

  • trace file의 이름을 저장하는 문자열이다.

'int fd'

  • trace file에 대한 file descriptor이다. 'trace_fp'와 유사한 역할을 하며, 저수준 파일 작업에 사용된다.

'int synthetic'

  • trace가 실제 I/O data를 기반으로 하는지 여부를 나타낸다. 0이면 실제 data, 1이면 합성 data이다.

'long long wanted_io_count'

  • 원하는 I/O request의 총 수를 나타낸다. trace가 이 수만큼의 I/O request를 기록하려고 시도한다.

'int utilization'

  • 자원의 이용률(utilization)을 퍼센트(%)로 나타낸다. 예를 들어, disk의 사용률을 나타낼 수 있다.

'int working_set_size'

  • working_set_size를 메가바이트 단위로 나타낸다. 이는 system에서 활성 상태로 유지되는 data의 양을 나타낸다.

'int working_set_pages'

  • working set size를 page 단위로 나타낸다. page 크기는 일반적으로 4KB이다.

'int io_size'

  • 각 I/O request의 크기를 byte 단위로 나타낸다.

'int io_pages'

  • 각 I/O 요청의 크기를 page 단위로 나타낸다.

'int synth_rand/read/write/mixed'

  • rand는 합성 I/O 요청이 random access인지 sequential access인지 나타낸다.
  • read는 합성 I/O 요청 중 read request의 수를 나타낸다.
  • write는 합성 I/O 요청 중 write request의 수를 나타낸다.
  • mixed는 합성 I/O 요청이 읽기와 쓰기가 혼합된 형태인지 나타낸다.

'int trace_repeat_count'

  • trace를 반복 실행할 횟수를 나타낸다.

'int trace_repeat_num'

  • 현재 trace를 반복 실행한 횟수를 나타낸다.

'long long total_capacity'

  • 총 용량을 나타낸다. 이는 일반적으로 storage device의 총 크기를 의미한다.

'long long total_pages'

  • 총 page 수를 나타낸다.

'long long total_sectors'

  • 총 sector 수를 나타낸다.

'long long start_partition'

  • 시작 partition을 나타낸다.

'long long start_page'

  • 시작 page를 나타낸다.

'double trace_timescale'

  • trace의 시간 스케일을 나타낸다. trace data의 시간 단위를 조정할 때 사용될 수 있다.

'double timeout'

  • trace의 timeout 시간을 나타낸다. 일정 시간이 지나면 trace가 중단될 수 있다.

다시 한번 요약하자면 이 trace_info_t 구조체는 trace data를 효과적으로 관리하고 분석하는 데 필요한 다양한 정보를 포함하고 있다. 이를 통해 다음과 같은 작업을 수행할 수 있다.

  1. trace data 기록: 실제 또는 합성 I/O 활요동을 기록하여 파일에 저장한다.
  2. performance 분석: 기록된 trace data를 분석하여 시스템의 성능 특성을 이해한다.
  3. simulation 및 재현: 특정 I/O pattern을 시뮬레이션하거나 재현하여 system의 응답을 test한다.
  4. debugging 및 optimization: I/O 활동을 상세히 기록하여 system의 bottleneck이나 성능 문제를 식별하고 최적화한다.

즉, 고성능 컴퓨팅 시스템에서 I/O 성능을 모니터링하고 최적화하는 데 중요한 도구로 사용될 수 있다.

추가 설명

추가적으로 working set이라는 것에 대해 설명하자면
working set은 특정 시간 동안 process가 main memory(RAM)에서 접근하는 데이터와 코드의 집합을 의미한다. 이는 현재 수행 중인 작업에서 실제로 사용되는 데이터의 양을 나타낸다. 아래와 같은 역할을 하는데

  1. 메모리 사용
  • working set은 main memory(RAM)에서 유지되어야 하는 data를 포함한다. 시스템의 메모리 관리는 이 working set을 기반으로 효율성을 최적화한다.
  • working set size가 main memory의 용량을 초과하면, page fault가 발생하여 성능 저하가 발생할 수 있다.
  1. page fualt
  • working set에 포함되지 않는 data에 접근할 때 page fault가 발생한다. 이는 필요한 data가 main memory에 없고, 대신 disk나 다른 storage device에서 가져와야 함을 의미한다.
  • working set이 잘 정의되고 적절히 관리되면 page fault의 빈도를 줄일 수 있다.
  1. cache 효율성
  • working set은 cache의 효율성을 높이는 데 중요한 역할을 한다. 활성 데이터(active data)가 cache에 잘 유지되면, cache 히트율이 높아지고 시스템 성능이 향상된다.
  • 반대로, working set가 너무 크거나 적절히 관리되지 않으면 cache miss가 증가하고 성능 저하가 발생할 수 있다.

활성 상태 데이터

활성 상태 데이터는 시스템에서 현재 사용되고 있는 데이터를 의미한다. 이 데이터는 아래와 같은 특징을 가진다.

  1. 빈번한 접근
  • 활성 상태 데이터는 현재 process가 빈번하게 접근하는 데이터를 포함한다. 이는 code, variable, file 등의 형태로 존재할 수 있다.
  1. memory에 상주
  • 활성 상태 데이터는 main memory에 상주해야 하며, 이는 빠른 접근과 처리를 가능하게 한다. main memory에 상주하지 않는 경우, system은 disk에서 data를 가져와야 하므로 성능 저하가 발생할 수 있다.
  1. 작업 특성
  • 활성 상태 데이터는 작업의 특성과 밀접하게 연관된다. 예를 들어, database 작업에서는 특정 테이블이나 인덱스가 활성 상태 데이터에 포함될 수 있다.

working set size

working set size는 활성 상태 데이터를 포함하는 메모리의 양을 나타낸다. 이는 아래와 같은 이유로 중요하다.

  1. 시스템 성능
  • working set size가 main memory의 용량 내에 유지되면, system 성능이 최적화된다. page fault와 I/O overhead가 줄어들어 빠른 데이터 접근이 가능해진다.
  1. memory management
  • Operating System(운영체제)는 working set size를 기반으로 메모리 관리 정책을 결정한다. 예를 들어, 자주 사용되는 데이터를 main memory에 유지하고, 덜 사용되는 data를 swap out하는 등의 정책을 사용한다.
  1. application 성능
  • 개발자는 application의 working set size를 최적화하여 성능을 향상시킬 수 있다. 이는 main memory의 용량과 캐시 효율성을 고려하여 데이터 구조와 알고리즘을 설계하는 것을 포함한다.

요약하자면 "활성 상태"는 특정 시간 동안 시스템에서 실제로 사용되고 있는 데이터와 코드를 의미하며, working set size는 이 활성 데이터를 포함하는 메모리의 양을 나타낸다. working set size를 적절히 관리하면 시스템 성능을 최적화할 수 있으며, 이는 page fault 빈도를 줄이고 cache 효율성을 높이는데 기여한다.

끝.

References

[1]. https://github.com/yongseokoh/trace-replay

0개의 댓글