OS 어떤 프로세스 어떤 이유로 인해 성능에 문제가 생겼을때 perf로 그 문제를 찾아보세요.
페이지 정보
작성자 OSworker 아이디로 검색 전체게시물 댓글 0건 조회 122회 좋아요 0회 작성일 24-11-10 22:19본문
안녕하세요 오늘은 성능 테스트 툴인 perf에 대해서나눠볼까합니다.
- 리눅스 perf는 성능을 측정하고 분석하는 데 유용한 강력한 도구입니다.
주로 커널 개발자와 성능 튜닝 엔지니어들이 CPU 성능을 최적화하고, 애플리케이션의 병목 현상을 찾아내며, 메모리 접근 패턴을 분석하는 데 사용합니다.
perf를 통해 애플리케이션과 시스템 전반의 성능을 측정하고 프로파일링할 수 있으며, 여러 하드웨어 및 소프트웨어 이벤트에 대한 데이터를 수집할 수 있습니다.
아래에서는 perf의 설치 방법, 기본적인 사용법, 주요 명령어, 그리고 사용 예제에 대해 설명하겠습니다.
1. perf 설치
# yum install perf
Updating Subscription Management repositories.
Red Hat Enterprise Linux 8 for x86_64 - BaseOS (RPMs) 33 MB/s | 75 MB 00:02
Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs) 33 MB/s | 68 MB 00:02
Package perf-4.18.0-513.5.1.el8_9.x86_64 is already installed.
Dependencies resolved.
========================================================================================================================================================================================================
Package Architecture Version Repository Size
========================================================================================================================================================================================================
Upgrading:
perf x86_64 4.18.0-553.27.1.el8_10 rhel-8-for-x86_64-baseos-rpms 13 M
Transaction Summary
========================================================================================================================================================================================================
Upgrade 1 Package
Total download size: 13 M
Is this ok [y/N]: y
2. 기본 사용법
- perf는 다양한 명령을 통해 성능 데이터를 수집하고 분석할 수 있습니다. 대표적인 perf 명령으로는 stat, record, report, top, annotate 등이 있습니다.
1) perf stat
- Perf stat 은 지정된 명령을 실행하고 명령 실행 중에 이벤트 발생 횟수를 계산하며 이러한 개수의 통계를 세 열로 표시합니다.
특정 이벤트에 대해 계산된 발생 수
계산된 이벤트의 이름
관련 지표를 사용할 수 있게 되면 오른쪽 끝에 있는 해시 기호(#) 뒤에 비율 또는 백분율이 표시됩니다.
예를 들어 기본 모드에서 실행하는 경우 perf stat 은 사이클과 지침을 모두 계산하므로 오른쪽 끝에 있는 사이클당 명령을 계산하고 표시합니다. 기본적으로 두 이벤트가 모두 계산되므로 분기 누락과 관련하여 유사한 동작을 모든 분기의 백분율로 확인할 수 있습니다.
$ perf stat -p ID1,ID2 sleep seconds
. 예제에서는 sleep 명령을 사용하여 지정한 시간( 초 ) 동안 ID1 및 ID2 를 사용하여 프로세스의 이벤트를 계산합니다.
ex)
# ps -ef | grep audit
root 42 2 0 22:07 ? 00:00:00 [kauditd]
root 929 1 0 22:08 ? 00:00:00 /sbin/auditd
..........
# perf stat -p 929
Performance counter stats for process id '929':
0.06 msec task-clock # 0.000 CPUs utilized
1 context-switches # 17.106 K/sec
0 cpu-migrations # 0.000 /sec
0 page-faults # 0.000 /sec
134,220 cycles # 2.296 GHz
18,670 instructions # 0.14 insn per cycle
4,104 branches # 70.203 M/sec
577 branch-misses # 14.06% of all branches
7.912872184 seconds time elapsed
2) perf record
- 프로세스를 실행하면서 프로파일링 데이터를 수집합니다. perf record를 사용하면 특정 커맨드를 실행하면서 그에 대한 모든 이벤트를 기록할 수 있습니다.
$ perf record <command>
ex)
- 서버에서 특정 시간에 PS로 문제를 못 찾는 경우 아래와 같은 명령어로 문제를 찾습니다.
# perf record -agT -- sleep 3
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.677 MB perf.data (256 samples) ]
# ls
perf.data // 이와 같은 파일이 생성됩니다.
> 옵션 설명
-a: 시스템의 모든 CPU 코어에 대해 성능 데이터를 수집합니다. 기본적으로 perf는 현재 프로세스와 스레드에 대한 데이터만 수집하지만, 이 옵션을 사용하면 시스템 전체의 성능을 추적합니다.
-g: 호출 그래프(call graph)를 수집합니다. 이를 통해 성능 문제를 추적하는 데 도움이 되는 호출 스택(call stack)을 분석할 수 있습니다. -g 옵션을 통해 프로그램이 호출된 함수들의 트리 구조를 분석하여 성능 병목을 찾는 데 유용합니다.
-T: 이 옵션은 각 이벤트에 타임스탬프를 기록합니다. 수집된 성능 데이터에 시간 정보를 추가하여 특정 시간대에 발생한 이벤트를 추적할 수 있게 됩니다.
--: 이중 대시는 perf record 명령어의 옵션과 명령어 실행을 구분하는 역할을 합니다. 여기서는 sleep 3 명령어를 구분하여 perf가 수집할 명령어로 전달되도록 합니다.
sleep 3: sleep 명령어는 지정한 시간(초) 동안 대기합니다. 이 예제에서는 3초 동안 대기하므로, perf는 이 3초 동안의 시스템 성능 데이터를 수집하게 됩니다.
3) perf report
- perf record로 수집한 데이터를 분석합니다. 기록된 이벤트의 세부 정보를 보고 성능 병목 구간을 파악할 수 있습니다.
위에서 생성한 파일을 해당 명령어로 분석을 해보도록하겠습니다.
- perf.data 가 있는 경로에서 아래 명령어를 실행하면 됩니다.
# perf report -f --no-children -s overhead,pid --show-cpu-utilization --stdio --max-stack=0
// 데이터를 수집한 3초동안 Overhead가 많은 것을 Listing 해보았습니다.
// -s overhead,pid: -s 옵션은 결과를 특정 기준으로 정렬할 때 사용됩니다
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 256 of event 'cycles'
# Event count (approx.): 61272740
#
# Overhead sys usr Pid:Command
# ........ ........ ........ .......................
#
25.48% 25.48% 0.00% 0:swapper
14.12% 4.48% 9.64% 1401:pmdalinux
11.19% 1.42% 9.78% 47853:python3
9.76% 7.60% 2.16% 1377:pmdaproc
8.00% 2.77% 5.23% 1038:tuned
3.40% 0.96% 2.45% 1205:in:imjournal
3.38% 0.89% 2.50% 1351:pmcd
3.19% 1.33% 1.86% 1441:tuned
3.03% 1.90% 1.14% 1452:pmdakvm
2.83% 1.46% 1.36% 670:systemd-journal
2.22% 0.30% 1.92% 1466:python3
1.82% 1.82% 0.00% 1002:abrt-dump-journ
1.58% 1.58% 0.00% 569:xfsaild/dm-0
1.30% 0.00% 1.30% 1208:rs:main Q:Reg
1.19% 1.19% 0.00% 1001:abrt-dump-journ
1.13% 0.29% 0.84% 1454:tuned
1.12% 0.87% 0.25% 3325:pool
1.00% 0.00% 1.00% 2265:pmlogger
0.87% 0.62% 0.25% 47851:sleep
0.74% 0.74% 0.00% 994:gmain
0.67% 0.67% 0.00% 47850:perf
0.52% 0.00% 0.52% 1000:abrt-dump-journ
0.48% 0.48% 0.00% 47852:perf
0.32% 0.00% 0.32% 973:gmain
0.27% 0.27% 0.00% 47708:kworker/0:0-eve
0.24% 0.24% 0.00% 34:kworker/3:0-mm_
0.13% 0.00% 0.13% 927:rpcbind
# perf report -f --no-children -s overhead,comm --show-cpu-utilization --stdio --max-stack=0
//-s overhead,comm: 이번에는 overhead와 comm을 기준으로 정렬합니다
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 256 of event 'cycles'
# Event count (approx.): 61272740
#
# Overhead sys usr Command
# ........ ........ ........ ...............
#
25.48% 25.48% 0.00% swapper
14.12% 4.48% 9.64% pmdalinux
13.41% 1.72% 11.69% python3
12.33% 4.40% 7.93% tuned
9.76% 7.60% 2.16% pmdaproc
3.53% 3.01% 0.52% abrt-dump-journ
3.40% 0.96% 2.45% in:imjournal
3.38% 0.89% 2.50% pmcd
3.03% 1.90% 1.14% pmdakvm
2.83% 1.46% 1.36% systemd-journal
1.58% 1.58% 0.00% xfsaild/dm-0
1.30% 0.00% 1.30% rs:main Q:Reg
1.16% 1.16% 0.00% perf
1.12% 0.87% 0.25% pool
1.06% 0.74% 0.32% gmain
1.00% 0.00% 1.00% pmlogger
0.87% 0.62% 0.25% sleep
0.27% 0.27% 0.00% kworker/0:0-eve
0.24% 0.24% 0.00% kworker/3:0-mm_
0.13% 0.00% 0.13% rpcbind
==> 이렇게 문제가 되는 Pid와 그에 사용되는 명령어를 확인 할수 있습니다.
4) perf top
- 실시간으로 시스템의 성능 데이터를 모니터링합니다. top 명령과 비슷하지만 더 상세한 정보를 제공합니다.
# perf top
Samples: 699 of event 'cycles', 4000 Hz, Event count (approx.): 551833854 lost: 0/0 drop: 0/0
Overhead Shared Object Symbol
12.06% [kernel] [k] kallsyms_expand_symbol.constprop.1
9.99% perf [.] kallsyms__parse
6.16% perf [.] rb_next
4.80% [kernel] [k] vsnprintf
4.39% [kernel] [k] number
4.17% [kernel] [k] memcpy_erms
3.59% [kernel] [k] format_decode
3.19% [kernel] [k] module_get_kallsym
2.92% perf [.] rb_erase
2.79% perf [.] __dso__load_kallsyms
2.77% perf [.] rb_insert_color
2.76% [kernel] [k] string_nocheck
2.20% [kernel] [k] update_iter
1.52% perf [.] 0x000000000037db6d
1.39% [kernel] [k] pointer
1.19% perf [.] machine__map_x86_64_entry_trampolines
1.19% libc-2.28.so [.] _int_malloc
1.06% libc-2.28.so [.] __strcmp_avx2
1.04% libc-2.28.so [.] __libc_calloc
1.01% libc-2.28.so [.] __strchr_avx2
0.99% perf [.] 0x000000000037db76
0.99% perf [.] __symbols__insert
0.99% [kernel] [k] seq_read
0.90% [kernel] [k] __x86_return_thunk
0.82% [kernel] [k] clear_page_erms
0.80% [kernel] [k] strlcpy
0.80% [kernel] [k] s_show
0.77% perf [.] 0x000000000037db60
------------------------------------------------------------------------------------------------------------------
12.06% [kernel] [k] kallsyms_expand_symbol.constprop.1 을 선택하면 좀더 상세히 볼수있습니다.
Annotate kallsyms_expand_symbol.constprop.1 ◆
Zoom into the Kernel DSO (use the 'k' hotkey to zoom directly into the kernel) // 선택하면 아래와 같이 상세히 볼수있습니다. ▒
Browse map details ▒
Exit
Samples: 3K of event 'cycles', 4000 Hz, Event count (approx.): 853568814, DSO: [kernel] lost: 0/0 drop: 0/0
Overhead Symbol
4.32% [k] kallsyms_expand_symbol.constprop.1 ◆
1.79% [k] number ▒
1.47% [k] format_decode ▒
1.41% [k] vsnprintf ▒
1.39% [k] module_get_kallsym ▒
1.36% [k] string_nocheck ▒
1.33% [k] memcpy_erms ▒
0.70% [k] native_write_msr ▒
0.66% [k] update_iter ▒
0.59% [k] __x86_return_thunk ▒
0.59% [k] page_fault ▒
0.57% [k] __irqentry_text_start ▒
0.51% [k] __lock_text_start ▒
0.51% [k] pvclock_clocksource_read ▒
0.45% [k] __raw_callee_save___pv_queued_spin_unlock
사실 여러분들이 편하게 자주 사용하시게 될것은 2)perf record 와 3) perf report 입니다.
성능을 캡쳐를 떠서 그 시간대에 어떤 것들이 사용했는지 찾는 방법입니다.
좀 더 자세한 내용을 찾으시는 분들은 아래 참고 링크를 참고하세요~
댓글목록
등록된 댓글이 없습니다.