BPF 컴파일러 컬렉션(BCC)
BCC는 효율적인 커널 추적 및 조작 프로그램을 만들기 위한 툴킷이며 몇 가지 유용한 도구와 예제가 포함되어 있습니다. 이는 Linux 3.15에 처음 추가된 새로운 기능인 eBPF로 알려진 확장 BPF(Berkeley Packet Filters)를 사용합니다. BCC가 사용하는 대부분의 기능에는 Linux 4.1 이상이 필요합니다.
eBPF는 Ingo Molnár에 의해 다음과 같이 설명되었습니다.
이 주기에서 가장 흥미로운 기능 중 하나는 eBPF 프로그램(커널에서 실행되는 사용자 정의, 샌드박스 바이트 코드)을 kprobe에 연결하는 기능입니다. 이를 통해 커널이 충돌하거나 중단되거나 부정적으로 간섭할 수 없는 라이브 커널 이미지에 대한 사용자 정의 계측이 가능해집니다.
BCC를 사용하면 C의 커널 계측(LLVM 주변의 C 래퍼 포함)과 Python 및 lua의 프런트 엔드를 통해 BPF 프로그램을 더 쉽게 작성할 수 있습니다. 성능 분석, 네트워크 트래픽 제어 등 다양한 작업에 적합합니다.
스크린샷
이 예에서는 디스크 I/O 커널 함수를 추적하고 I/O 크기에 대한 커널 내 2의 거듭제곱 히스토그램을 채웁니다. 효율성을 위해 히스토그램 요약만 사용자 수준으로 반환됩니다.
# ./bitehist.py
Tracing... Hit Ctrl-C to end.
^C
kbytes : count distribution
0 - > 1 : 3 | |
2 - > 3 : 0 | |
4 - > 7 : 211 | ********** |
8 - > 15 : 0 | |
16 - > 31 : 0 | |
32 - > 63 : 0 | |
64 - > 127 : 1 | |
128 - > 255 : 800 | ************************************** |
위 출력은 800 I/O의 최대 모드 크기가 128KB에서 255KB 사이인 이중 모드 분포를 보여줍니다.
소스를 참조하세요: bithist.py. 이것이 추적하는 것, 저장하는 것, 데이터가 표시되는 방식을 완전히 사용자 정의할 수 있습니다. 이는 가능한 많은 기능 중 일부만 보여줍니다.
설치 중
해당 플랫폼의 설치 단계는 INSTALL.md를 참조하세요.
FAQ
가장 일반적인 문제 해결 질문은 FAQ.txt를 참조하세요.
참고 가이드
bcc 및 bcc/BPF API에 대한 참조 가이드는 docs/reference_guide.md를 참조하세요.
내용물
이들 중 일부는 C와 Python을 모두 포함하는 단일 파일이고, 다른 일부는 .c 및 .py 파일 쌍을 가지며, 일부는 파일 디렉터리입니다.
트레이싱
예
- example/tracing/bitehist.py: 블록 I/O 크기 히스토그램. 예.
- example/tracing/disksnoop.py: 블록 장치 I/O 대기 시간을 추적합니다. 예.
- example/hello_world.py: "Hello, World!"를 인쇄합니다. 새로운 프로세스를 위해.
- example/tracing/mysqld_query.py: USDT 프로브를 사용하여 MySQL 서버 쿼리를 추적합니다. 예.
- example/tracing/nodejs_http_server.py: USDT 프로브를 사용하여 Node.js HTTP 서버 요청을 추적합니다. 예.
- example/tracing/stacksnoop: 커널 함수를 추적하고 모든 커널 스택 추적을 인쇄합니다. 예.
- tools/statsnoop: stat() 시스템 호출을 추적합니다. 예.
- example/tracing/task_switch.py: PID에서 시작 및 끝으로 작업 스위치를 계산합니다.
- example/tracing/tcpv4connect.py: TCP IPv4 활성 연결을 추적합니다. 예.
- example/tracing/trace_fields.py: 추적된 이벤트에서 필드를 인쇄하는 간단한 예입니다.
- example/tracing/undump.py: UNIX 소켓 패킷을 덤프합니다. 예
- example/tracing/urandomread.py: random:urandom_read를 추적하는 커널 추적점 예제입니다. 예.
- example/tracing/vfsreadlat.py example/tracing/vfsreadlat.c: VFS 읽기 대기 시간 분포. 예.
- example/tracing/kvm_hypercall.py: KVM 진입, 종료 및 하이퍼콜에 대한 조건부 정적 커널 추적점 예.
도구
- tools/argdist: 함수 매개변수 값을 히스토그램이나 빈도수로 표시합니다. 예.
- tools/bashreadline: 입력된 bash 명령을 시스템 전체에 인쇄합니다. 예.
- tools/bpflist: 활성 BPF 프로그램 및 맵이 있는 프로세스를 표시합니다. 예.
- tools/capable: 추적 보안 기능 검사. 예.
- tools/compactsnoop: PID 및 대기 시간으로 컴팩트 영역 이벤트를 추적합니다. 예.
- tools/ticalstat: 커널의 긴 원자적 중요 섹션을 추적하고 보고합니다. 예
- tools/deadlock: 실행 중인 프로세스에서 잠재적인 교착 상태를 감지합니다. 예.
- tools/drsnoop: PID 및 대기 시간으로 직접 회수 이벤트를 추적합니다. 예.
- tools/funccount: 커널 함수 호출을 계산합니다. 예.
- tools/inject: 호출 체인 및 조건자를 사용한 대상 오류 주입 예.
- tools/klockstat: 커널 뮤텍스 잠금 이벤트를 추적하고 잠금 통계를 표시합니다. 예.
- tools/opensnoop: open() 시스템 호출을 추적합니다. 예.
- tools/readahead: 미리 읽기 캐시 예제의 성능을 표시합니다.
- tools/reset-trace: 추적 상태를 재설정합니다. 유지 관리 도구 전용입니다. 예.
- tools/stackcount: 커널 함수 호출 및 스택 추적을 계산합니다. 예.
- tools/syncsnoop: sync() syscall을 추적합니다. 예.
- tools/threadsnoop: 새로운 스레드 생성을 나열합니다. 예.
- tools/tplist: 커널 추적점 또는 USDT 프로브 및 해당 형식을 표시합니다. 예.
- tools/trace: 필터를 사용하여 임의의 함수를 추적합니다. 예.
- tools/ttysnoop: tty 또는 pts 장치의 실시간 출력을 시청합니다. 예.
- tools/ucalls: 고급 언어로 메소드 호출 또는 Linux syscall을 요약합니다. 예.
- tools/uflow: 고급 언어로 메소드 흐름 그래프를 인쇄합니다. 예.
- tools/ugc: 고급 언어의 가비지 수집 이벤트를 추적합니다. 예.
- tools/uobjnew: 객체 유형 및 할당된 바이트 수별로 객체 할당 이벤트를 요약합니다. 예.
- tools/ustat: GC, 스레드 생성, 객체 할당, 예외 등과 같은 이벤트를 고급 언어로 수집합니다. 예.
- tools/uthreads: Java 및 원시 pthread에서 스레드 생성 이벤트를 추적합니다. 예.
메모리 및 프로세스 도구
- tools/execsnoop: exec() 시스템 호출을 통해 새로운 프로세스를 추적합니다. 예.
- tools/exitsnoop: 프로세스 종료 추적(종료 및 치명적인 신호) 예.
- tools/killsnoop: kill() 시스템 호출에 의해 발행된 추적 신호입니다. 예.
- tools/kvmexit: 각 VM 종료에 대한 exit_reason 및 해당 통계를 표시합니다. 예.
- tools/memleak: 메모리 누수를 찾기 위해 뛰어난 메모리 할당을 표시합니다. 예.
- tools/oomkill: 메모리 부족(OOM) 킬러를 추적합니다. 예.
- tools/pidpersec: 새로운 프로세스 수를 계산합니다(포크를 통해). 예.
- tools/rdmaucma: RDMA 사용자 공간 연결 관리자 액세스 이벤트를 추적합니다. 예.
- tools/shmsnoop: System V 공유 메모리 시스템 호출을 추적합니다. 예.
- tools/slabratetop: 커널 SLAB/SLUB 메모리 캐시 할당 속도 최고입니다. 예.
성능 및 시간 도구
- tools/dbslower: 임계값보다 느린 MySQL/PostgreSQL 쿼리를 추적합니다. 예.
- tools/dbstat: MySQL/PostgreSQL 쿼리 대기 시간을 히스토그램으로 요약합니다. 예.
- tools/funcinterval: 히스토그램과 동일한 함수 사이의 시간 간격입니다. 예.
- tools/funclatency: 시간 기능과 지연 시간 분포를 보여줍니다. 예.
- tools/funcslower: 느린 커널 또는 사용자 함수 호출을 추적합니다. 예.
- tools/hardirqs: 하드 IRQ(하드 인터럽트) 이벤트 시간을 측정합니다. 예.
- tools/mysqld_qslower: 임계값보다 느린 MySQL 서버 쿼리를 추적합니다. 예.
- tools/ppchcalls: ppc hcall 수와 대기 시간을 요약합니다. 예.
- tools/softirqs: 소프트 IRQ(소프트 인터럽트) 이벤트 시간을 측정합니다. 예.
- tools/syscount: syscall 수와 대기 시간을 요약합니다. 예.
CPU 및 스케줄러 도구
- tools/cpudist: 작업당 CPU 켜기 및 끄기 시간을 히스토그램으로 요약합니다. 예
- tools/cpuunclaimed: 샘플 CPU 실행 대기열 및 청구되지 않은 유휴 CPU를 계산합니다. 예
- tools/llcstat: 프로세스별 CPU 캐시 참조 및 누락을 요약합니다. 예.
- tools/offcputime: 커널 스택 추적을 통해 CPU가 꺼진 시간을 요약합니다. 예.
- tools/offwaketime: 커널 오프 CPU 스택과 웨이커 스택에 의해 차단된 시간을 요약합니다. 예.
- tools/profile: 일정 간격으로 스택 추적을 샘플링하여 CPU 사용량을 프로파일링합니다. 예.
- tools/runqlat: 히스토그램으로 큐(스케줄러) 대기 시간을 실행합니다. 예.
- tools/runqlen: 큐 길이를 히스토그램으로 실행합니다. 예.
- tools/runqslower: 긴 프로세스 스케줄링 지연을 추적합니다. 예.
- tools/wakeuptime: waker 커널 스택에 따라 절전 모드에서 절전 모드 해제 시간을 요약합니다. 예.
- tools/wqlat: 작업 대기열의 작업 대기 대기 시간을 요약합니다. 예.
네트워크 및 소켓 도구
- tools/gethostlatency: getaddrinfo/gethostbyname[2] 호출에 대한 대기 시간을 표시합니다. 예.
- tools/bindsnoop: IPv4 및 IPv6 바인딩() 시스템 호출(bind())을 추적합니다. 예.
- tools/netqtop tools/netqtop.c: NIC 대기열의 패킷 분포를 추적하고 표시합니다. 예.
- tools/sofdsnoop: Unix 소켓을 통해 전달된 FD를 추적합니다. 예.
- tools/solisten: TCP 소켓 수신을 추적합니다. 예.
- tools/sslsniff: OpenSSL에서 쓰고 읽은 데이터를 검사합니다. 예.
- tools/tcpaccept: TCP 수동 연결을 추적합니다(accept()). 예.
- tools/tcpconnect: TCP 활성 연결을 추적합니다(connect()). 예.
- tools/tcpconnlat: TCP 활성 연결 대기 시간(connect())을 추적합니다. 예.
- tools/tcpdrop: 세부정보와 함께 커널 기반 TCP 패킷 삭제를 추적합니다. 예.
- tools/tcplife: TCP 세션을 추적하고 수명을 요약합니다. 예.
- tools/tcpretrans: TCP 재전송 및 TLP를 추적합니다. 예.
- tools/tcprtt: TCP 왕복 시간을 추적합니다. 예.
- tools/tcpstates: 기간에 따라 TCP 세션 상태 변경을 추적합니다. 예.
- tools/tcpsubnet: 서브넷별 TCP 전송을 요약하고 집계합니다. 예.
- tools/tcpsynbl: TCP SYN 백로그를 표시합니다. 예.
- tools/tcptop: 호스트별 TCP 전송/수신 처리량을 요약합니다. TCP의 경우 상단입니다. 예.
- tools/tcptracer: 설정된 TCP 연결(connect(), accept(), close())을 추적합니다. 예.
- tools/tcpcong: TCP 소켓 정체 제어 상태 기간을 추적합니다. 예.
스토리지 및 파일 시스템 도구
- tools/bitesize: 프로세스별 I/O 크기 히스토그램을 표시합니다. 예.
- tools/cachestat: 추적 페이지 캐시 적중/실패 비율입니다. 예.
- tools/cachetop: 프로세스별 추적 페이지 캐시 적중/실패 비율입니다. 예.
- tools/dcsnoop: 디렉터리 항목 캐시(dcache) 조회를 추적합니다. 예.
- tools/dcstat: 디렉토리 항목 캐시(dcache) 통계입니다. 예.
- tools/biolatency: 블록 장치 I/O 대기 시간을 히스토그램으로 요약합니다. 예.
- tools/biotop: 디스크 상단: 프로세스별 블록 장치 I/O를 요약합니다. 예.
- 도구/바이오패턴: 무작위/순차 디스크 액세스 패턴을 식별합니다. 예.
- tools/biosnoop: PID 및 대기 시간을 사용하여 블록 장치 I/O를 추적합니다. 예.
- tools/dirtop: 디렉토리별로 파일을 읽고 씁니다. 디렉토리의 경우 상단입니다. 예.
- tools/filelife: 수명이 짧은 파일의 수명을 추적합니다. 예.
- tools/filegone: 파일이 사라진 이유(삭제 또는 이름 변경)를 추적합니다. 예.
- tools/fileslower: 느린 동기 파일 읽기 및 쓰기를 추적합니다. 예.
- tools/filetop: 파일 이름과 프로세스별로 파일을 읽고 씁니다. 파일의 경우 상단입니다. 예.
- tools/mdflush: md 플러시 이벤트를 추적합니다. 예.
- tools/mountsnoop: 시스템 전체에서 마운트 및 마운트 해제 syscall을 추적합니다. 예.
- tools/virtiostat: VIRTIO 장치 IO 통계를 표시합니다. 예.
파일 시스템 도구
- tools/btrfsdist: btrfs 작업 대기 시간 분포를 히스토그램으로 요약합니다. 예.
- tools/btrfsslower: 느린 btrfs 작업을 추적합니다. 예.
- tools/ext4dist: ext4 작업 대기 시간 분포를 히스토그램으로 요약합니다. 예.
- tools/ext4slower: 느린 ext4 작업을 추적합니다. 예.
- tools/nfsslower: 느린 NFS 작업을 추적합니다. 예.
- tools/nfsdist: NFS 작업 지연 시간 분포를 히스토그램으로 요약합니다. 예.
- tools/vfscount: VFS 호출을 계산합니다. 예.
- tools/vfsstat: 열 출력과 함께 일부 VFS 호출을 계산합니다. 예.
- tools/xfsdist: XFS 작업 대기 시간 분포를 히스토그램으로 요약합니다. 예.
- tools/xfsslower: 느린 XFS 작업을 추적합니다. 예.
- tools/zfsdist: ZFS 작업 대기 시간 분포를 히스토그램으로 요약합니다. 예.
- tools/zfsslower: 느린 ZFS 작업을 추적합니다. 예.
네트워킹
예:
- example/networking/distributed_bridge/: 분산 브리지 예시입니다.
- example/networking/http_filter/: 간단한 HTTP 필터 예입니다.
- example/networking/simple_tc.py: 간단한 트래픽 제어 예시입니다.
- example/networking/simulation.py: 시뮬레이션 도우미.
- example/networking/neighbor_sharing/tc_neighbor_sharing.py example/networking/neighbor_sharing/tc_neighbor_sharing.c: IP별 분류 및 속도 제한.
- example/networking/tunnel_monitor/: 트래픽 흐름을 효율적으로 모니터링합니다.
- example/networking/vlan_learning/vlan_learning.py example/vlan_learning.c: 작업자 veth+네임스페이스로의 이더넷 트래픽을 디먹스합니다.
BPF 내성
BPF 프로그램을 검사하는 데 도움이 되는 도구입니다.
- introspection/bps.c: 커널에 로드된 모든 BPF 프로그램을 나열합니다. BPF 프로그램의 경우 'ps'입니다. 예.
동기 부여
BPF는 커널에 로드된 프로그램이 충돌하지 않고 영원히 실행될 수 없도록 보장하지만 BPF는 많은 임의 유형의 계산을 수행할 수 있을 만큼 충분히 범용적입니다. 현재 유효한 BPF 프로그램으로 컴파일되는 프로그램을 C로 작성하는 것이 가능하지만 유효하지 않은 BPF로 컴파일되는 C 프로그램을 작성하는 것이 훨씬 쉽습니다(C도 마찬가지입니다). 사용자는 프로그램을 실행하기 전까지는 프로그램이 유효한지 여부를 알 수 없습니다.
BPF 관련 프런트엔드를 사용하면 언어로 작성하고 BPF 백엔드와 관련된 유효성에 대해 컴파일러로부터 피드백을 받을 수 있어야 합니다. 이 툴킷은 완전한 유연성을 활용하면서 유효한 BPF 프로그램만 생성할 수 있는 프런트엔드를 제공하는 것을 목표로 합니다.
또한 현재 BPF와의 통합에는 복잡한 작업 흐름이 있으며 때로는 Linux 커널 소스 트리에서 직접 컴파일하는 작업이 포함됩니다. 이 툴체인은 개발자가 BPF를 컴파일하는 데 소비하는 시간을 최소화하고 대신 작성할 수 있는 애플리케이션과 BPF로 해결할 수 있는 문제에 초점을 맞추는 것을 목표로 합니다.
이 툴킷의 기능은 다음과 같습니다.
- 공유 라이브러리의 엔드투엔드 BPF 워크플로
- BPF 백엔드를 위한 수정된 C 언어
- JIT용 llvm-bpf 백엔드와 통합
- JITed 프로그램의 동적(언)로딩
- BPF 커널 후크 지원: 소켓 필터, tc 분류자, tc 작업 및 kprobe
- Python용 바인딩
- 소켓 필터, TC 분류자 및 kprobe의 예
- 실행 중인 시스템을 추적하기 위한 자체 포함 도구
앞으로는 Python 외에 더 많은 바인딩이 지원될 가능성이 높습니다. 원하는 언어에 대한 지원을 자유롭게 추가하고 끌어오기 요청을 보내세요!
튜토리얼
- docs/tutorial.md: bcc 도구를 사용하여 성능, 문제 해결 및 네트워킹 문제를 해결합니다.
- docs/tutorial_bcc_python_developer.md: Python 인터페이스를 사용하여 새로운 bcc 프로그램 개발.
네트워킹
Red Hat Summit 2015에서 BCC는 BPF 세션의 일부로 발표되었습니다. 다중 호스트 vxlan 환경이 시뮬레이션되고 물리적 인터페이스 중 하나를 모니터링하는 데 BPF 프로그램이 사용됩니다. BPF 프로그램은 인터페이스를 통과하는 내부 및 외부 IP 주소에 대한 통계를 유지하고 사용자 공간 구성 요소는 이러한 통계를 여러 세부 수준의 트래픽 분포를 보여주는 그래프로 변환합니다. 여기에서 코드를 참조하세요.
기여
이미 코드를 커밋할 준비가 되었나요? 다음은 IOVisor 커뮤니티의 토론에 참여하고 원하는 작업을 확인할 수 있는 몇 가지 리소스입니다.
- 메일링 리스트: https://lists.iovisor.org/mailman/listinfo/iovisor-dev
- IRC: irc.oftc.net의 #iovisor
- BCC 이슈 트래커: Github 이슈
- 스크립트 기여 가이드: CONTRIBUTING-SCRIPTS.md
외부 링크
BCC에 대한 자세한 정보와 BCC가 어떻게 사용되고 있는지 찾고 계시나요? LINKS.md에서 웹의 다른 BCC 콘텐츠에 대한 링크를 찾을 수 있습니다.