bpftrace 텍스트

7655 단어 LinuxBPFbpftrace
안녕하십니까?이름에서 알 수 있듯이 이것은 bpf를 이용한 추적 도구이다. bpftrace의 디자인은 이전에 존재했던 DTrace와 SystemTap의 영향을 받았다. 이런 도구를 잘 아는 사람들에게 bpftrace는 DTrace와 SystemTap의 BPF 버전이라고 하면 더욱 이해하기 쉽다.
일반적으로 BPF를 이용하여 추적을 실시하는 경우, 1) BPF 프로그램 본체와 2) 추적 결과를 표시하기 위해 사용자 낙원의 프로그램을 작성해야 하지만, bpftrace는 자신의 스크립트 언어를 통해 이런 것들을 특별히 주의하지 않고 추적 처리를 기술할 수 있다. 예를 들어프로그램에 따라 시스템 호출 발행 수를 통계하고 싶은 경우 다음과 같이 진행할 수 있습니다. 편리합니다.
% bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
Attaching 1 probe...
^C

@[systemd-journal]: 5
@[sudo]: 7
@[vim]: 12
@[dockerd]: 23
@[bpftrace]: 25
@[sshd]: 26
@[tmux: server]: 29
@[containerd]: 113
내부에서 bpftrace는 스크립트의 문법 해석을 하고 LLVM IR을 출력하여 BPF 프로그램으로 컴파일하여 커널에 불러옵니다. 또한 bpftrace 프로그램 자체가 실행 시간이 되어 추적 결과를 표시합니다.

그런데


System Tap은 Tetris를 비롯bpftrace합니다. 그러면 bpftrace가 같은 일을 할 수 있을지 신경 쓰지 않겠습니까?신경 쓰이시죠?

그래서


게임이 움직이는 것 같아요.를 bpftrace에 이식하다.
tetris.stp
사실 원래의 테트리스.stp를 건드린 적이 없어서 오리지널 동작을 모르지만 그렇게 움직였으니 꼭 오케이 하세요.

FAQ


Q. 지금은 어떻게 됐어요?


BPF 프로그램을perf의 cpu clock에 추가하는 소프트웨어 이벤트를 통해 일정한 간격으로 BPF 프로그램을 호출할 수 있습니다. 이 BPF 프로그램에서 BPF 맵에 저장된 디스크 상태를 업데이트하여 화면을 다시 그릴 수 있습니다. 화면의 다시 그리기는 실제로 BPF 프로그램 측perf_event_output()에서 메시지를 출력합니다.이 정보를 받은 사용자 낙원의 bpftrace 프로그램은 을 이용하여 묘사한다.

Q. 버튼 입력은 어떻게 되나요?


원래 설치 중ANSI 변환 시퀀스 연결 함수는 버튼 입력을 얻었지만 이 함수는 물리 키보드에만 반응하는 것 같아서 ssh 환경에서 사용할 수 없기 때문에 kprobe 대체kbd_envet()로 버튼 입력을 포착한다.

Q. 자신의 환경이라면 움직이지 않는다


동작은 Linux 5.3 이상이 필요합니다. 그렇지 않으면 BPF 프로그램의 명령 수 상한선에 걸려 BPF 프로그램을 불러올 수 없습니다. 원래 BPF 프로그램은 일정 시간의 실행이 끝날 수 있도록 프로그램당 4096 명령의 제한이 있습니다.Linux 5.3부터 최대 100만 명의 명령을 불러올 수 있는 프로그램pty_write()을 사용할 수 있습니다. 또한 bcc는github의master branch를 사용하고, bpftrace는github의master branch를 사용하십시오. 일부는 최신 기능이 분지을 사용합니다.

Q. Linux5.2는 어떤 식으로든 이전의 환경에서 작동하고 싶어 합니다.


Linux 5.2 이전에 실행하려면 BPF 프로그램의 크기를 줄여야 합니다.
이번에 만든 프로그램은 기본적으로 SystemTap 버전의 프로그램을 그대로 이식하지만 BPF 프로그램의 관점에서 보면 효율이 매우 낮다. 가장 중요한 것은 바둑판의 체량 상태를 일일이 BPF 맵에 저장하는 것이다. 이것은 방문할 때마다bpf_map_lookup_elem()의 처리가 필요하다.매우 효과가 없습니다. BPF 지도는 임의의 데이터 구조를 저장할 수 있기 때문에 원래는 바둑판을 하나의 BPF 지도의 항목에 저장하고 통일적으로 불러와 저장하면 됩니다. 그러나 현재 bpftrace는 맵에 int 이외의 value를 저장할 수 없습니다. 또한,BPF 프로그램의 순환 처리를 모두 unroll하는 것도 명령 증가의 한 원인이다. 순환을 포함하는 BPF 프로그램이verifier에서 튀어나왔기 때문이다. 를 사용하면 일정한 제한에서 순환할 수 있다. 이것도 Linux5.3에서 가져온 기능이다. (또한 현재 bpftrace는bounded loop을 지원하지 않는다.)
명령수 상한선을 회피하는 기술로 bpftailcall을 이용하여 BPF 프로그램을 연쇄하는 방법도 있지만, 이쪽의 bpftrace 현황도 대응하지 않습니다. BPF 프로그램을 분할하여 한 사건에 여러 개의 BPF 프로그램을 추가하는 필살기도 있습니다.이벤트가 떨어지면 BPF 프로그램이 호출되지 않기 때문에 일치된 동작을 보장하기 어렵다.
따라서 Linux5.2 이전에 정상적으로 작동할 수 있는 텍스트를 만드는 것은 상당히 어렵지만, 내가 생각하는 사람은 반드시 도전해야 한다.

결론


bpftrace라도 노력하면 텍스트가 이동합니다.
농담은 물론이고, bpftrace는 현재 v1.0을 대상으로 활발한 개발을 진행하고 있습니다.x의 코어에서 사용할 수 있습니다. 주요 기능은 이미 완성되었고 충분히 실용적으로 사용할 수 있습니다Bounded Loop. 하지만 자세한 문제가 있습니다. 관심 있으신 분들은 꼭 한번 시도해 보세요.문제가 있으면 사람에게 보고하는 것이 좋다. issue 각 판매상의 설치 방법은 모두 통일되어 있다. 사용 방법은 참고할 수 있다여기.
또 마침 이번 달에는 일부 bpftrace 개발공식 강좌이 있을 예정이다. 전자책판이 나왔기 때문에 대충 읽어봤는데 도구로 한편으로는 bpftrace를 중심으로 하고 다른 한편으로는 (제목에서 볼 수 없는) 기존의 추적 도구에 대한 설명도 소량 있다.나는 이것이 실제 성능 문제 개선에 초점을 맞춘 책이라고 생각한다. 참고로 추적 이외의 BPF의 경우, 예를 들어 XDP 등은 거의 없다Brendan Gregg씨의 BPF 책. 그래서 그들은 서로 다른 문헌과 관련된다.
처음에 실행하는 데 약간의 시간이 걸리는 것은 BPF 프로그램의 컴파일과 불러오는 시간입니다.
명령수 상한선이 4096에서 100만으로 높아지는 것은 극단적으로 들리지만 실제 상황은 그리 간단하지 않다. 실제로 BPF 프로그램이 실행될 수 있을지는 BPF의 명령수 상한선을 제외하고는verifier의 검증을 통해 일정 수 이내에 끝내는 조건도 있습니다. 예를 들어 BPF 프로그램은tailcall을 통해 다른 BPF 프로그램으로 옮길 수 있습니다. 이 경우,verifeir는 이 이동을 포함한 BPF 명령을 검사합니다. 따라서,verifier 검사의 명령 수는 단일한 BPF 프로그램의 명령 수보다 많습니다. 이 verifier 검사의 명령 수 상한선BPF_COMPLEXITY_LIMIT_INSNS은verifier의 속도가 높아지면서 Linux 5.3의 명령 수는 100만에 달했습니다.프로그램을 불러올 때의 프로그램 크기 제한은 특권 사용자에게도 BPF_COMPLEXITY_LIMIT_INSNS로 높아진다. 제출
bpftrace에 패치를 하는 것은 교활하지 않습니까?이것은 곧 본체에 합병될 수 있으니 용서해 주십시오...(2019-12-6 추기: 합병) 앞으로 bcc v0.12.0, bpftrace v0.9.4 이상이 대응할 수 있을 것 같습니다(미발표).
줄 삭제 알고리즘만 쓸 수 있고 순환하는 BPF 프로그램은 쓰기가 어려워서 조금 바뀌었습니다.
페이스북과 넷플릭스는 이미 생산 환경에서 사용된 것 같다(cf..이 자료라면 BPF 프로그램만 사용되기 때문에 bpftrace가 아니라 bcc 도구일 수도 있다)https://www.slideshare.net/brendangregg/um2019-bpf-a-new-type-of-software
네트워크 성능 분석 이야기는 꼬박 한 장이 있다.
부록에 BPF C에 대한 설명과 BPF 명령 집합이 있으면 유용할 것입니다.

좋은 웹페이지 즐겨찾기