Giter Club home page Giter Club logo

linux-perf's People

Contributors

acmel avatar adrianbunk avatar airlied avatar alexdeucher avatar arndb avatar axellin avatar bigguiness avatar broonie avatar bzolnier avatar danvet avatar davem330 avatar dhowells avatar ebiederm avatar geertu avatar gregkh avatar htejun avatar ickle avatar jmberg-intel avatar joeperches avatar larsclausen avatar linusw avatar mchehab avatar morimoto avatar olofj avatar pmundt avatar ralfbaechle avatar rddunlap avatar tiwai avatar torvalds avatar vsyrjala avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

linux-perf's Issues

쉬운 소스리딩방법, 해당 함수가있는 소스라인으로 점프하기 (Cscope & Emacs)

* 손쉬운 소스리딩을 위한 tool 세팅

uftrace나 gdb등을 이용해서 함수의 call-graph를 볼수있긴하지만
소스코드를 읽을때 grep등을 이용해서 해당함수가 있는 소스파일을
일일이 찾아서 열어보기엔 상당히 작업속도가 느릴수 있습니다.

cscope, ctags등을 활용하면 특정 함수가 있는 소스라인으로 점프를
뛰면서 바로바로 확인해볼수 있습니다. 예를 들어서 perf_config__init()
이라는 함수가 perf.c 의 main() 함수 내에서 호출이 되었다면
perf.c 파일을 열고 main() 함수내부를 읽다가 perf_config__init()이 구현된
위치(tools/perf/util/config.c의 693라인)로 바로 점프뛰어 확인해볼수있는거죠.

* 설정당시 환경

(꼭 이 버전들을 따를필요는 없을겁니다..)

  • os : ubuntu 13.10
  • emacs : 24.3.1
  • cscope : 15.8b

1) cscope 설치방법

cscope 다운로드 링크

# cscope바로 받아서 쓰거나 scp등으로 밀어넣는게 아니고 wget 이용시에는
$ wget http://downloads.sourceforge.net/project/cscope/cscope/15.8b/cscope-15.8b.tar.gz?r=&ts=1474839637&use_mirror=jaist
$ tar zxvf cscope-X.Y.tar.gz
$ cd cscope-X.Y
$ ./configure
$ sudo make install

2) Cscope & Emacs 연동설정

$ cd contrib/xcscope
$ sudo cp cscope-indexer /usr/local/bin
$ cp xcscope.el ~/.emacs.d/
# Emacs에서의 Cscope 설정
$ echo '(load-file "~/.emacs.d/xcscope.el")' >> ~/.emacs

3) index파일 만들기, 작업폴더 초기화

  • 이 작업은 안해도 우선은 크게 문제없을겁니다.
M-x cscope-index-file <RET>
$ rm -rf cscope.files cscope.out
$ find . \( -name '*.c' -o -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.s' -o -name '*.S' \) -print > cscope.files
$ cscope -b -i cscope.files

M-x cscope-set-initial-directory <RET>
# 또는 아래 명령으로 작업폴더 초기화
C-c s a 

4) Emacs에서의 cscope 명령들

# 자주사용되는것
C-c s d     Find global definition.
C-c s c     Find functions calling a function.
C-c s C     Find called functions (list functions called from a function).
C-c s s     Find symbol.
C-c s u     Return the point from where you jumped.

# 다른 명령들
C-c s g     Find global definition (alternate binding).
C-c s G     Find global definition without prompting.
C-c s t     Find text string.
C-c s e     Find egrep pattern.
C-c s f     Find a file.
C-c s i     Find files #including a file.
C-c s a     Set initial directory which has a index file (cscope.out).

(필수작업) 멘티 각자 Milestones 만들기

(필수) 진행상황을 가시화 하기위해서 Milestone을 활용하겠습니다.

각자 마일스톤을 생성하고
이름: 이슈제목 으로만 이슈내용없이 생성해서 본인 마일스톤에 연결해서 진행하면 됩니다.
완료할시에는 close하면 되고 Issues 탭의 Milestones를 누르면 진행상황%를 확인할수있습니다.

* 우리가 수행해야할 미션들.. (앞으로 더 추가됩니다)

  1. Git 기본 명령(add, commit, push) 학습
  2. Git 고급 명령(checkout, reset, rebase) 학습
  3. perf 컴파일 및 개발환경 구축
  4. perf소스 중 config --list가 실행되는 과정분석
  5. perf 실습 (QuickStart)
  6. perf 기본실습

1) 각자 작업할 이슈생성하기

예시)
김선영: Git 기본 명령(add, commit, push) 학습
김선영: Git 고급 명령(checkout, reset, rebase) 학습
김선영: perf 컴파일 및 개발환경 구축
김선영: perf소스 중 config --list가 실행되는 과정분석
김선영: perf 실습 (QuickStart)
김선영: perf 기본실습
조성수: Git 기본 명령(add, commit, push) 학습
조성수: Git 고급 명령(checkout, reset, rebase) 학습
조성수: perf 컴파일 및 개발환경 구축
조성수: perf소스 중 config --list가 실행되는 과정분석
...

  • 이슈 제목만적고 내용은 생략해도 됩니다.

screenshot from 2016-09-26 07-56-31

2) 각자 마일스톤 생성방법

Issues 탭에 Milestones로 들어가서 New Milestone 버튼 누르고 생성
마감기간은 9/30로 제목은 본인 이름으로 설정

  • 제 이름으로 예시가 되어있습니다. 참고해주세요!

1. Issues 탭에 Milestones로 들어가기

screenshot from 2016-09-26 08-02-41

2. New Milestone 버튼 누르기

screenshot from 2016-09-26 08-02-51

3. 본인이름으로 마일스톤 9/30기간으로 생성하기

screenshot from 2016-09-26 08-02-58

3) 각자 생성한 이슈를 본인 마일스톤에 연결하기

본인이 생성한 이슈를 열고 오른쪽 부분에 마일스톤을 연결지읍시다.

screenshot from 2016-09-26 07-59-15

[권욱제] 'ctags - vi에서 함수의 내부로 점프하기' 정리

ctags 설치 및 사용법

ctags의 특징

  • 소스코드 내의 함수나 변수를 인덱싱하여 해당 함수/변수가 선언된 위치로 이동할 수 있게 도와줌
  • 함수와 변수를 인덱싱(index)하는 유틸리티
  • 간단한 설정으로 vi 내에서 사용 가능

ctags의 설치

설치확인
$ ctags -help

설치
$ sudo apt-get install ctags

ctags의 생성

원하는 파일만 생성
$ ctags file1 혹은 $ ctags file1 file2 file3 ...
모든 파일에 대해 생성
$ ctags -R

  • 이후 같은 디렉터리에 tags 파일이 생성되는 것을 볼 수 있음.
  • ctags가 생성되지 않은 소스코드는 인덱싱이 되지 않은 상태이므로 ctags의 기능을 사용할 수 없음.
  • 함수로 점프! 기능을 이용하고 싶은 소스코드는 꼭 tags 파일을 생성해야 함.

ctags의 사용

tags 파일 열기
$ vi tags
tags 파일 구조
[태그명] [파일명] [파일 내에 정의된 형식]
예시

main main.c int main(void) f
print_hello print_hello.c void print_hello.c() f

원하는 태그로 이동
:tj [tags]
이전 태그로 돌아가기
:po
분할된 창에서 태그 확인
:stj tag_name
단축키
:tj -> Ctrl + ] // 해당 함수(변수) 내부로 점프
:po -> Ctrl + t // 다시 이전 위치로(점프해서 들어오기 전 위치로) 점프

vi에서 ctags 사용하기

tags 파일이 있는 경로 등록
$ vi ~/.vimrc를 열고 set tags=/home/wookje/test_project/tags(위에서 생성한 tags 파일이 있는 절대경로)
이후 vi에서 :tj, :po 등의 명령어 사용 가능

기타 명령어들

명령어 설명
:tj [tags] (Ctrl + ]) Tag가 정의된 부분들을 모두 보여주고 선택한 위치로 점프, 현재 위치는 stack에 push됨
:po (Ctrl + t) 점프해서 들어오기 이전 위치로 점프, 현재 위치는 stack에서 pop됨
:tn 다음 tag로 점프
:tp 이전 tag로 점프
:tr 처음 tag로 점프
:tl 마지막 tag로 점프
:stj [tags] 창을 수평으로 분할하여 창을 새로 생성한 뒤 :tj 명령어를 수행함
:pts [tags] 창을 수평으로 분할하여 창을 새로 생성한 뒤 현재 위치에서 :tj 명령어를 수행함
:ptj [tags] 미리보기 윈도우에 tag가 정의된 형식을 보임
:ptn (:pts나 :ptj로 점프한 경우) 다음 tag로 점프
:ptp (:pts나 :ptj로 점프한 경우) 이전 tag로 점프
:ptr (:pts나 :ptj로 점프한 경우) 처음 tag로 점프
:ptl (:pts나 :ptj로 점프한 경우) 마지막 tag로 점프

빠르게 작성하느라 친절하지 못한 글이 돼버렸네요... 곧 수정하겠습니다

perf 컴파일 및 개발환경 구축 (9/25)

  1. linux환경 세팅 (배포판 무관)
  • 가상환경이 필요하시면 VirtualBox등을 활용하면 될것같습니다.
  1. perf공식 repo 리눅스커널 소스 받기

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git

  1. perf 컴파일 해놓기
    리눅스커널소스에서 tools/perf 경로로 이동해서
    make만 하시면 컴파일이 되는데 필요한 라이브러리가 있을수있습니다.

$ sudo apt-get install -y libdw-dev libelf-dev libnewt-dev libunwind8-dev elfutils libaudit-dev libperl-dev libnuma-dev binutils-dev flex bison libpython2.7-dev asciidoc liblzma-dev libiberty-dev libgtk2.0-dev libssl-dev python-dev systemtap-sdt-dev

이정도 있는데 배포판이 다르면 패키지명이 좀 다를수있습니다.
이건 make과정에서 오류메시지로 무슨 라이브러리가 없는지 알려줍니다.

만약에 perf 소스만 리눅스커널 소스내부에서 추출하고 싶으면
linux 커널 소스 들어가서 tools/perf/로 경로 옴기지마시고
가장 상위 디렉토리에서
$ make perf-targz-src-pkg
라고 명령입력하시면 됩니다. 위의 사항은
$ make help
를 통해서도 살펴볼수 있습니다.

  1. git 설치해두기 (리눅스 내부에)
    $ sudo apt-get install git

[KOSSHACKATHON - perf(linux) 팀] 9/26 (월) 할일 정리

9/26 (월) 저녁 7시 perf팀 오프라인 일정

1) git 실습 및 훈련

2) PATCH 과정 모의로 전체 과정 해보기 (메일은 LKML대신 저에게로)

이전에 제가 만든 간단한 PATCH내용을 이해해보고 동일한 시나리오로
저에게 PATCH를 보내어 봅시다.

3) perf 직접 실습훈련 해보기

perf의 기능을 다양하게 활용하는 실습시간을 갖습니다.

4) perf의 소스중에서 config 실행부분 분석해보기

이전 글에 uftrace같은걸 활용한것처럼 perf의 소스를 다같이 분석해보도록 합시다.
시간이 허락한다면 report기능이 진행되는과정도 uftrace나 ctags, cscope을 통해서 분석해볼 예정입니다.

[KOSSHACKATHON - perf(linux) 팀] 9/26 (월) 할일 정리

9/26 (월) 저녁 7시 perf팀 오프라인 일정

1) git 실습 및 훈련

2) PATCH 과정 모의로 전체 과정 해보기 (메일은 LKML대신 저에게로)

이전에 제가 만든 간단한 PATCH내용을 이해해보고 동일한 시나리오로
저에게 PATCH를 보내어 봅시다.

3) perf 직접 실습훈련 해보기

perf의 기능을 다양하게 활용하는 실습시간을 갖습니다.

4) perf의 소스중에서 config 실행부분 분석해보기

이전 글에 uftrace같은걸 활용한것처럼 perf의 소스를 다같이 분석해보도록 합시다.
시간이 허락한다면 report기능이 진행되는과정도 uftrace나 ctags, cscope을 통해서 분석해볼 예정입니다.

uftrace를 활용한 perf config --list 실행과정 분석

uftrace 라는걸 활용하면 함수가 call되는 과정을 살펴보기가 좋습니다.
소스 읽고계신분도 있어서 간단하게만 활용법 보여드립니다.

1) uftrace 설치

https://github.com/namhyung/uftrace/wiki#quick-install

2) perf 재컴파일 (리눅스커널 소스디렉토리부터 진행)

$ cd tools/perf
$ make clean
$ make -j4 EXTRA_CFLAGS=-pg

3) perf의 subcommand 실행 직전까지의 함수call-graph 살펴보기

(perf바이너리가 있는 경로를 full path로 적어줘야합니다. /usr/local/bin/perf 대신에)
sudo uftrace record -t 1us -D 4 /usr/local/bin/perf config
sudo uftrace replay

# DURATION    TID     FUNCTION
   2.088 us [15860] | __cxa_atexit();
            [15860] | symbol__init_regexpr() {
  18.674 us [15860] |   regcomp();
  19.427 us [15860] | } /* symbol__init_regexpr */
            [15860] | main() {
   1.084 us [15860] |   sysconf();
            [15860] |   sysctl__read_int() {
            [15860] |     procfs__mountpoint() {
  11.942 us [15860] |       fs__get_mountpoint();
  14.671 us [15860] |     } /* procfs__mountpoint */
   1.460 us [15860] |     __snprintf_chk();
            [15860] |     filename__read_int() {
   5.349 us [15860] |       open64();
   5.629 us [15860] |     } /* filename__read_int */
  22.323 us [15860] |   } /* sysctl__read_int */
            [15860] |   sysctl__read_int() {
            [15860] |     filename__read_int() {
   1.726 us [15860] |       open64();
   1.918 us [15860] |     } /* filename__read_int */
   2.650 us [15860] |   } /* sysctl__read_int */
   1.289 us [15860] |   extract_argv0_path();
   1.236 us [15860] |   time();
   2.076 us [15860] |   srandom();
            [15860] |   perf_config__init() {
            [15860] |     perf_config_set__new() {
   1.009 us [15860] |       zalloc();
  56.477 us [15860] |       perf_config_set__init();
  58.184 us [15860] |     } /* perf_config_set__new */
  58.416 us [15860] |   } /* perf_config__init */
            [15860] |   perf_config() {
   2.868 us [15860] |     perf_default_config();
   8.562 us [15860] |   } /* perf_config */
            [15860] |   set_buildid_dir() {
   3.134 us [15860] |     snprintf();
   2.056 us [15860] |     setenv();
   6.381 us [15860] |   } /* set_buildid_dir */
            [15860] |   tracing_path_mount() {
            [15860] |     tracefs__mount() {
   7.271 us [15860] |       fs__get_mountpoint();
   7.560 us [15860] |     } /* tracefs__mount */
   1.695 us [15860] |     snprintf();
   1.652 us [15860] |     __snprintf_chk();
   1.656 us [15860] |     __snprintf_chk();
  13.162 us [15860] |   } /* tracing_path_mount */
   1.404 us [15860] |   test_attr__init();
            [15860] |   setup_path() {
   1.070 us [15860] |     get_argv_exec_path();
   1.273 us [15860] |     add_path();
   1.205 us [15860] |     add_path();
   6.365 us [15860] |   } /* setup_path */
            [15860] |   pthread__block_sigwinch() {
   1.345 us [15860] |     pthread_sigmask();
   3.508 us [15860] |   } /* pthread__block_sigwinch */
            [15860] |   perf_debug_setup() {
   1.089 us [15860] |     libapi_set_print();
   1.343 us [15860] |   } /* perf_debug_setup */
            [15860] |   run_argv() {
            [15860] |     handle_internal_command() {
            [15860] |       run_builtin() {

uftrace stopped tracing with remaining functions
===============================================
task: 15860
[3] run_builtin
[2] handle_internal_command
[1] run_argv
[0] main

4) perf의 config 명령의 --list 실행과정 살펴보기

(perf바이너리가 있는 경로를 full path로 적어줘야합니다. /usr/local/bin/perf 대신에)

$ sudo uftrace record -t 1us -F cmd_config /usr/local/bin/perf config --list
annotate.hide_src_code=false
tui.report=on
colors.top=red:default

$ sudo uftrace replay

# DURATION    TID     FUNCTION
            [15565] | cmd_config() {
            [15565] |   mkpath() {
   2.122 us [15565] |     vsnprintf();
   3.402 us [15565] |   } /* mkpath */
            [15565] |   parse_options() {
   3.847 us [15565] |     parse_options_subcommand();
   4.121 us [15565] |   } /* parse_options */
            [15565] |   perf_config_set__new() {
            [15565] |     perf_config_set__init() {
   1.381 us [15565] |       access();
            [15565] |       perf_config_from_file() {
   1.541 us [15565] |         fopen64();
            [15565] |         perf_parse_file() {
            [15565] |           get_next_char() {
   1.452 us [15565] |             fgetc();
   1.716 us [15565] |           } /* get_next_char */
   3.376 us [15565] |           get_base_var();
            [15565] |           get_value() {
   1.608 us [15565] |             parse_value();
   3.154 us [15565] |             collect_config();
   9.072 us [15565] |           } /* get_value */
  15.961 us [15565] |         } /* perf_parse_file */
  18.806 us [15565] |       } /* perf_config_from_file */
            [15565] |       mkpath() {
   1.371 us [15565] |         vsnprintf();
   1.955 us [15565] |       } /* mkpath */
            [15565] |       perf_config_from_file() {
   1.089 us [15565] |         fopen64();
            [15565] |         perf_parse_file() {
   3.246 us [15565] |           get_base_var();
            [15565] |           get_value() {
   1.495 us [15565] |             parse_value();
   1.511 us [15565] |             collect_config();
   7.188 us [15565] |           } /* get_value */
   1.406 us [15565] |           get_base_var();
            [15565] |           get_value() {
   2.655 us [15565] |             collect_config();
   5.725 us [15565] |           } /* get_value */
   2.466 us [15565] |           get_base_var();
            [15565] |           get_value() {
   2.611 us [15565] |             parse_value();
   2.810 us [15565] |             collect_config();
   6.761 us [15565] |           } /* get_value */
  33.022 us [15565] |         } /* perf_parse_file */
  34.984 us [15565] |       } /* perf_config_from_file */
  60.786 us [15565] |     } /* perf_config_set__init */
  61.440 us [15565] |   } /* perf_config_set__new */
            [15565] |   show_config() {
   2.473 us [15565] |     printf();
   3.675 us [15565] |   } /* show_config */
            [15565] |   perf_config_set__delete() {
            [15565] |     perf_config_set__purge() {
            [15565] |       perf_config_section__delete() {
   1.026 us [15565] |         perf_config_section__purge();
   1.556 us [15565] |       } /* perf_config_section__delete */
   1.252 us [15565] |       perf_config_section__delete();
   1.184 us [15565] |       perf_config_section__delete();
   5.673 us [15565] |     } /* perf_config_set__purge */
   5.999 us [15565] |   } /* perf_config_set__delete */
  80.388 us [15565] | } /* cmd_config */

5) uftrace 활용법 참고 링크

https://github.com/namhyung/uftrace/blob/master/doc/uftrace-record.md

[권욱제] perf call stack (not filtered)

필터링 없이 uftrace 해보았습니다... 엄청 기네요

# DURATION    TID     FUNCTION
   8.416 us [ 3389] | __cxa_atexit();
            [ 3389] | symbol__init_regexpr() {
  64.466 us [ 3389] |   regcomp();
  66.217 us [ 3389] | } /* symbol__init_regexpr */
            [ 3389] | main() {
   0.276 us [ 3389] |   exec_cmd_init();
   0.324 us [ 3389] |   pager_init();
   2.221 us [ 3389] |   sysconf();
   4.429 us [ 3389] |   sysconf();
            [ 3389] |   sysctl__read_int() {
            [ 3389] |     procfs__mountpoint() {
            [ 3389] |       fs__get_mountpoint() {
            [ 3389] |         fs__env_override() {
   2.251 us [ 3389] |           strlen();
   1.832 us [ 3389] |           memcpy();
   1.676 us [ 3389] |           __ctype_toupper_loc();
   1.370 us [ 3389] |           getenv();
  12.091 us [ 3389] |         } /* fs__env_override */
   4.267 us [ 3389] |         statfs64();
   7.722 us [ 3389] |         __strcpy_chk();
  32.445 us [ 3389] |       } /* fs__get_mountpoint */
  35.252 us [ 3389] |     } /* procfs__mountpoint */
   7.087 us [ 3389] |     __snprintf_chk();
            [ 3389] |     filename__read_int() {
  41.107 us [ 3389] |       open64();
  42.238 us [ 3389] |     } /* filename__read_int */
  88.083 us [ 3389] |   } /* sysctl__read_int */
            [ 3389] |   sysctl__read_int() {
   0.275 us [ 3389] |     procfs__mountpoint();
   3.302 us [ 3389] |     __snprintf_chk();
            [ 3389] |     filename__read_int() {
  10.993 us [ 3389] |       open64();
  11.791 us [ 3389] |     } /* filename__read_int */
  17.198 us [ 3389] |   } /* sysctl__read_int */
            [ 3389] |   extract_argv0_path() {
   0.375 us [ 3389] |     strlen();
   2.900 us [ 3389] |     __strndup();
   8.858 us [ 3389] |   } /* extract_argv0_path */
   3.412 us [ 3389] |   time();
   4.716 us [ 3389] |   srandom();
            [ 3389] |   perf_config__init() {
   1.441 us [ 3389] |     calloc();
            [ 3389] |     perf_config_set__init() {
   0.724 us [ 3389] |       getenv();
            [ 3389] |       system_path() {
   7.726 us [ 3389] |         __asprintf_chk();
   8.629 us [ 3389] |       } /* system_path */
   5.782 us [ 3389] |       access();
   2.286 us [ 3389] |       getenv();
   0.443 us [ 3389] |       getenv();
            [ 3389] |       mkpath() {
   5.421 us [ 3389] |         __vsnprintf_chk();
   3.050 us [ 3389] |         memcmp();
  10.189 us [ 3389] |       } /* mkpath */
   1.765 us [ 3389] |       __strdup();
   3.131 us [ 3389] |       __xstat64();
   1.328 us [ 3389] |       free();
  42.282 us [ 3389] |     } /* perf_config_set__init */
            [ 3389] |     perf_config_set__delete() {
   0.476 us [ 3389] |       perf_config_set__purge();
   0.374 us [ 3389] |       free();
   3.538 us [ 3389] |     } /* perf_config_set__delete */
  50.429 us [ 3389] |   } /* perf_config__init */
   0.575 us [ 3389] |   perf_config();
            [ 3389] |   set_buildid_dir() {
   0.840 us [ 3389] |     getenv();
   3.021 us [ 3389] |     __snprintf_chk();
   6.945 us [ 3389] |     setenv();
  55.874 us [ 3389] |   } /* set_buildid_dir */
            [ 3389] |   tracing_path_mount() {
            [ 3389] |     tracefs__mount() {
            [ 3389] |       fs__get_mountpoint() {
            [ 3389] |         fs__env_override() {
   0.393 us [ 3389] |           strlen();
   0.333 us [ 3389] |           memcpy();
   0.418 us [ 3389] |           __ctype_toupper_loc();
   0.424 us [ 3389] |           getenv();
   4.973 us [ 3389] |         } /* fs__env_override */
   9.801 us [ 3389] |         statfs64();
   5.689 us [ 3389] |         statfs64();
   1.472 us [ 3389] |         statfs64();
   1.185 us [ 3389] |         statfs64();
  30.008 us [ 3389] |         fopen64();
  73.780 us [ 3389] |         __isoc99_fscanf();
   1.915 us [ 3389] |         strcmp();
   1.775 us [ 3389] |         __isoc99_fscanf();
   0.342 us [ 3389] |         strcmp();
   1.417 us [ 3389] |         __isoc99_fscanf();
   0.311 us [ 3389] |         strcmp();
   1.371 us [ 3389] |         __isoc99_fscanf();
   0.305 us [ 3389] |         strcmp();
   1.348 us [ 3389] |         __isoc99_fscanf();
   0.305 us [ 3389] |         strcmp();
   1.254 us [ 3389] |         __isoc99_fscanf();
   0.304 us [ 3389] |         strcmp();
   1.612 us [ 3389] |         __isoc99_fscanf();
   0.305 us [ 3389] |         strcmp();
   1.251 us [ 3389] |         __isoc99_fscanf();
   0.304 us [ 3389] |         strcmp();
   1.189 us [ 3389] |         __isoc99_fscanf();
   0.303 us [ 3389] |         strcmp();
   1.213 us [ 3389] |         __isoc99_fscanf();
   0.303 us [ 3389] |         strcmp();
   1.243 us [ 3389] |         __isoc99_fscanf();
   0.307 us [ 3389] |         strcmp();
   1.280 us [ 3389] |         __isoc99_fscanf();
   0.304 us [ 3389] |         strcmp();
   1.226 us [ 3389] |         __isoc99_fscanf();
   0.305 us [ 3389] |         strcmp();
   1.247 us [ 3389] |         __isoc99_fscanf();
   0.305 us [ 3389] |         strcmp();
   1.199 us [ 3389] |         __isoc99_fscanf();
   0.309 us [ 3389] |         strcmp();
   1.236 us [ 3389] |         __isoc99_fscanf();
   0.304 us [ 3389] |         strcmp();
  18.973 us [ 3389] |         __isoc99_fscanf();
   0.316 us [ 3389] |         strcmp();
   1.542 us [ 3389] |         __isoc99_fscanf();
   0.305 us [ 3389] |         strcmp();
   1.304 us [ 3389] |         __isoc99_fscanf();
   0.307 us [ 3389] |         strcmp();
   1.231 us [ 3389] |         __isoc99_fscanf();
   0.306 us [ 3389] |         strcmp();
   1.283 us [ 3389] |         __isoc99_fscanf();
   0.306 us [ 3389] |         strcmp();
   2.488 us [ 3389] |         __isoc99_fscanf();
   0.316 us [ 3389] |         strcmp();
   1.291 us [ 3389] |         __isoc99_fscanf();
  14.819 us [ 3389] |         fclose();
 223.533 us [ 3389] |       } /* fs__get_mountpoint */
            [ 3389] |       mount_overload.isra.0() {
   0.502 us [ 3389] |         strlen();
   3.732 us [ 3389] |         __snprintf_chk();
   0.411 us [ 3389] |         __ctype_toupper_loc();
   0.986 us [ 3389] |         getenv();
   8.459 us [ 3389] |       } /* mount_overload.isra.0 */
  11.576 us [ 3389] |       mount();
 247.695 us [ 3389] |     } /* tracefs__mount */
            [ 3389] |     debugfs__mount() {
            [ 3389] |       fs__get_mountpoint() {
            [ 3389] |         fs__env_override() {
   0.321 us [ 3389] |           strlen();
   0.375 us [ 3389] |           memcpy();
   0.306 us [ 3389] |           __ctype_toupper_loc();
   0.408 us [ 3389] |           getenv();
   3.546 us [ 3389] |         } /* fs__env_override */
   2.696 us [ 3389] |         statfs64();
   0.478 us [ 3389] |         __strcpy_chk();
   8.150 us [ 3389] |       } /* fs__get_mountpoint */
   8.777 us [ 3389] |     } /* debugfs__mount */
   9.173 us [ 3389] |     snprintf();
   5.281 us [ 3389] |     __snprintf_chk();
   7.068 us [ 3389] |     __snprintf_chk();
 286.666 us [ 3389] |   } /* tracing_path_mount */
   0.558 us [ 3389] |   prefixcmp();
   0.446 us [ 3389] |   prefixcmp();
   0.454 us [ 3389] |   handle_options();
   0.388 us [ 3389] |   prefixcmp();
            [ 3389] |   test_attr__init() {
   0.688 us [ 3389] |     getenv();
   4.997 us [ 3389] |   } /* test_attr__init */
            [ 3389] |   setup_path() {
   0.745 us [ 3389] |     getenv();
            [ 3389] |     get_argv_exec_path() {
   0.523 us [ 3389] |       getenv();
            [ 3389] |       system_path() {
   1.978 us [ 3389] |         __asprintf_chk();
   2.694 us [ 3389] |       } /* system_path */
   4.371 us [ 3389] |     } /* get_argv_exec_path */
            [ 3389] |     add_path.part.1() {
   1.180 us [ 3389] |       __asprintf_chk();
   0.319 us [ 3389] |       free();
   1.066 us [ 3389] |       __asprintf_chk();
   0.337 us [ 3389] |       free();
   5.001 us [ 3389] |     } /* add_path.part.1 */
            [ 3389] |     add_path.part.1() {
   1.137 us [ 3389] |       __asprintf_chk();
   0.349 us [ 3389] |       free();
   0.938 us [ 3389] |       __asprintf_chk();
   0.338 us [ 3389] |       free();
   4.458 us [ 3389] |     } /* add_path.part.1 */
   0.348 us [ 3389] |     free();
   2.741 us [ 3389] |     __asprintf_chk();
   0.324 us [ 3389] |     free();
   2.191 us [ 3389] |     setenv();
   0.337 us [ 3389] |     free();
  24.466 us [ 3389] |   } /* setup_path */
   2.137 us [ 3389] |   sigemptyset();
   1.500 us [ 3389] |   sigaddset();
   2.370 us [ 3389] |   pthread_sigmask();
            [ 3389] |   perf_debug_setup() {
   3.790 us [ 3389] |     libapi_set_print();
   4.583 us [ 3389] |   } /* perf_debug_setup */
   0.469 us [ 3389] |   strcmp();
   0.453 us [ 3389] |   strcmp();
   0.449 us [ 3389] |   strcmp();
            [ 3389] |   run_builtin() {
   0.313 us [ 3389] |     perf_config();
            [ 3389] |     perf_env__set_cmdline() {
   0.608 us [ 3389] |       calloc();
   1.435 us [ 3389] |     } /* perf_env__set_cmdline */
            [ 3389] |     cmd_config() {
   0.493 us [ 3389] |       getenv();
            [ 3389] |       mkpath() {
   3.860 us [ 3389] |         __vsnprintf_chk();
   0.375 us [ 3389] |         memcmp();
   5.580 us [ 3389] |       } /* mkpath */
            [ 3389] |       parse_options() {
            [ 3389] |         parse_options_subcommand() {
   1.930 us [ 3389] |           memmove();
   3.359 us [ 3389] |         } /* parse_options_subcommand */
   5.319 us [ 3389] |       } /* parse_options */
            [ 3389] |       perf_config_set__new() {
   0.420 us [ 3389] |         calloc();
            [ 3389] |         perf_config_set__init() {
   0.625 us [ 3389] |           getenv();
   3.655 us [ 3389] |           access();
   0.365 us [ 3389] |           getenv();
   0.507 us [ 3389] |           getenv();
            [ 3389] |           mkpath() {
   5.984 us [ 3389] |             __vsnprintf_chk();
   0.341 us [ 3389] |             memcmp();
   7.466 us [ 3389] |           } /* mkpath */
   0.597 us [ 3389] |           __strdup();
   2.324 us [ 3389] |           __xstat64();
   0.348 us [ 3389] |           free();
  19.461 us [ 3389] |         } /* perf_config_set__init */
   0.265 us [ 3389] |         perf_config_set__purge();
   0.344 us [ 3389] |         free();
  22.536 us [ 3389] |       } /* perf_config_set__new */
  37.679 us [ 3389] |     } /* cmd_config */
   0.260 us [ 3389] |     perf_config__exit();
   0.314 us [ 3389] |     exit_browser();
            [ 3389] |     perf_env__exit() {
   0.331 us [ 3389] |       free();
   0.308 us [ 3389] |       free();
   0.299 us [ 3389] |       free();
   0.299 us [ 3389] |       free();
   0.299 us [ 3389] |       free();
   0.300 us [ 3389] |       free();
   0.306 us [ 3389] |       free();
   0.357 us [ 3389] |       free();
   0.301 us [ 3389] |       free();
   0.300 us [ 3389] |       free();
   0.305 us [ 3389] |       free();
   0.300 us [ 3389] |       free();
   0.299 us [ 3389] |       free();
   0.483 us [ 3389] |       free();
  10.073 us [ 3389] |     } /* perf_env__exit */
            [ 3389] |     bpf__clear() {
   0.380 us [ 3389] |       bpf_object__next();
   0.244 us [ 3389] |       bpf_object__next();
   1.922 us [ 3389] |     } /* bpf__clear */
  67.868 us [ 3389] |   } /* run_builtin */
            [ 3389] |   exit() {

uftrace stopped tracing with remaining functions
===============================================
task: 3389
[1] exit
[0] main

[권욱제] perf call stack (filterd -D 4)

# DURATION    TID     FUNCTION
   8.733 us [ 3510] | __cxa_atexit();
            [ 3510] | symbol__init_regexpr() {
 103.706 us [ 3510] |   regcomp();
 105.659 us [ 3510] | } /* symbol__init_regexpr */
            [ 3510] | main() {
   2.816 us [ 3510] |   sysconf();
   4.756 us [ 3510] |   sysconf();
            [ 3510] |   sysctl__read_int() {
            [ 3510] |     procfs__mountpoint() {
  28.309 us [ 3510] |       fs__get_mountpoint();
  31.743 us [ 3510] |     } /* procfs__mountpoint */
   7.493 us [ 3510] |     __snprintf_chk();
            [ 3510] |     filename__read_int() {
  39.414 us [ 3510] |       open64();
  40.726 us [ 3510] |     } /* filename__read_int */
  83.759 us [ 3510] |   } /* sysctl__read_int */
            [ 3510] |   sysctl__read_int() {
   3.393 us [ 3510] |     __snprintf_chk();
            [ 3510] |     filename__read_int() {
  10.901 us [ 3510] |       open64();
  11.769 us [ 3510] |     } /* filename__read_int */
  17.161 us [ 3510] |   } /* sysctl__read_int */
            [ 3510] |   extract_argv0_path() {
   2.894 us [ 3510] |     __strndup();
   8.737 us [ 3510] |   } /* extract_argv0_path */
   3.649 us [ 3510] |   time();
   4.949 us [ 3510] |   srandom();
            [ 3510] |   perf_config__init() {
   1.407 us [ 3510] |     calloc();
            [ 3510] |     perf_config_set__init() {
   8.505 us [ 3510] |       system_path();
   6.143 us [ 3510] |       access();
   2.316 us [ 3510] |       getenv();
   8.842 us [ 3510] |       mkpath();
   1.747 us [ 3510] |       __strdup();
   3.220 us [ 3510] |       __xstat64();
   1.258 us [ 3510] |       free();
  41.949 us [ 3510] |     } /* perf_config_set__init */
   3.657 us [ 3510] |     perf_config_set__delete();
  50.730 us [ 3510] |   } /* perf_config__init */
            [ 3510] |   set_buildid_dir() {
   2.571 us [ 3510] |     __snprintf_chk();
   6.995 us [ 3510] |     setenv();
  15.830 us [ 3510] |   } /* set_buildid_dir */
            [ 3510] |   tracing_path_mount() {
            [ 3510] |     tracefs__mount() {
 194.753 us [ 3510] |       fs__get_mountpoint();
   6.787 us [ 3510] |       mount_overload.isra.0();
  11.988 us [ 3510] |       mount();
 218.161 us [ 3510] |     } /* tracefs__mount */
            [ 3510] |     debugfs__mount() {
   4.702 us [ 3510] |       fs__get_mountpoint();
   5.522 us [ 3510] |     } /* debugfs__mount */
   9.871 us [ 3510] |     snprintf();
   9.076 us [ 3510] |     __snprintf_chk();
   6.565 us [ 3510] |     __snprintf_chk();
 252.533 us [ 3510] |   } /* tracing_path_mount */
   4.689 us [ 3510] |   test_attr__init();
            [ 3510] |   setup_path() {
            [ 3510] |     get_argv_exec_path() {
   2.181 us [ 3510] |       system_path();
   4.128 us [ 3510] |     } /* get_argv_exec_path */
            [ 3510] |     add_path.part.1() {
   1.174 us [ 3510] |       __asprintf_chk();
   1.092 us [ 3510] |       __asprintf_chk();
   5.260 us [ 3510] |     } /* add_path.part.1 */
            [ 3510] |     add_path.part.1() {
   1.162 us [ 3510] |       __asprintf_chk();
   1.022 us [ 3510] |       __asprintf_chk();
   4.755 us [ 3510] |     } /* add_path.part.1 */
   2.601 us [ 3510] |     __asprintf_chk();
   1.936 us [ 3510] |     setenv();
  24.081 us [ 3510] |   } /* setup_path */
   2.292 us [ 3510] |   sigemptyset();
   1.609 us [ 3510] |   sigaddset();
   2.394 us [ 3510] |   pthread_sigmask();
            [ 3510] |   perf_debug_setup() {
   3.177 us [ 3510] |     libapi_set_print();
   4.092 us [ 3510] |   } /* perf_debug_setup */
            [ 3510] |   run_builtin() {
   1.419 us [ 3510] |     perf_env__set_cmdline();
            [ 3510] |     cmd_config() {
   4.779 us [ 3510] |       mkpath();
   3.674 us [ 3510] |       parse_options();
  15.222 us [ 3510] |       perf_config_set__new();
  43.301 us [ 3510] |     } /* cmd_config */
   9.116 us [ 3510] |     perf_env__exit();
   1.690 us [ 3510] |     bpf__clear();
  72.490 us [ 3510] |   } /* run_builtin */
            [ 3510] |   exit() {

uftrace stopped tracing with remaining functions
===============================================
task: 3510
[1] exit
[0] main

[KOSSHACKATHON - perf(linux) 팀] 9/25 공지

안녕하세요 ^^

KOSSHACKATHON perf프로젝트 맡고있는 송태웅입니다.
오전까지 공지드린다고 했는데 좀 늦었습니다.

어제 perf간단한 소개와 perf실습과정, PATCH절차과정을
보여드리는 내용만 해보았는데요.
여러분들이 하셔야할 월요일에 만나기 전까지의 미션이 있습니다.

  1. linux환경 세팅 (배포판 무관)
  • 가상환경이 필요하시면 VirtualBox등을 활용하면 될것같습니다.
  1. perf공식 repo 리눅스커널 소스 받기

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git

  1. perf 컴파일 해놓기
    리눅스커널소스에서 tools/perf 경로로 이동해서
    make만 하시면 컴파일이 되는데 필요한 라이브러리가 있을수있습니다.

$ sudo apt-get install -y libdw-dev libelf-dev libnewt-dev libunwind8-dev elfutils libaudit-dev libperl-dev libnuma-dev binutils-dev flex bison libpython2.7-dev asciidoc liblzma-dev libiberty-dev libgtk2.0-dev libssl-dev

이정도 있는데 배포판이 다르면 패키지명이 좀 다를수있습니다.
이건 make과정에서 오류메시지로 무슨 라이브러리가 없는지 알려줍니다.

만약에 perf 소스만 리눅스커널 소스내부에서 추출하고 싶으면
linux 커널 소스 들어가서 tools/perf/로 경로 옴기지마시고
가장 상위 디렉토리에서
$ make perf-targz-src-pkg
라고 명령입력하시면 됩니다. 위의 사항은
$ make help
를 통해서도 살펴볼수 있습니다.

  1. git 설치해두기 (리눅스 내부에)
    $ sudo apt-get install git

  2. git 간단하게 실습해보기 (3개중 아무거나, git을 아시면 안하셔도됩니다.)

https://try.github.io/levels/1/challenges/1
http://learnbranch.urigit.com/

아니면 이걸로 월요일에 어차피 실습해보려고하는데
https://github.com/taeung/git-training

tutorial v3, example code v2
받아서 basic 실습내용만 조금 진행해보면 좋을것같습니다.

오프라인 만남은
9/26(저녁 7시), 9/29(저녁 6시)
로 정해졌고요. 아마 2일 모두 식사를 함께 할비용이 될것같습니다. ^^
시간은 함께 저녁먹고 2~3시간 정도하는걸로 보면 될것같습니다.
(장소는 선릉역아니면 강남역인데 단톡방으로 따로 공지하겠습니다.)

월요일은 각자 실습환경 구축된 상태에서 시작해서
perf실습, git실습, 다른개발자의 commit 리뷰하기 정도를 해볼수 있을것같습니다.
그리고 미션수행할거 또 내드리도록할께요. 각자 실력에 맞춰서 병렬적으로 진행하는게
더 효율적일것같아서 git을 아시는분들은 따로 다른작업도 진행할수 있도록 도와드릴께요.

혹시 질문있으면 이슈 많이 남겨주세요.

감사합니다
송태웅 드림

[조성수] perf 컴파일 및 개발환경 구축

  1. linux환경 세팅 (배포판 무관)
  • 가상환경이 필요하시면 VirtualBox등을 활용하면 될것같습니다.
  1. perf공식 repo 리눅스커널 소스 받기

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git

  1. perf 컴파일 해놓기
    리눅스커널소스에서 tools/perf 경로로 이동해서
    make만 하시면 컴파일이 되는데 필요한 라이브러리가 있을수있습니다.

$ sudo apt-get install -y libdw-dev libelf-dev libnewt-dev libunwind8-dev elfutils libaudit-dev libperl-dev libnuma-dev binutils-dev flex bison libpython2.7-dev asciidoc liblzma-dev libiberty-dev libgtk2.0-dev libssl-dev

이정도 있는데 배포판이 다르면 패키지명이 좀 다를수있습니다.
이건 make과정에서 오류메시지로 무슨 라이브러리가 없는지 알려줍니다.

만약에 perf 소스만 리눅스커널 소스내부에서 추출하고 싶으면
linux 커널 소스 들어가서 tools/perf/로 경로 옴기지마시고
가장 상위 디렉토리에서
$ make perf-targz-src-pkg
라고 명령입력하시면 됩니다. 위의 사항은
$ make help
를 통해서도 살펴볼수 있습니다.

  1. git 설치해두기 (리눅스 내부에)
    $ sudo apt-get install git

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.