공유할 서비스 선택

TECH


TECH

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 입니다. 

성능을 캡쳐를 떠서 그 시간대에 어떤 것들이 사용했는지 찾는 방법입니다. 

 

좀 더 자세한 내용을 찾으시는 분들은 아래 참고 링크를 참고하세요~

 

https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/8/html/monitoring_and_managing_system_status_and_performance/recording-and-analyzing-performance-profiles-with-perf_monitoring-and-managing-system-status-and-performance#recording-and-analyzing-performance-profiles-with-perf_monitoring-and-managing-system-status-and-performance

 

 

 

 

 

댓글목록

등록된 댓글이 없습니다.

TECH 목록
번호 제목 작성자 작성일 조회수
233 OS OSworker 아이디로 검색 전체게시물 11-27 36
Red Hat Enterprise Linux 9에서 root 사용자로 SSH 로그인 활성화 하는 방법

카테고리 : OS

36 0
작성자 : OSworker 24/11/27
232 OS OSworker 아이디로 검색 전체게시물 11-17 108
RHEL 9.5 가 11월 12일에 릴리즈 되었습니다. 간략하게 살펴보시죠~

카테고리 : OS

108 0
작성자 : OSworker 24/11/17
열람중 OS OSworker 아이디로 검색 전체게시물 11-10 123
열람중
어떤 프로세스 어떤 이유로 인해 성능에 문제가 생겼을때 perf로 그 문제를 찾아보세요.

카테고리 : OS

123 0
작성자 : OSworker 24/11/10
230 OS OSworker 아이디로 검색 전체게시물 10-31 173
AI에 대한 관심이 많습니다. 혹시 RHEL AI에 대해 들어보셨나요?

카테고리 : OS

173 0
작성자 : OSworker 24/10/31
229 OS OSworker 아이디로 검색 전체게시물 10-24 188
Fedora와 Red Hat Enterprise Linux의 차이점

카테고리 : OS

188 0
작성자 : OSworker 24/10/24
228 OS OSworker 아이디로 검색 전체게시물 10-11 227
audit 로그에 저장된 time 을 날짜/시간 으로 변경하여 보는법

카테고리 : OS

227 0
작성자 : OSworker 24/10/11
227 OS OSworker 아이디로 검색 전체게시물 09-29 367
[보안취약점]"RHSB-2024-002 - OpenPrinting cups-filters"에 대해 설명드리고자합니다.

카테고리 : OS

367 0
작성자 : OSworker 24/09/29
226 OS OSworker 아이디로 검색 전체게시물 09-25 447
누가 설정파일을 수정했는지 알고싶어요? 그럼 audit를 사용해보세요~!

카테고리 : OS

447 0
작성자 : OSworker 24/09/25
225 OS OSworker 아이디로 검색 전체게시물 09-15 339
RHEL6.10 앞으로 어떻게 되나요? 아직도 RHEL6버전을 사용하신다구요?

카테고리 : OS

339 0
작성자 : OSworker 24/09/15
224 OS OSworker 아이디로 검색 전체게시물 08-30 451
SWAP이 왜 자꾸 사용하게 될까요? 누가 사용하는것일까요?

카테고리 : OS

451 0
작성자 : OSworker 24/08/30
Total 233건
게시물 검색

주식회사 클럭스| 대표 : 이찬호| 사업자등록번호 : 107-87-27655
주소 : 서울특별시 영등포구 국회대로 800, 여의도파라곤
E-mail : sales@chlux.co.kr
Copyright © 클럭스 chlux.co.kr All rights reserved.
상단으로Top