Linux ftrace 및 perf_events("perf" 명령이라고도 함)용으로 개발 중이면서 지원되지 않는 성능 분석 도구의 기타 컬렉션입니다. ftrace와 perf는 모두 커널 소스에 포함된 핵심 Linux 추적 도구입니다. 시스템에 이미 ftrace가 있을 수 있으며 perf는 단순히 패키지 추가인 경우가 많습니다(전제 조건 참조).
이러한 도구는 설치가 쉽고(종속성이 가장 적음) 고급 성능 관찰 기능을 제공하며 사용이 간편하도록 설계되었습니다. 즉, 한 가지 작업만 잘 수행하면 됩니다. 이 컬렉션은 Brendan Gregg(DTraceToolkit 작성자)가 만들었습니다.
이러한 도구 중 다수는 기존 Linux 커널에서 기능이 가능하도록 해결 방법을 사용합니다. 이 때문에 많은 도구에는 주의 사항이 있으며(man 페이지 참조) 해당 구현은 향후 커널 기능이나 새로운 추적 하위 시스템이 추가될 때까지 자리 표시자로 간주되어야 합니다.
이는 Linux 3.2 및 최신 커널용입니다. Linux 2.6.x의 경우 경고를 참조하세요.
이러한 도구는 USENIX LISA 2014 프레젠테이션에서 소개되었습니다. Linux 성능 분석: 새로운 도구 및 오래된 비밀
ftrace 사용:
perf_events 사용:
eBPF 사용:
새로운 프로세스 및 인수 표시:
# ./execsnoop exec() 추적. 종료하려면 Ctrl-C를 누르세요. PID PPID ARGS 22898 22004 남자 ls 22905 22898 preconv -e UTF-8 22908 22898 호출기 -s 22907 22898 nroff -mandoc -rLL=164n -rLT=164n -Tutf8 22906 22898테이블 22911 22910 로캘 참맵 22912 22907 groff -mtty-char -Tutf8 -mandoc -rLL=164n -rLT=164n 22913 22912 troff -mtty-char -mandoc -rLL=164n -rLT=164n -Tutf8 22914 22912 심술궂은
대기열 삽입부터 완료까지 블록 장치 I/O 대기 시간 측정:
# ./iolatency -Q 블록 I/O를 추적합니다. 1초마다 출력합니다. 종료하려면 Ctrl-C를 누르세요. >=(ms) .. <(ms) : I/O |분포 | 0 -> 1 : 1913 |###################################| 1 -> 2 : 438 |######### | 2 -> 4 : 100 |## | 4 -> 8 : 145 |### | 8 -> 16 : 43 |# | 16 -> 32 : 43 |# | 32 -> 64 : 1 |# | [...]
커널 스택 추적을 사용하여 읽기 전용으로 block:block_rq_insert 추적점 추적:
# ./tpoint -s 블록:block_rq_insert 'rwbs ~ "*R*"' cksum-11908 [000] d... 7269839.919098: block_rq_insert: 202,1 R 0 () 736560 + 136 [cksum] cksum-11908 [000] d... 7269839.919107: => __elv_add_request => blk_flush_plug_list => blk_finish_plug => __do_page_cache_readahead => ondemand_readahead => page_cache_async_readahead => generic_file_read_iter => new_sync_read => vfs_read => SyS_read => system_call_fastpath [...]
"bio_"로 시작하는 커널 함수 호출을 계산하고 매초 요약합니다.
# ./funccount -i 1 'bio_*' "bio_*" 추적 중... Ctrl-C를 눌러 종료합니다. 기능 개수 bio_attempt_back_merge 26 bio_get_nr_vecs 361 bio_alloc 536 bio_alloc_bioset 536 bio_endio 536 바이오 프리 536 bio_fs_destructor 536 bio_init 536 bio_integrity_enabled 536 bio_put 729 bio_add_page 1004 [...]
예제 디렉터리에는 더 많은 예제가 있습니다. 매뉴얼 페이지도 참조하십시오.
의도는 가능한 한 적습니다. 예를 들어 debuginfo가 없는 Linux 3.2 서버입니다. 자세한 내용은 도구 매뉴얼 페이지를 참조하십시오.
커널에 FTRACE가 구성되었습니다. FTRACE가 2.6.27에 처음 추가되었으므로 커널 버전에서 이미 이를 구성하고 사용할 수 있습니다. 이를 위해서는 도구에 따라 CONFIG_FTRACE 및 기타 FTRACE 옵션이 필요합니다. 일부 도구(예: funccount)에는 CONFIG_FUNCTION_PROFILER가 필요합니다.
"perf" 명령을 설치해야 합니다. 이는 linux-tools-common 패키지에 있습니다. 이를 설치한 후 perf는 추가 linux-tools 패키지(linux-tools -kernel_version )를 설치하라고 지시할 수 있습니다. perf는 커널 소스의 tools/perf 아래에 구축될 수도 있습니다. perf_events가 완전히 작동하도록 하는 방법에 대한 자세한 내용은 perf_events 전제 조건을 참조하세요.
CONFIG_DEBUG_FS 옵션이 활성화된 커널이 필요합니다. FTRACE와 마찬가지로 이는 이미 활성화되어 있을 수 있습니다(debugfs는 2.6.10-rc3에 추가되었습니다). debugfs도 마운트해야 합니다:
# mount -t debugfs none /sys/kernel/debug
많은 스크립트가 awk를 사용하며 원하는 동작에 따라 mawk 또는 gawk를 사용하려고 시도합니다. 버퍼링된 출력에는 mawk(속도 때문에), 동기 출력에는 gawk(fflush()가 작동하므로 더 효율적인 그룹화 가능) 쓴다).
이것은 단지 스크립트일 뿐입니다. 모든 것을 잡으십시오.
git clone --depth 1 https://github.com/brendangregg/perf-tools
또는 github의 원시 링크를 사용하여 개별 스크립트를 다운로드하세요. 예:
wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/iosnoop
이렇게 하면 탭이 보존됩니다(복사하여 붙여넣기로 인해 문제가 발생할 수 있음).
Ftrace는 Linux 2.6.27에 처음 추가되었고 perf_events는 Linux 2.6.31에 추가되었습니다. 이러한 초기 버전에는 커널 버그가 있었으며 2.6.32 시리즈 커널에서 작동 중지 및 패닉이 보고되었습니다. 여기에는 CentOS 6.x가 포함됩니다. 이전 커널을 분석해야 하는 경우 이러한 도구는 시뮬레이션된 문제가 있는 실험실과 같은 내결함성 환경에서만 유용할 수 있습니다. 이러한 도구는 주로 Linux 3.2 이상의 커널에서 개발되었습니다.
도구에 따라 오버헤드가 발생할 수도 있습니다. 다음 섹션을 참조하세요.
perf_events는 진화하고 있습니다. 이 컬렉션은 perf_events에 특정 프로그래밍 기능(예: 사용자 정의 커널 내 집계)이 부족할 때 Linux 3.2 서버를 주요 대상으로 하는 Linux 3.16 경에 개발을 시작했습니다. 이는 향후 커널 릴리스에 추가될 가능성이 있습니다. 그때까지 이러한 도구 중 다수는 작동하기 위해 해결 방법, 요령 및 해킹을 사용합니다. 이러한 도구 중 일부는 사후 처리를 위해 이벤트 데이터를 사용자 공간에 전달하는데, 이는 커널 내 집계보다 훨씬 높은 오버헤드를 발생시킵니다. 각 도구의 오버헤드는 매뉴얼 페이지에 설명되어 있습니다.
경고 : 극단적인 경우, 이러한 도구를 사용할 때 대상 응용 프로그램이 5배 느리게 실행될 수 있습니다. 도구 및 커널 버전에 따라 커널 패닉이 발생할 위험이 있을 수도 있습니다. 프로그램 헤더에서 경고를 읽고 사용하기 전에 테스트하십시오.
오버헤드가 문제인 경우 이러한 도구를 개선할 수 있습니다. 도구가 아직 없는 경우 추적 버퍼에 perf_events_open() 및 mmap()을 사용하도록 C로 다시 작성할 수 있습니다. 또한 awk/Perl/Python을 사용하는 대신 C로 빈도 수를 구현하고 mmap()에서 직접 작동할 수도 있습니다. 스냅샷 및 인스턴스별 버퍼 사용과 같은 ftrace 기반 도구에 대한 추가 개선이 가능합니다.
이러한 도구 중 일부는 더 많은 커널 기능이 존재하여 실질적으로 다시 작성될 수 있을 때까지 단기적인 해결 방법으로 고안되었습니다. 이전 커널 버전의 경우 이러한 도구의 이전 버전이 이 저장소에 보관됩니다.
나의 주요 목표는 debuginfo가 없는 일련의 Linux 3.2 서버이므로 이러한 도구에서는 이를 요구하지 않으려고 합니다. debuginfo 정보(일반적일 수 있음)를 사용하는 대신 해결 방법(커널 버전 및 플랫폼별일 수 있음)을 사용하므로 이로 인해 도구가 필요 이상으로 취약해집니다. 각 도구에 대한 자세한 전제 조건은 매뉴얼 페이지를 참조하십시오.
해당 인터페이스는 다중 사용자용으로 개발되었기 때문에 가능한 경우 perf_events("perf")를 사용하려고 했습니다. 여러 가지 이유로 나는 종종 ftrace를 대신 사용해야 했습니다. ftrace는 놀랍도록 강력하며(Steven Rostedt에게 감사드립니다!) 모든 기능이 성능이나 일반적인 사용을 통해 노출되는 것은 아닙니다. 이 도구 모음은 어떤 면에서는 ftrace를 사용하는 숨겨진 Linux 기능을 보여줍니다.
상황이 변하고 있기 때문에 일부 도구가 Linux 커널 버전에서 작동하지 않을 수도 있습니다. 문제를 해결하려면 약간의 전문 지식과 조립이 필요합니다.
사례 연구 및 요약:
관련 기사: