재형이의 성장통 일지
  • BPF 기반 리눅스 성능 분석
    2024년 02월 05일 21시 38분 28초에 업로드 된 글입니다.
    작성자: 재형이
    반응형
    • 이전에 리눅스 성능 분석을 포스팅하면서 나왔던 eBPF에 대해서 정리하려고 한다

     

     

    리눅스 시스템 성능 분석

    쿠버네티스 환경을 운영하거나 서버를 운영할 때, 가장 많이 사용하는 운영체제가 리눅스이기 때문에 성능을 분석할 줄 알고 문제가 발생했을 때 빠르게 대처하는 것이 중요하다고 생각합니다.

    jaehyeong.tistory.com

     

     


     

     

     

    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 Applications Landscape

    A directory of eBPF-based open source applications

    ebpf.io

    • 주요 eBPF 프로젝트 중 bcc와 bpftrace는 BPF 명령어를 C언어 기반으로 작성하고, 커널에 로드 하는 과정이 불편함을 해소해주기 위해 고급 언어를 이용해 BPF 명령어를 작성할 수 있도록 도와준다

    bcc
    bpftrace

    • eBPF는 범용적인 도구이므로 다양한 목적으로 활용이 가능하다!
      (보안) 어플리케이션의 비 정상 행위 모니터링 도구
      (네트워크) 로드 밸런서
      (가시성 확보) 네트워크, 시스템 리소스에 대한 모니터링

    1-1. eBPF 주요 개념 정리

    1. 커스텀 코드를 커널 스페이스에서 실행 하는 기술
    2. 거의 모든 지점에서 이벤트 방식으로 코드를 실행 가능
    3. 안전하게 코드를 실행 할 수 있도록 코드를 실행 전 검증 단계를 진행
    4. 성능을 최적화 하기 위해, JIT 컴파일러로 추가적인 최적화 진행
    5. 데이터 저장 및 유저 스페이스에 데이터 전달을 지원
    6. 커널 버전에 따른 종속성을 가지지 않도록 헬퍼 함수 제공

    2. BPF 실행환경 구성

    2-1. bcc 설치

     

    GitHub - iovisor/bcc: BCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more

    BCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more - GitHub - iovisor/bcc: BCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more

    github.com

    • 요구사항 
      1. 커널 버전: 4.1 이상
        • uname -r
          출력 : 5.15.0-1019-aws
      2. 커널 컴파일 옵션에 BPF 관련 옵션이 켜져 있어야 함
        • vim /boot/config-5.15.0-1019-aws
          커널 버전명과 같은 config 파일 확인

    • 패키지 매니저는 오래된 버전이 설치될 우려가 있으므로 소스에서 직접 빌드
      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 성능분석

    1. runqlat
      • CPU 스케줄러 지연을 측정
      • CPU 포화 이슈를 찾아내서 정량화 할 수 있음
      • 스케줄링 과정에 대기한 시간 확인
      • stress-ng --cpu 30 cpu 부하 테스트
    2. exitsnoop
      • 비정상적으로 동작하는 애플리케이션이 있는지 확인 → 애플리케이션의 정상 동작 이슈 모니터링
      • 프로세스가 종료되는 시점을 보여주는 도구
      • 프로세스의 수명과 종료 이유를 표시
        예) 정상 종료, 비정상 종료 코드, 시그널에 의한 종료
      • ctrl+c로 프로그램 종료하게 되면 exitsnoop로 다음과 같이 확인할 수 있다

    4. 메모리 성능분석

    1. oomkill
      • OOM 발생 여부를 커널 로그를 보지 않고도 확인
      • OOM 킬러 이벤트를 모니터링하는 도구
      • 프로세스, 사용한 페이지, 부하 평균 등의 추가 정보를 출력
      • 부하 평균은 1분/5분/15분 CPU 평균
      • /proc/loadavg 내용 출력
      • stress-ng --bigheap 10 메모리 부하 테스트
    2. swapin
      • swap이 동작하는 경우 시스템 성능 저하가 크게 나타날 수 있기 때문에 SWAP 동작 상태를 확인해줄 필요가 있음
      • 스왑 동작 상태를 모니터링하는 도구
        → 스왑영역이 존재하고, 사용 중이어야 함
      • 어느 프로세스가 스왑 장치로부터 스왑 인 되는지를 보여줌
      •  
    3. drsnoop
      • 메모리가 부족해서, 직접 회수를 실행하고 있는지 확인
        → 메모리가 부족한 상황을 나타내는 지표. 해당 시점에 시스템 성능 저하 발생 가능
      • 직접 회수(direct reclaim) 방법을 이용한 메모리 회수를 모니터링하는 도구
      • 영향을 받은 프로세스와 회수에 소요된 시간, 페이지 수를 표시
      • drsnoop -T : 시간 같이 표시
      • stress-ng --bigheap 3 로 테스트

    5. 파일시스템 성능분석

    1. fileslower [options] [min_ms]
      • 시스템에 파일 입출력과 관련된 지연이 발생하는지 확인
      • 주어진 임계값(10ms)보다 느린 파일 동기적인 읽기/쓰기 요청이 있는지 모니터링
      • 동기적 읽기 / 쓰기는 시스템 성능에 영향
      • 디스크 레벨의 지연이 아니라 파일시스템 레벨의 지연이 발생 → 프로그램 성능에 직접적인 영향
      • dd if=/dev/zero of=swapfile bs=4M count=1K 로 테스트 (4GB크기의 파일 쓰기 실행)
    2. cachestat
      • 데이터베이스/애플리케이션의 캐시 효율을 확인
      • 페이지 캐시 히트와 미스 통계를 보여주는 도구
      • 캐시의 효율을 확인하는데 사용할 수 있음
        예) 메모리 크기를 줄였더니, 프로그램 성능 하락이 발생 했다 → 캐시 통계 확인 필요
      • cachestat -T 2 : 2초 간격으로 지표 수집

    6. 디스크 I/O 성능분석

    1. biolatency
      • 디스크 영향으로 인한 데이터베이스 서버 성능 저하 분석
      • 블록 I/O 장치 지연시간의 분포를 보여주는 도구
      • 요청의 크기가 크게 차이가 없는 경우, 균등하게 나오는게 좋음
      • biolatency -D : 디스크별로 결과 출력
      • biolatency -Q : OS에서 대기한 시간도 포함
      • dd if=/dev/zero of=swapfile bs=1K count=1M (1GB크기의 파일 쓰기 실행)
    2. biosnoop
      • 디스크 영향으로 인한 데이터베이스 서버 성능 저하 분석
        → 디스크 접근 패턴을 확인할 수 있음
      • 각 디스크 I/O 요청 정보를 모니터링하는 도구
      • 프로세스, 디스크, 유형(R/W), 섹터, 바이트, 지연 시간 정보를 표시
      • Sector 정보를 시각화하면 디스크 접근 패턴 정보를 확인할 수 있음
        → 섹터 순서로 랜덤한 요청인지 연속된 요청인지 확인 가능
      • dd if=/dev/zero of=swapfile bs=1K count=1M (1GB크기의 파일 쓰기 실행)

    7. 네트워크 성능분석

    1. tcplife
      • TCP로 연결된 세션에 대한 분석
      • TCP 세션이 시작/종료의 요약된 정보를 모니터링 하는 도구
      • 프로세스, 소켓(출발지 주소/포트, 도착지 주소/포트), TX, RX, 시간
    2. gethostlatency
      • REST API 요청 과정에 DNS 조회 관련 지연 이슈를 확인
      • 클라이언트에서 호스트 이름 변환 호출을 진행하는데 걸리는 시간을 모니터링
      • 캐싱이 된 경우 Latency가 차이가 남 (예, 40ms → 1ms)

    8. 정리

    • BPF 기술을 활용해 커널에서 원하는 정보를 적은 오버헤드로 확인
      → 실행되는 포인트에 따라 오버헤드는 차이가 있음
    • 기존 리눅스 도구들로 확보하지 못했던 정보를 확인할 수 있음
    • Telemetry 관련 SaaS 업체들의 노력으로 BPF 기반의 정보를 손쉽게 시각화
      예) 서비스 맵
    • 컨테이너 및 쿠버네티스 환경에도 각광받는 기술
      예) CNI 플러그인 회사들도 eBPF 기반 솔루션을 제공
      예) Chaos Mesh의 경우, eBPF 기반으로 커널에 장애 상황을 인젝션

     

     

     

    반응형
    댓글