방명록
- BPF 기반 리눅스 성능 분석2024년 02월 05일 21시 38분 28초에 업로드 된 글입니다.작성자: 재형이반응형
- 이전에 리눅스 성능 분석을 포스팅하면서 나왔던 eBPF에 대해서 정리하려고 한다
1. eBPF란?
- BPF란 The BSD Packet Filter: A New Architecture for User-level Packet Capture1993, Usenix라는 논문이다
- 기존 네트워크 모니터링은 유저 레벨에서 동작하기 때문에 필터링을 위해서 커널-사용자 레벨의 Copy하는 과정에서 오버헤드가 발생하고 이를 해결하고자 나온 개념이다
- 커널 레벨의 빠른 시점에 필터링 진행하여 기존 대비 20배의 성능 향상을 기대할 수 있다
- eBPF란 extend BPF이지만 BPF의 이름과 개념만 차용했을 뿐, 새로운 기술이라고 보면 된다
확장된 기능 / 범위 → 네트워크 패킷 필터링에만 한정적이지 않음, 다양한 경로에서 이벤트 기반으로 사용자 코드를 실행 가능 - eBPF의 핵심 개념은 " 커스텀 코드를 커널 스페이스에서 실행 하는 기술" 이라는 것이다
- 커널 영역의 VM 환경에서 코드를 실행한다
- 이벤트 기반 커스텀 코드 실행
→ 프로그램이 특정 Hook 지점을 지날 때 실행 (예, systemcall, 함수시작/종료, 커널 트레이스 포인트)
- 실행 전에 검증을 수행하기 때문에 안전하게 코드를 로드 및 실행할 수 있다
→ 제한된 프로세스만 BPF 프로그램 로드, 무한 루프 검사, 시스템 크래시 발생 가능 여부 등 (지속적 개선) - JIT 컴파일을 사용하여 실행 속도를 최적화한다
- 상태를 저장 가능하고, 유저 스페이스의 프로그램에서 이를 접근 가능
→ 사용가능한 자료 구조: 해시 테이블 , 배열, 링 버퍼, 스택 트레이스 등 - 커널 버전에 종속성을 가지지 않도록, 헬퍼 함수들 제공
→ 커널의 함수를 직접 사용할 경우, 커널 버전 변경에 따른 영향이 생김
→ 예, 랜덤 숫자 생성, 현재 시작/날짜, 프로세스/cgroup 컨텍스트 접근, 네트워크 패킷 조작 등 - 주요 eBPF 프로젝트
https://ebpf.io/applications/
- 주요 eBPF 프로젝트 중 bcc와 bpftrace는 BPF 명령어를 C언어 기반으로 작성하고, 커널에 로드 하는 과정이 불편함을 해소해주기 위해 고급 언어를 이용해 BPF 명령어를 작성할 수 있도록 도와준다
- eBPF는 범용적인 도구이므로 다양한 목적으로 활용이 가능하다!
(보안) 어플리케이션의 비 정상 행위 모니터링 도구
(네트워크) 로드 밸런서
(가시성 확보) 네트워크, 시스템 리소스에 대한 모니터링
1-1. eBPF 주요 개념 정리
- 커스텀 코드를 커널 스페이스에서 실행 하는 기술
- 거의 모든 지점에서 이벤트 방식으로 코드를 실행 가능
- 안전하게 코드를 실행 할 수 있도록 코드를 실행 전 검증 단계를 진행
- 성능을 최적화 하기 위해, JIT 컴파일러로 추가적인 최적화 진행
- 데이터 저장 및 유저 스페이스에 데이터 전달을 지원
- 커널 버전에 따른 종속성을 가지지 않도록 헬퍼 함수 제공
2. BPF 실행환경 구성
2-1. bcc 설치
- 요구사항
- 커널 버전: 4.1 이상
- uname -r
출력 : 5.15.0-1019-aws
- uname -r
- 커널 컴파일 옵션에 BPF 관련 옵션이 켜져 있어야 함
- vim /boot/config-5.15.0-1019-aws
커널 버전명과 같은 config 파일 확인
- vim /boot/config-5.15.0-1019-aws
- 커널 버전: 4.1 이상
- 패키지 매니저는 오래된 버전이 설치될 우려가 있으므로 소스에서 직접 빌드
https://github.com/iovisor/bcc/blob/master/INSTALL.md#ubuntu---source - 위에서 설치할 때 python3을 사용하여 빌드를 하므로 해당 명령어로 링크를 걸어준다, 확인해보고 python3 사용하고 있으면 상관 없음
sudo rm /usr/bin/python sudo ln -s /usr/bin/python3 /usr/bin/python
- 설치 확인, bcc 명령어가 실행이 잘되는지 확인해보면 됨
sudo /usr/share/bcc/tools/execsnoop
- 편의성을 위해 환경변수를 추가해서 명령어 자동완성 기능을 사용하자
# root 계정의 .bashrc에 아래 내용 추가 export PATH="/usr/share/bcc/tools:$PATH"
3. CPU 성능분석
- runqlat
- CPU 스케줄러 지연을 측정
- CPU 포화 이슈를 찾아내서 정량화 할 수 있음
- 스케줄링 과정에 대기한 시간 확인
- stress-ng --cpu 30 cpu 부하 테스트
- exitsnoop
- 비정상적으로 동작하는 애플리케이션이 있는지 확인 → 애플리케이션의 정상 동작 이슈 모니터링
- 프로세스가 종료되는 시점을 보여주는 도구
- 프로세스의 수명과 종료 이유를 표시
예) 정상 종료, 비정상 종료 코드, 시그널에 의한 종료 - ctrl+c로 프로그램 종료하게 되면 exitsnoop로 다음과 같이 확인할 수 있다
4. 메모리 성능분석
- oomkill
- OOM 발생 여부를 커널 로그를 보지 않고도 확인
- OOM 킬러 이벤트를 모니터링하는 도구
- 프로세스, 사용한 페이지, 부하 평균 등의 추가 정보를 출력
- 부하 평균은 1분/5분/15분 CPU 평균
- /proc/loadavg 내용 출력
- stress-ng --bigheap 10 메모리 부하 테스트
- swapin
- swap이 동작하는 경우 시스템 성능 저하가 크게 나타날 수 있기 때문에 SWAP 동작 상태를 확인해줄 필요가 있음
- 스왑 동작 상태를 모니터링하는 도구
→ 스왑영역이 존재하고, 사용 중이어야 함 - 어느 프로세스가 스왑 장치로부터 스왑 인 되는지를 보여줌
- drsnoop
- 메모리가 부족해서, 직접 회수를 실행하고 있는지 확인
→ 메모리가 부족한 상황을 나타내는 지표. 해당 시점에 시스템 성능 저하 발생 가능 - 직접 회수(direct reclaim) 방법을 이용한 메모리 회수를 모니터링하는 도구
- 영향을 받은 프로세스와 회수에 소요된 시간, 페이지 수를 표시
- drsnoop -T : 시간 같이 표시
- stress-ng --bigheap 3 로 테스트
- 메모리가 부족해서, 직접 회수를 실행하고 있는지 확인
5. 파일시스템 성능분석
- fileslower [options] [min_ms]
- 시스템에 파일 입출력과 관련된 지연이 발생하는지 확인
- 주어진 임계값(10ms)보다 느린 파일 동기적인 읽기/쓰기 요청이 있는지 모니터링
- 동기적 읽기 / 쓰기는 시스템 성능에 영향
- 디스크 레벨의 지연이 아니라 파일시스템 레벨의 지연이 발생 → 프로그램 성능에 직접적인 영향
- dd if=/dev/zero of=swapfile bs=4M count=1K 로 테스트 (4GB크기의 파일 쓰기 실행)
- cachestat
- 데이터베이스/애플리케이션의 캐시 효율을 확인
- 페이지 캐시 히트와 미스 통계를 보여주는 도구
- 캐시의 효율을 확인하는데 사용할 수 있음
예) 메모리 크기를 줄였더니, 프로그램 성능 하락이 발생 했다 → 캐시 통계 확인 필요 - cachestat -T 2 : 2초 간격으로 지표 수집
6. 디스크 I/O 성능분석
- biolatency
- 디스크 영향으로 인한 데이터베이스 서버 성능 저하 분석
- 블록 I/O 장치 지연시간의 분포를 보여주는 도구
- 요청의 크기가 크게 차이가 없는 경우, 균등하게 나오는게 좋음
- biolatency -D : 디스크별로 결과 출력
- biolatency -Q : OS에서 대기한 시간도 포함
- dd if=/dev/zero of=swapfile bs=1K count=1M (1GB크기의 파일 쓰기 실행)
- biosnoop
- 디스크 영향으로 인한 데이터베이스 서버 성능 저하 분석
→ 디스크 접근 패턴을 확인할 수 있음 - 각 디스크 I/O 요청 정보를 모니터링하는 도구
- 프로세스, 디스크, 유형(R/W), 섹터, 바이트, 지연 시간 정보를 표시
- Sector 정보를 시각화하면 디스크 접근 패턴 정보를 확인할 수 있음
→ 섹터 순서로 랜덤한 요청인지 연속된 요청인지 확인 가능 - dd if=/dev/zero of=swapfile bs=1K count=1M (1GB크기의 파일 쓰기 실행)
- 디스크 영향으로 인한 데이터베이스 서버 성능 저하 분석
7. 네트워크 성능분석
- tcplife
- TCP로 연결된 세션에 대한 분석
- TCP 세션이 시작/종료의 요약된 정보를 모니터링 하는 도구
- 프로세스, 소켓(출발지 주소/포트, 도착지 주소/포트), TX, RX, 시간
- gethostlatency
- REST API 요청 과정에 DNS 조회 관련 지연 이슈를 확인
- 클라이언트에서 호스트 이름 변환 호출을 진행하는데 걸리는 시간을 모니터링
- 캐싱이 된 경우 Latency가 차이가 남 (예, 40ms → 1ms)
8. 정리
- BPF 기술을 활용해 커널에서 원하는 정보를 적은 오버헤드로 확인
→ 실행되는 포인트에 따라 오버헤드는 차이가 있음 - 기존 리눅스 도구들로 확보하지 못했던 정보를 확인할 수 있음
- Telemetry 관련 SaaS 업체들의 노력으로 BPF 기반의 정보를 손쉽게 시각화
예) 서비스 맵 - 컨테이너 및 쿠버네티스 환경에도 각광받는 기술
예) CNI 플러그인 회사들도 eBPF 기반 솔루션을 제공
예) Chaos Mesh의 경우, eBPF 기반으로 커널에 장애 상황을 인젝션
반응형'데브옵스 > 운영체제' 카테고리의 다른 글
리눅스 시스템 성능 분석 (4) 2024.02.04 리눅스 운영의 기초 : 스크립트 및 설정 자동화 (2) 2024.01.29 리눅스 운영의 기초 : 파일시스템, 소프트웨어 및 사용자 관리 (2) 2024.01.22 리눅스 운영의 기초 : 시스템 및 프로세스 관리 (0) 2024.01.21 다음글이 없습니다.이전글이 없습니다.댓글