리눅스 성능 튜닝 전투 : 케이스 서류 - 어떻게 동적 추적을 사용하려면? (저급) (51)

첫 번째 섹션 리뷰

하나, 나는 당신이 일반적인 동적 추적 방법을 배울 가져왔다. 시스템 또는 응용 프로그램까지 프로브에 의해 실행 커널을 제공 할 때 소위 동적 추적, 즉, 동적, 자신의 행동을 추적
문제 해결 성능 문제가 병목 지원하기 위해.

서비스를 다시 시작하지, 코드를 수정하지 않고 할 수있는 동적 추적을 사용하면 문제가 특히 효과적이다 재현 특히 쉽지 않은 응용 프로그램이나 커널의 동적 거동, 조사 문제의이 라인을 이해합니다.

리눅스 시스템에서 일반적인 동적 추적 방법 등 ftrace, 퍼포 레이션, eBPF에서 SystemTap 등이 포함됩니다. 마지막으로, 우리가 사용하는 특정 ftrace을 배웠습니다. 오늘, 우리는 함께 여러 가지 다른 방법을 살펴 봅니다.

두, 반환 한

이미 반환 한 우리의 오랜 친구. 이전의 경우, 우리는 성능 병목 현상을 찾을 수있는 응용 프로그램이나 커널 핫스팟 기능을 찾기 위해 많은 시간을 사용합니다. 그리고 높은 CPU의 경우와 커널 스레드에, 우리는 또한 동적 화염 보여주는 다이어그램 사용
문제를 찾기 위해 이벤트 레코드 반환 한을, 따라서보다 직관적입니다.

우리가 반환 한 기록 / 사용하지만, 정상 각 함수 호출의 빈도를 평가하는 샘플의 개수에 기초하여 그 사건을 샘플링하는 제 한 경우. 사실, 퍼포 레이션은 그보다 훨씬 더 많은 일을 할 수 있습니다. 예를 들어,

  • 퍼포 레이션은 CPU 캐시, CPU 마이그레이션, 분기 예측, 명령어 사이클 이벤트 및 다른 하드웨어를 분석하는데 사용될 수있다;
  • 반환 한 또한 이벤트에 관심은 동적 추적 있습니다합니다.

도 1은 사용 트래킹을 동적 PERF

반환 한 동적 추적을 사용에서 다음, 우리는 여전히 기능 do_sys_open뿐만 아니라 사용자 공간 기능의 readline 커널 된, 예를 들어보십시오.

ftrace처럼, 당신은 지원되는 모든 이벤트도 반환 한 목록을 조회 할 수 있습니다 :

반환 한 목록

그런 다음 하위 반환 한 명령의 각 - 행사 옵션을 추가 관심의 트랙 이벤트를 설정합니다. 이러한 미리 정의 된 이벤트가 실제 요구 사항을 충족하지 않는 경우, 당신은 또한 동적으로 추가 반환 한 프로브를 사용할 수 있습니다. 또한, 외부 커널 이벤트를 추적뿐만 아니라,
를 성능 기능은 사용자 공간을 추적하는 데 사용할 수 있습니다.

첫 번째 예제의이 반환 한, 커널 함수 do_sys_open 예를 살펴 보자. 당신은 반환 한 프로브 명령을 실행 do_sys_open 프로브를 추가 할 수 있습니다 :

반환 한 프로브는 do_sys_open --add 
새 이벤트를 추가 : 
  프로브 : (do_sys_open에) do_sys_open이 
: 이제 같은 모든 반환 한 도구에서 사용할 수 있습니다 
    기록 -e 프로브를 규칙적 : -ar 잠 1 do_sys_open

프로브가 성공적으로 추가 한 후에는 모든 하위 반환 한 명령에서 사용할 수 있습니다. 예를 들어, 출력이 반환 한 레코드의 일례이며, 이것은 샘플링 do_sys_open (10S) 내에서 수행 될 수있다 :

퍼포 레코드 -e 프로브 do_sys_open -Ar 슬립 10 
[기록 퍼포 : 깨우 1 회 데이터를 기입하기] 
[레코드를 규칙적은 : 0.148 MB perf.data를 캡처 쓴 (19 개 샘플)]

샘플링이 성공 후, 당신은 샘플링의 결과를보고, 반환 한 스크립트를 수행 할 수 있습니다 :

퍼포 스크립트 
            12,886 [000] 89565.879875 퍼포 : 프로브 do_sys_open (ffffffffa807b290) 
           잠 12,889 [000] 89565.880362 : 프로브 do_sys_open (ffffffffa807b290) 
           잠 12,889 [000] 89565.880382 : 프로브 do_sys_open (ffffffffa807b290) 
           잠 12,889 [000] 89565.880635 : 프로브 do_sys_open (ffffffffa807b290)은 
           12,889 [000] 89565.880669 잠 : 프로브 do_sys_open (ffffffffa807b290)

코드의 실제 설치 :

루트 @의 luoahong ~] 목록 퍼포 레이션 # 

미리 정의 된 이벤트 목록 (-e에서 사용되는) : 

  정렬 폴트 [소프트웨어 
  BPF 출력 [소프트웨어 
  컨텍스트 스위치 또는 CS [소프트웨어 
  CPU 클럭 [소프트웨어 
  
  
[루트 @의 luoahong ~ ] 프로브 반환 한 #이 do_sys_open --add 
새 이벤트를 추가 : 
  프로브 : (do_sys_open에) do_sys_open 

: 이제 같은 모든 반환 한 도구에서 사용할 수 있습니다 

	기록 -e 프로브를 규칙적 : -ar 잠 1 do_sys_open 


[루트 @의 luoahong를 ~] # 퍼포 레코드 -e 프로브 do_sys_open -Ar 슬립 10 
[기록 퍼포 : 깨우 1 회 데이터를 기입]
[레코드를 규칙적 : 촬영 및 0.153 MB perf.data을 썼다 (7 개 샘플)] 
[루트 @의 luoahong ~] #의 반환 한 스크립트 
            10,318 [001] 3749.316261 반환 한 : 프로브 : do_sys_open : (ffffffff8129f030) 
           잠 10319 [000] 3749.317116 : 프로브 : do_sys_open (ffffffff8129f030) 
           10,319 [000] 3749.317130 잠 : 프로브 do_sys_open (ffffffff8129f030) 
           잠 10,319 [000] 3749.317753 : 프로브 do_sys_open (ffffffff8129f030)는 
         systemd 1 [001] 3752.144923 : 프로브 do_sys_open (ffffffff8129f030) 
      irqbalance 7772 [001 ] 3753.567150 : 프로브 do_sys_open (ffffffff8129f030) 
      irqbalance 7772 [001] 3753.567501 : 프로브 do_sys_open (ffffffff8129f030)

출력은 또한 do_sys_open 호출 작업 이름을 나열 같은 PID 및 CPU 실행 정보로 처리합니다. 그러나, 개방형 시스템이 호출되었으며 충분하지, 우리가 알 필요가 유일한 것으로, 호출 것은 그 끝에서 재생하는 프로세스
어떤 파일을 열어. 따라서, 실제 응용 프로그램, 우리는 또한 추적이 함수의 매개 변수를 보여주고 싶어요.

커널 함수를 들어, 당신은 확실히 모든 매개 변수를 찾기 위해, 커널 소스를보고 갈 수 있습니다. 그러나 디버그 심볼 테이블에서 직접 쿼리입니다 쉬운 방법이있다. 다음 명령을 실행, 모든 매개 변수가 do_sys_open 알 수 있습니다 :

do_sys_open -V 퍼포 프로브 
do_sys_open 이용 가능한 변수 
        @ <do_sys_open + 0> 
                문자 * 파일명 
                INT의 DFD의 
                INT 플래그 
                구조체 open_flags OP 
                umode_t 모드

2, 설치 시도 후

여기에서 볼 수 있듯이, 우리가 관심을 파일 경로는 첫 번째 문자 포인터 매개 변수 (예 : 문자열), 파일 이름에 대한 매개 변수의 이름입니다. 이 명령이 실패하면 디버그 심볼 테이블이 아직 설치되지 않은 보여줍니다. 글쎄, 당신은 다음 실행할 수 있습니다
설치 시도 후 명령을 :

# 우분투 
$ apt-get을 설치 리눅스 이미지 `uname -r`-dbgsym 
# CentOS는 
$ 냠 --enablerepo = 기초 따라서 debuginfo -y 커널 따라서 debuginfo를 설치 - $ (UNAME -r)

매개 변수 이름 및 유형을 식별, 매개 변수는 프로브에 추가 할 수 있습니다. 우리는 같은 이름의 프로브를 추가했습니다, 그래서 내가 전에이를 추가하기 때문에, 우리는 먼저 이전 프로브를 삭제해야합니다 :

# 기존의 프로브를 삭제 
프로브는 프로브를 --del PERF : do_sys_open 

# 매개 변수를 프로브 추가 
$를 프로브가 '파일 이름을 do_sys_open : 문자열'--add PERF 
: 새로운 새로운 이벤트 추가 
  : (문자열 파일 이름으로 do_sys_open ON) do_sys_open : 프로브를 
귀하가 같은 모든 현재 사용중인 IT는 PERF 수있는 도구 : 
    를 성능이 기록은 프로브 -e : -ar SLEEP 1 do_sys_open

새로운 프로브, 다시 실행 기록 및 하위 명령 스크립트, 샘플링 및보기 레코드를 추가 한 후 :

#의 리샘플링 기록 
-ar은 LS do_sys_open : 녹화를 성능 $는 프로브 -e 

결과 #보기 
$ 스크립트를 성능 
            프로브 : do_sys_open :를 성능 13593 [000] 91846.053622 (ffffffffa807b290)를 filename_string = "/ proc 디렉토리 / 13596 / 상태" 
              LS 13596 [000] 91846.053995 : 프로브 do_sys_open (ffffffffa807b290) filename_string = "은 / etc / ld.so.cache" 
              LS 13,596 [000] 91846.054011 : 프로브 do_sys_open (ffffffffa807b290) filename_string = "/ LIB /를 x86_64에-리눅스 GNU / libselinux.so 0.1 " 
              LS 13596 [000] 91846.054066 : 프로브 : do_sys_open : (ffffffffa807b290) filename_string ="/ lib에 GNU 리눅스 / libc.so.6으로 "/ - (가) x86_64에 
              ... 
#은 프로브 완료하는 데 사용 후 제거하는 것을 잊지 마십시오 
$의 반환 한 프로브를 --del 프로브 : do_sys_open

지금, 당신은 당신이 파일 열기 전화를 열 때마다 볼 수 있습니다. 그러나이 결과는 잘 알고 찾고되지 않는 이유는 무엇입니까?

사실, 때 우리는 strace를를 사용하는 시스템은 호출하는 과정을 추적 할 수 있지만, 종종 이러한 동적 라이브러리의 그림자를 참조하십시오. 추적 strace를 1!을 사용하는 경우 예를 들어, 다음과 같은 결과를 얻을 수 있습니다 :

strace를 1! 
... 
액세스 ( "을 / etc / ld.so.nohwcap", F_OK) = -1 ENOENT (해당 파일 또는 디렉토리) 
액세스 ( "을 / etc / ld.so.preload", R_OK) = -1 ENOENT (해당 파일 또는 디렉토리) 
openat (AT_FDCWD, "/etc/ld.so.cache를", O_RDONLY | O_CLOEXEC) = 3 
... 
액세스 ( "을 / etc / ld.so.nohwcap"F_OK) = -1 ENOENT (해당 파일 또는 디렉토리) 
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY | O_CLOEXEC) = 3 
...

당신은 strace를 비슷한 결과를 얻을 수 있기 때문에 왜 우리가 그것을 사용해야를 규칙적 차례로, 작동하기 쉬운, 예상하려면?

strace를 비슷한 결과를 얻을 수 있기 때문에 왜 우리가 그것을 사용해야를 규칙적 3 차례, 작동하기 쉬운?

사실, 많은 사람들은 사용하기 쉬운의 strace의 혜택을 볼 수 있지만, 자신의 프로세스 성능의 영향을 무시했다. 두 가지 질문이 나타납니다 원칙적으로, strace를 기반으로 시스템 호출의 ptrace의 구현입니다.

  • 의 ptrace 시스템 콜 때문에, 커널 모드와 사용자 모드를 전환 할 필요가있다. 오랜 시간 동안 이벤트의 수를 비교하면, 바쁜 전환은 기존 서비스의 성능에 영향을 미칠 수밖에;
  • 의 ptrace은 SIGSTOP 신호의 도움을 대상 프로세스를 중단해야합니다. 이 신호 제어 프로세스가 중단은, 상기 대상 프로세스의 동작에 영향을 미칠 것이다.

그래서, (데이터베이스 같은) 성능에 민감한 애플리케이션에서, 나는 당신이 문제를 해결하고 디버그 할 수 strace를 (또는 기타 성능 기반의 ptrace 도구)를 사용하지 않는 것이 좋습니다.

strace를에서 영감을 커널에 통합 utrace 메커니즘은 반환 한 또한, 추적 하위 명령을 제공 strace를 대체 할 선택의 도구입니다. 의 ptrace 메커니즘 상대가 반환 한 추적 추적의 자연적인 과정보다, 이벤트 커널을 기반으로
더 나은 성능을.

반환 한 사실은 매우 비슷하게 strace를 함께, 방법은 다음과 같이 사용하여 추적 :

반환 한 추적 LS 
         ? () : LS / 14,234 ... [계속]을 execve ()) = 0 
     0.177 (0.013 MS) : LS / 14,234 BRK () 0x555d96be7000 = 
     0.224 (0.014 MS) : LS / 14,234 접속 (파일명 : 0xad98082) = - 1 ENOENT 그러한 파일이 없습니다 또는 디렉터리 
     0.248 (0.009 밀리 초) : LS / 14,234 액세스 (파일 이름 : 0xad9add0 모드 : R) = -1 ENOENT 해당 파일이나 디렉토리 
     0.267 (0.012 밀리 초) : LS / 14,234 openat (DFD : CWD는, 파일명 : 0xad98428 플래그 : CLOEXEC) = (3)  
     LS / 14,234 함수 fstat (FD : 3 </usr/lib/locale/C.UTF-8/LC_NAME> statbuf : 0.288 (0.009 MS)를 0x7ffd2015f230) = 0
     0.305 (0.011 MS) : LS / 14,234의 mmap (LEN : 45,560, PROT : READ, 플래그 : 비공개 (FD) : 3) = 0x7efe0af92000 
     0.324 Dockerfile의 test.sh
(0.008 MS) : LS / 14,234 확대 (FD : 3 </usr/lib/locale/C.UTF-8/LC_NAME>) = 0 
     ...

다음과 같이 실제 테스트 코드는 다음과 같습니다

[루트 @의 luoahong ~] #의 반환 한 추적 LS 
         ? (?) : LS / 10348 ... [계속]을 execve ()) = 0 
     0.386 (0.049 MS) : LS / 10348 BRK () 0xae0000 = 
     0.610 (0.090 MS) : LS / 10,348의 mmap (LEN : 4096, PROT | : WRITE, 플래그를 읽을 : PRIVATE | 익명) = 0x7fe83213c000 
     ) 0.755 (0.048 MS : LS / 10,348 액세스 (파일 이름 : 0x31f3abd0 모드 : R)을 = -1 ENOENT 해당 파일이나 디렉토리 
     0.847 (0.052 밀리 초) : LS를 / 10348 오픈 (파일명 : 0x31f394c4 플래그 : CLOEXEC) = (3) 
     0.947 (0.042 MS) : LS / 10348 함수 fstat (FD : 3 </usr/lib64/libpthread-2.17.so> statbuf : 0x7fff6a5b9360) = 0
     1.036 (0.049 MS) : LS / 10,348의 mmap (렌 : 33764, PROT : READ, 플래그 : PRIVATE (FD) : 3) = 0x7fe832133000 
     1.394 (0.047 MS) : LS / 10348 확대 (FD : 3 </ USR / lib64에 / 점 libpthread -2.17.so>) = 0 
     1.500 (0.053 MS) : LS / 10348 오픈 (파일명 : 0x3213c640 플래그 : CLOEXEC) = (3) 
     1.599 (0.082 MS) : LS / 10348 리드 (FD : 3 </ USR / lib64에 / 점 libpthread -2.17.so> BUF : 832) = 832 : 0x7fff6a5b9520은 카운트 
     ) 1.725 (0.046 MS : LS / 10348 함수 fstat (FD : </usr/lib64/libpthread-2.17.so> 3 statbuf : 0x7fff6a5b93c0) = 0 
     1.820 (0.106 MS) : LS / 10,348의 mmap (LEN : 2255184, 제자 : EXEC | READ, 플래그 : PRIVATE | DENYWRITE이, 전략 중 : 3) = 0x7fe831cf5000 
     2.027 (0.350 MS) : LS / 10348 mprotect가를 (시작 : 0x7fe831d19000을 LEN : 2,093,056) = 0 
     2.424 (0.056 MS) : LS / 10348 의 mmap (주소 : 0x7fe831f18000, LEN : 8192, PROT : 읽기 | 쓰기, 플래그 : PRIVATE | DENYWRITE | FIXED (FD) : 3, OFF : 143360) = 0x7fe831f18000
     2.533 (0.053 밀리 초) : LS / 10,348의 mmap (주소 : 0x7fe831f1a000, LEN : 6480, PROT : 읽기 | 쓰기, 플래그 : PRIVATE | ANONYMOUS | 고정) = 0x7fe831f1a000

그러나 반환 한 흔적도 (즉, 모든 프로세스를 추적) 시스템 수준의 통화 추적 시스템이 될 수 있으며, strace를 특정 과정을 추적 할 수 있습니다.

두 번째 예는 사용자 공간 라이브러리 퍼포 함수이다 . 라이브러리 함수 호출은, 예를 들어 bash는 readline에 유사한 방법을 사용하여, 당신은 (uprobes 기준) 라이브러리 호출을 추적 할 수 있습니다.

Readline와 동작은, 상기 사용자 입력은 상기 단말로부터 읽은 데이터는 호출자에게 반환된다. 오픈 시스템 호출이 다른과에 따라서, 우리가 작성한 Readline을 호출 한 결과에 대한 자세한 우려하고있다.

우리는 다음과 같은 명령을 실행 -x 경로를 통해 bash는 바이너리 파일을 지정, 당신은 동적 라이브러리 함수를 추적 할 수 있습니다. 이것은 실제로 배쉬에서 실행되는 모든 사용자 명령을 추적 :

/ bash는이 작성한 Readline 프로브 # / bin에 추가 
하십시오 -X-프로브 / 빈 / bash는 '문자열 +0의 readline % 반환 ($의 RETVAL)'PERF $를 

# 샘플링 기록 
$를 성능 기록 -e probe_bash :. SLEEP 5 개 -Ar readline__return 

#보기 결과 
스크립트를 성능 $의 
    bash는 13348 [000] 93939.142576 : probe_bash : readline__return : - (5626ffac1610 <5626ffa46739) ARG1 = "LS" 

추적 후 삭제 #이 완료 프로브입니다 
: readline__return $의 반환 한 프로브 --del probe_bash

물론, 확실 프로브 형식 경우, 또는 지원되는 모든 기능과 함수 매개 변수를 조회하려면 다음 명령으로 :

당신은 기능과 일반 매개 변수, 응용 프로그램의 다음 이진 파일의 응용 프로그램의 이름을 표시 할 경우 유사한과 커널 기능은 동일한 필요가 디버깅 정보를 포함합니다.

세, eBPF 및 BCC

ftrace 및 반환 한 기능이 풍부한왔다, 그러나 일반적인 결함을 가지고, 그것은 스크립트로의 DTrace로 확장 무료하지, 충분히 유연하지 않습니다.

eBPF는 C 언어에서 (LLVM 바이트 코드에 의해 이러한 확장은 BPF로 변환되고, 커널 실행에로드) 확장 무료 DTrace와의 리눅스 버전입니다. 아래 그림은, 그것은 작동 원리 eBPF 트랙을 의미합니다 :

당신이 그림에서 볼 수 있듯이, eBPF 세 가지 단계를 수행해야합니다 :

  1. 사용자로부터 추적 BPF 바이트 코드 프로그램을 생성하는 단계;
  2. 커널 실행에로드;
  3. 사용자 공간으로 출력.

그래서, 우리가 이전에 보았던 것보다 용어, eBPF의 ftrace 및 반환 한의 사용, 더 복잡하다.

사실, eBPF 실행하는 과정에서, 모두 일반에 대한 모든 트랙 프로그램,지도 및 기타 작업뿐만 아니라로드, 컴파일. 파이썬 추상적까지,이 태어났다 BCC에 의해 이러한 프로세스 (BPF 컴파일러 컬렉션).

BCC는 데이터 조작 (라고지도) (예 : kprobe, uprobe, 트레이스 등) 다양한 이벤트 소스를 eBPF하기 위해, 또한 (또한 루아 지원) 파이썬 인터페이스로 변환됩니다. BCC 동적 추적을 사용하는 경우 따라서, 쓰기
그것에 간단한 스크립트를.

때문에 커널 데이터 구조와 상호 작용의 필요성, 그러나, 참고, 이벤트 처리 로직의 진짜 핵심은, 우리는 여전히 C 언어로 작성 될 필요가있다.

BCC 설치 방법에 관해서는, 캐시 메모리 모듈의 경우는 도입되었습니다. 당신은 설치하지 않은 경우 다음 명령 (다른 시스템의 설치는 여기를 참조하십시오) 설치 실행할 수 있습니다 :

# 우분투 
쉽다는 sudo 키 ADV --keyserver keyserver.ubuntu.com 4052245BD4284CDD --recv - 키 
"$ (lsb_release -CS) 뎁 https://repo.iovisor.org/apt/$(lsb_release -CS) 주"에코 | sudo는 티 /etc/apt/sources.list.d/iovisor.list 
는 sudo apt-get을 업데이트 
는 sudo apt-get을 libbcc - 예 리눅스 헤더 숨은-도구를 설치 - $ (UNAME -r) 

#의 REHL 7.6 
냠 설치 숨은-도구

설치 후, BCC는 (파이썬과 루아를 포함한) 모든 예는 / usr / share / 숨은 / 예 디렉토리에 위치합니다 :

LS는 / usr / share / 숨은 / 예 
hello_world.py 루아 네트워킹 추적

다음으로, 또는 예를 들어, 우리가 같은 동적 추적 eBPF와 BCC를 달성하는 방법을 살펴 do_sys_open합니다.

일반적으로, 우리는 다음과 같은 네 단계로 나누어 숨은를 적용 할 수 있습니다.

첫째, 모든 파이썬 모듈이 같은 방법을 사용하여, 이전에이 모듈을 가져올 사용, 사용 :

숨은 수입 BPF에서

둘째, 우리는 이벤트의 함수를 정의하고 이벤트를 처리해야합니다. 이 기능은 C 언어, 단지 수입 BPF 객체 초기화의 역할로 작성해야합니다. C 언어 처리 기능이 문자열로 BPF 처리 모듈로 전송한다 :

# ( ","BPF 프로그램 정의 "멀티 라인 문자열에 사용된다). 
# '#'를 파이썬 코멘트를 나타내는 '//'C.에 대한 코멘트를 나타내는 반면 
PROG를 =" "" 
#INCLUDE <uapi / 리눅스 /의 ptrace를. H> 
#INCLUDE <uapi / 리눅스 / limits.h> 
#INCLUDE <리눅스 / sched.h에> 
// C의 출력 데이터 구조 정의 
구조체를 data_t { 
    U32의 PID; 
    U64 TS; 
    숯 통신 [TASK_COMM_LEN]; 
    FNAME [NAME_MAX]를 숯불; 
}; 
BPF_PERF_OUTPUT (이벤트); 

// do_sys_open에 대한 핸들러를 정의합니다. 
다른 PARAMS이 추적 기능에 따라 달라집니다 동안 // CTX가 필요합니다. 
INT 안녕하세요 (구조체 pt_regs * CTX, INT의 DFD, CONST 숯 __user * 파일명 플래그 INT) { 
    데이터.
    data.ts bpf_ktime_get_ns = (); 
    경우 (bpf_get_current_comm (data.comm,는 sizeof (data.comm)) == 0) { 
        bpf_probe_read (data.fname,는 sizeof (data.fname) (보이드 *) 이름); 
    } 
    events.perf_submit (CTX, 데이터를 sizeof (데이터)); 
    0을 반환; 
} 
"" " 
# 부하 BPF 프로그램 
B = BPF (텍스트 = PROG) 
# 안부에 대한 do_sys_open kprobe 및 설정 핸들러 첨부 
b.attach_kprobe (= 이벤트"를 do_sys_open "fn_name ="안녕하세요 ")

세 번째 단계는 출력 함수 및 BPF 이벤트와 결합 함수의 출력을 정의 할 수있다 :

# 프로세스 이벤트 
= 0 시작 
: 데프 print_event (CPU, 데이터 사이즈) 
    글로벌 개시 
    # 이벤트의 유형이 data_t 
    이벤트 = B의 [ '이벤트'] 이벤트 (데이터). 
    : 만약 시작 == 0 
            = 시작 event.ts 
    (time_s =을 플로트 (event.ts - 시작)) / 1000000000 
    인쇄 ( "% - 18.9f % -16s % -6D % -16s"% (time_s, event.comm, event.pid, event.fname)) 

에 콜백 # 루프 print_event 
ㄴ [ "이벤트"]. open_perf_buffer (print_event)

마지막 단계는 이벤트 루프를 실행하는 것입니다, 통화 do_sys_open을 추적하기 시작했다 :

# 인쇄 헤더 
인쇄 ( "% - 18 세 % -16s % -6s % -16s"% ( 'TIME (들) ","COMM ","PID가 ","FILE ")) 
# 시작 이벤트 폴링 루프 
1 일 때 : 
    시도 : 
        b.perf_buffer_poll ()를 
    KeyboardInterrupt 제외 : 
        종료 ()

우리는 파일 trace-open.py에 저장, 코드 위의 몇 가지 단계를두고, 당신은 실행 파이썬을 사용할 수 있습니다. 모든 것이 잘된다면, 다음과 같은 출력을 볼 수 있습니다 :

파이썬 trace-open.py 
TIME은 COMM의 PID 파일 
0.000000000 irqbalance 1,073은 / proc / 인터럽트 
0.000175401 irqbalance 1,073은 / proc / STAT 
0.000258802 irqbalance 1,073은 / proc / IRQ / 9 / smp_affinity 
0.000290102 irqbalance 1,073은 / proc / IRQ / 0 / smp_affinity

출력에서, 당신은 많은 문서를 열고있다 (당신은 또한 다른 환경 프로세스가있을 수 있습니다) irqbalance 과정을 볼 수 있으며, irqbalance는 인터럽트로드 밸런싱을 실행하기 위해 읽기이 문서의 내용에 의존하고 있습니다.

이 간단한 예제를 통해, 당신은 또한 사실, ftrace 및 반환 한보다 더 높은 임계 값이, eBPF와 BCC의 사용을 찾을 수 있습니다. BCC는 적어도 C 언어, Python 언어, 추적 이벤트 또는 기능에 대해 잘 알고 있어야, 자신의 동적 추적 프로그램을 개발하고자하는
기능 (예 : 매개 변수로 다음과 같은 형식의 커널 함수를 반환)뿐만 아니라 제공하는 데이터 조작 eBPF의 다양한 방법.

그러나, 강력한 유연성, 사용 eBPF하지만 특정 임계 값은,하지만이 될 중지 할 수 없기 때문에, 가장 인기있는 대부분의 동적 추적 기술에 대해 이야기했다.

물론, BCC는 또한 많은 패키지가 / usr / 공유 / 숨은 참조 / 도구 / 디렉토리에 기본적으로 설치 좋은 유틸리티를 개발되었으며, 이들의 사용 시나리오는 다음과 같이 내장 :

이러한 도구는 일반적으로 직접 사용할 수 있습니다. 그리고 다른 동적 추적 스크립트의 준비, 그들은 또한 최고의 참조입니다. 그러나 특별한주의를 지불 할 필요가 한 가지 새로운 기능 eBPF의 많은, 우리는 비교적 새로운 커널 버전 (아래 그림과 같이 필요
그림 참조). 몇 가지 도구를 실행할 수없는 경우, 아마 때문에 기능을 지원하지 않습니다 현재 커널의 사용이다.

 

 

 

네, SystemTap의 및 sysdig

부가 ftrace, 퍼포 레이션에서 eBPF BCC와 상기, 및 SystemTap sysdig 동적 추적 툴과 같은 일반적으로 사용된다.

1에서 SystemTap 

SystemTap의 자유의 종류가 동적 추적 스크립트를 확장 할 수있다. eBPF이 나타납니다 전에,

SystemTap의 리눅스 시스템, 가장 가까운 DTrace를 동적 추적 메커니즘의 기능입니다. 단, 오랜 시간에 SystemTap의 커널에서 떨어져 표류 한 (그리고 eBPF 이후 출생 이후, 커널에 뿌리를두고있다).

그래서 ,,하는 SystemTap은 RHEL 시스템의 안정성에서 사용하기 쉬 웠던 것은 다른 시스템에 특별한 문제가 모든 종류의 경향이있다. 물론, 차례로, 이전 버전 3.x 및 다른 커널을 지원하는 SystemTap은 상대적입니다
 eBPF 큰 장점.

2, sysdig

sysdig는 주로 컨테이너 동적 추적에 사용되는 컨테이너 기술의 탄생의 인기와 함께입니다. sysdig는 열 성능 도구의 장점 중 일부를 함께 제공, 감독의 100 설정할 수라고 할 수있다. I는 표현이 수식을 이용 특성 sysdig :
 sysdig strace를 + = + htop tcpdump를 lsof를 + + + iftop 도커 검사.

최신 버전 (커널 버전> = 4.14)에서, 또한 sysdig eBPF이 연장 될 수 있고, 또한, 커널 함수 및 다양한 이벤트를 추적하기 위해 사용될 수있다.

다섯째, 어떻게 추적 도구를 선택합니다

여기에서, 당신은 또한 실제 장면을 선택하는 방법 결국, 큰 머리, 너무 많은 동적 추적 툴을 느낄 수 있습니다? 다시 말하지만, 특정 성능 도구를 선택, 특정 작품에서 시작하는 것이 필요하다.

이 두 클래스는, 우리는 당신이 자신을 구별에 대한 생각을 시작할 수 있습니다, 일반적인 도구와 기능의 원리가 도입 무슨 다른 장면에 대한 선택의 도구입니다. 예를 들면 :

  1. 시나리오가 높은 유연성을 필요로하지 않습니다에서 반환 한 샘플링하고도 불꽃의 도움으로 분석하여 성능 이벤트는 가장 일반적인 방법입니다;
  2. (예 : I / O 분포의 서로 다른 크기의 관찰 등) 통계 분석에 대한 이벤트 또는 함수 호출, 당신은 SystemTap의 또는 eBPF을 사용해야의 필요성은 데이터 처리는 일부 사용자 정의 스크립트에 의해 수행된다.

자, 내가 몇 가지 일반적인 동적 추적 사용 시나리오를 요약 및 도구를 권장합니다. 당신은 쉽게 찾을 수이 테이블을 저장하고 자신을 사용할 수 있습니다.

VI 요약

오늘, 나는 반환 한, eBPF BCC 및 기타 동적 추적 방법을 배울 당신을 데려 및 동적 추적 방법을 선택하는 방법을 여러 가지 시나리오를 요약

리눅스 시스템, 등등 ftrace, 퍼포 레이션, eBPF의 SystemTap을 포함한 일반적인 동적 추적 방법에. 불꽃 차트 퍼포 레이션을 사용하여 대부분의 성능 문제에서 좋은 방법입니다. 당신은 이러한 요구 사항을 충족 할 수없는 경우 :

커널의 새 버전에서는 eBPF BCC는 가장 유연하고 동적 추적 방법입니다,하지만 eBPF 지원이 제한되어 있기 때문에 특히 RHEL 시스템의 커널의 이전 버전에서, SystemTap은 종종 더 나은 선택입니다.

위해 정보를 얻기 위해 동적 추적 기술, 대상에 대한 자세한 분석을 사용하는 경우 또한, 일반적인 필요가 커널 심볼 테이블 및 응용 프로그램을 디버깅 할 수 있습니다. 동적 추적이 실제로 (기능 및 이벤트 포함)이 기호에 수행, 읽기 및 심볼 이해하기 쉬운
번호를 동적 추적의 과정을 빠르게 도움이됩니다.

추천

출처www.cnblogs.com/luoahong/p/11578184.html