BPF는 커널 내부에서 어떻게 동작하는지 알 수 있는 것이다.
처음엔 패킷을 필터링하고 검사하기 위해서 나왔다.
하지만 현재는 이것을 개선해서 eBPF가 나왔는데 커널의 여러가지 동작을 관찰하여 분석할수 있다.
왜 쓰는가?
기존 툴 체인 기반 성능 분석을 하기 위해서는 해당 코드를 삽입하거나 링크해서 통계 데이터를 생성하고
프로그램 종료 혹은 측정 종류 후 통계 데이터를 생성한다.
또한 커널을 테스트하려면 시스템을 껏다 켜야한다.
그러한 과정 없이 검증, 테스트를 할수 있는것이 BPF이다.
BPF에는 BPF Verifier와 BPF map이 있다.
BPF 검증기
- 장점
1. 프로그램의 폭주를 방지하여, 반드시 종료됨을 보장
2. 프로그램이 주어진 범위 밖의 메모리를 사용하는 것을 금지
- 단점
1. 프로그램의 최대 크기가 제한
2. 루프 반복 횟수도 제한
BPF 맵
1. 커널과 사용자 공간 사이의 주된 자료 교환 수단
2. 단순 배열, 해시 맵 등 다양한 자료 구조를 가짐
위의 수행 과정을 보면 BPF는 실시간으로 코드를 주입해서 검사하는 것이기에 잘못된 코드가 들어가면 안된다.
컴파일러를 거쳐서 BPF binary로 먼저 변환시킨후 커널에 적재한다.
그때 BPF 검증기로 Safe한지 확인하고 컴파일러를 통해서 BPF code가 생성된다.
그리고 해당 코드는 BPF Map을 사용해서 유저와 데이터를 주고 받는다.
간단한 테스트는 Ubuntu 18.04에서 진행한다.
System call 발생시 SEC부분에서 진입이되며 커널에 Hello, BPF World를 기록한다.
그리고 기록된 로그를 불러오는 코드이다.
이를 확인하기 위해서는 tmux를 활용한다.
이는 하나의 터미널을 분할하여 사용하게 해준다.
오른쪽 화면에서 ls를 실행할때마다 Hello, BPF World가 실행되는것을 볼수 있다.
하지만 문제는 BPF프로그램이 종료되면 해당 기록 로그가 사라진다.
이를 해결하기 위해 가상 파일시스템을 사용하여 해결할수 있다.
그리고 이 내용은 BPF호출로만 접근이 가능하다.
우선 mount -t bpf /sys/fs/bpf /sys/fs/bpf와 같은 명령어로 bpf 타입으로 마운트를 시켜줘야한다.
객체를 저장 = BPF_FIN_FD
객체를 불러올때 = BPF_OBJ_GET
이후 실험을 해보았을때 Save -> load시 조회가 가능하다.
BCC의 경우 eBPF에 기반하는 커널 트레이싱 toolkit이다.
복잡한 BPF를 쉽게 사용할 수 있게 해준다.
이를 활용한 게임 서버 성능 분석 게시물을 봤는데 좋은 내용인것 같아서 첨부한다.
'Linux Unix lab' 카테고리의 다른 글
sudo su 패스워드 없이 로그인 (0) | 2021.08.07 |
---|---|
파일 접근 권한 (0) | 2021.07.20 |