kosslab-kr / linux-perf Goto Github PK
View Code? Open in Web Editor NEWThis project forked from taeung/linux
:rocket: perf contribution (mirrored from git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git)
License: Other
This project forked from taeung/linux
:rocket: perf contribution (mirrored from git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git)
License: Other
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
# 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
$ 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
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
# 자주사용되는것
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).
각자 마일스톤을 생성하고
이름: 이슈제목 으로만 이슈내용없이 생성해서 본인 마일스톤에 연결해서 진행하면 됩니다.
완료할시에는 close하면 되고 Issues 탭의 Milestones를 누르면 진행상황%를 확인할수있습니다.
예시)
김선영: 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가 실행되는 과정분석
...
Issues 탭에 Milestones로 들어가서 New Milestone 버튼 누르고 생성
마감기간은 9/30로 제목은 본인 이름으로 설정
본인이 생성한 이슈를 열고 오른쪽 부분에 마일스톤을 연결지읍시다.
설치확인
$ ctags -help
설치
$ sudo apt-get install ctags
원하는 파일만 생성
$ ctags file1
혹은 $ ctags file1 file2 file3 ...
모든 파일에 대해 생성
$ ctags -R
tags
파일이 생성되는 것을 볼 수 있음.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
// 다시 이전 위치로(점프해서 들어오기 전 위치로) 점프
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로 점프 |
빠르게 작성하느라 친절하지 못한 글이 돼버렸네요... 곧 수정하겠습니다
http://www.brendangregg.com/perf.html
http://egloos.zum.com/studyfoss/v/5636485
http://sandsoftwaresound.net/perf/
https://perf.wiki.kernel.org/index.php/Tutorial
http://blog.2ndquadrant.com/tracing-postgresql-perf/
http://events.linuxfoundation.org/sites/events/files/lcjp13_takata.pdf
Git 기본 명령(add, commit, push) 학습
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git
$ 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
를 통해서도 살펴볼수 있습니다.
$ sudo apt-get install git
이전에 제가 만든 간단한 PATCH내용을 이해해보고 동일한 시나리오로
저에게 PATCH를 보내어 봅시다.
perf의 기능을 다양하게 활용하는 실습시간을 갖습니다.
이전 글에 uftrace같은걸 활용한것처럼 perf의 소스를 다같이 분석해보도록 합시다.
시간이 허락한다면 report기능이 진행되는과정도 uftrace나 ctags, cscope을 통해서 분석해볼 예정입니다.
버추얼 박스 이용하여 Ubuntu 14.04 설치하고 컴파일 및 개발환경 구축 완료
이전에 제가 만든 간단한 PATCH내용을 이해해보고 동일한 시나리오로
저에게 PATCH를 보내어 봅시다.
perf의 기능을 다양하게 활용하는 실습시간을 갖습니다.
이전 글에 uftrace같은걸 활용한것처럼 perf의 소스를 다같이 분석해보도록 합시다.
시간이 허락한다면 report기능이 진행되는과정도 uftrace나 ctags, cscope을 통해서 분석해볼 예정입니다.
http://bowbowbow.tistory.com/15
uftrace 라는걸 활용하면 함수가 call되는 과정을 살펴보기가 좋습니다.
소스 읽고계신분도 있어서 간단하게만 활용법 보여드립니다.
https://github.com/namhyung/uftrace/wiki#quick-install
$ cd tools/perf
$ make clean
$ make -j4 EXTRA_CFLAGS=-pg
(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
(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 */
https://github.com/namhyung/uftrace/blob/master/doc/uftrace-record.md
필터링 없이 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
성능에 문제가 있는 소스 다운로드
성능을 개선한 소스 다운로드
테스트 스크립트 test.sh 다운로드
#2 를 따라서 진행하고 있는데
perf binary가 있는 경로가 /usr/local/bin/perf에도 없고 다른 폴더에서도 찾기 힘드네요...
https://try.github.io/levels/1/challenges/1
위 사이트에서 학습
perf 기본실습
perf소스 중 config --list가 실행되는 과정분석
perf 실습 (QuickStart)
# 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프로젝트 맡고있는 송태웅입니다.
오전까지 공지드린다고 했는데 좀 늦었습니다.
어제 perf간단한 소개와 perf실습과정, PATCH절차과정을
보여드리는 내용만 해보았는데요.
여러분들이 하셔야할 월요일에 만나기 전까지의 미션이 있습니다.
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git
$ 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
를 통해서도 살펴볼수 있습니다.
git 설치해두기 (리눅스 내부에)
$ sudo apt-get install git
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을 아시는분들은 따로 다른작업도 진행할수 있도록 도와드릴께요.
혹시 질문있으면 이슈 많이 남겨주세요.
감사합니다
송태웅 드림
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git
$ 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
를 통해서도 살펴볼수 있습니다.
$ sudo apt-get install git
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.