Perf 툴이란

• Linux 운영체제의 성능 분석 도구
• Performance counter 의 userspace 인터페이스
• 하드웨어 이벤트를 모니터링
• 소프트웨어 이벤트 트레이싱
• 시스템의 전반적인 성능 측정 및 분석

• 다양한 sub command 를 가지고 있음
• 아키텍쳐마다, 현재 컴파일 되어있는 커널마다,
지원하는 카운터 / 트레이싱 포인트가 다르기에
사용할 때 어떤걸 지원하는지 확인한 후에 사용해야함.
• 중요 한 것 하나, 동시에 사용가능한 하드웨어 카운터의 숫자가
시스템마다 다르다.
• 이벤트는 독립적 입니다.

• Perf 의 subcmd
• 현재 시스템 / application 이 지원하는 프로파일링 가능한 list
• 여러가지 종류의 이벤트가 지원됨

Software event

  • 프로그램이 align 되지 않은 방식으로 access할때 발생하는 예외처리
  • bpf-output : bpf 결과
  • cgroup_switches : c그룹간 컨텍스트 전환
  • 컨텍스트 전환 회수
  • cpu가 다른코어로 이동한 회수
  • 더미 = 무시
  • emulation fault : 하드웨어가 지원하지 않는것을 에뮬레이션 한것
  • major-faults : 디스크에서 페이지를 가져올때 페이지폴트
  • minor-faults : 페이지가 메모리에 있지만 엑세스 받지 못했을 때
  • task-clock : 프로세스가 cpu를 사용한 시간

Hardware Cache event

  • cpu가 요청한 데이터가 L1 데이터 캐시에 없을때 발생
  • 읽기 시도 숫자
  • 데이터 캐시에서 발생한 쓰기 실패
  • 쓰기 시도 숫자
  • icache : instruction (명령어)를 찾지 못했을 때
  • 분기 예측 실패 숫자
  • 데이터 TLB 발생한 로드 미스 숫자
  • 명령 TLB
  • 노드 - 읽기
  • 노드 - 쓰기

Perf 쉘스크립트 만들기

import multiprocessing
import time
import random

# 공유 리소스를 위한 락을 생성합니다.
lock = multiprocessing.Lock()

counter = multiprocessing.Value('i', 0)

def worker():
    end_time = time.time() + 5 # 5초 후의 시간을 계산

    while time.time() < end_time:
        # 락을 획득
        lock.acquire()
        try:
            # 숫자를 출력하고 카운터를 증가시킵니다.
            print(counter.value)
            counter.value += 1
            # 임의의 작업을 수행합니다.
            time.sleep(random.uniform(0, 1))
        finally:
            # 락을 반납합니다.
            lock.release()

# 두 개의 프로세스를 생성하고 시작합니다.
p1 = multiprocessing.Process(target=worker)
p2 = multiprocessing.Process(target=worker)
p1.start()
p2.start()

# 두 프로세스가 종료될 때 까지 기다립니다.
p1.join()
p2.join()
  • test할 파일
#!/bin/bash
if [ "$1" == "stat" ]; then
    if [ "$2" == "1" ]; then
        sudo perf stat -e branch-misses,bus-cycles,cache-misses,cache-references,cpu-cycles,instructions

    elif [ "$2" == "2" ]; then
        sudo perf stat -e alignment-faults,bpf-output,cgroup-switches,context-switches,cpu-clock,cpu-migrations,dummy,emulation-faults,major-faults,minor-faults,page-faults,task-clock $@

    else
        echo "1: hardware event 2: software event"
    fi

elif [ "$1" == "lock" ]; then
    sudo perf lock record python3 perf_lock.py
    sudo perf lock report
fi
  • 첫 번째 인수 stat
  • 두 번째 인수 1 or 2
  • 1 or 2 외의 번호를 누르면 echo 발생
  • 첫 번째 인수 lock => record + report
  • 첫 번째 인수에 대해 잘못입력할 경우 예외처리는 작업하지 않음

0개의 댓글