- BPF(eBPF)의 관찰 기능을 활용해 시스템 성능을 항상 자동으로 튜닝할 수 있도록 설계된 경량화된 도구
해결하고자 하는 문제점
-
너무 많은 튜닝 옵션: 리눅스 커널에는 1600개 이상의 튜닝 가능한 sysctl 매개변수가 존재. 다양한 환경에 맞는 설정을 찾는 것은 복잡하고 어려움
-
관리자 개입의 감소: 현대 클라우드 시스템에서는 수동적인 튜닝보다는 자동화된 관리가 필요. 대부분 시스템은 초기 설정 이후 관리자의 개입이 거의 없음
-
정적인 설정의 한계: 시스템 환경은 계속 변동되기 때문에, 고정된 값으로 튜닝하는 것은 비효율적일 수 있음
핵심 설계 원칙
-
최소 오버헤드: 고빈도 이벤트 추적을 피하고, 꼭 필요한 경우에만 관찰 기능 사용
-
정책 설명 명확화: syslog에 "무엇"이 "왜" 변경되었는지 기록
-
관리자 우선: 관리자가 값을 설정하면 자동 튜닝 기능 비활성화
-
무설정 원칙: 별도의 설정 없이 자동으로 튜닝. 가능한 한 매직 넘버를 피함
-
동적 조절: TCP 메모리 사용량이 증가할 경우 버퍼 크기를 줄여 시스템 균형을 맞춤
주요 개념
-
튜너(tuner): 각 튜너는 BPF 프로그램에서 발생한 이벤트를 처리하며 관련된 튜닝 가능한 항목을 관리
-
전략(strategy): 튜너는 여러 가지 전략을 가질 수 있으며, 각 전략은 평가 함수를 통해 효과적인 전략을 선택
-
이벤트(event): 튜너 ID, 시나리오, 네트워크 네임스페이스 정보 등이 포함되며, 튜너는 이 정보를 바탕으로 적절한 조치를 수행
아키텍처
-
bpftune
은 데몬으로, 여러 .so 형식의 플러그인 튜너를 로드하여 관리.
- 각 튜너는 고유의 ID를 가지며, BPF와 사용자 공간에서 이벤트를 처리.
- BPF 구성 요소는
bpftune.bpf.h
를 포함하며, 공유 변수와 맵 정의를 사용.
지원 튜너 목록
-
TCP connection tuner: 혼잡 제어 알고리즘 자동 튜닝
-
neighbour table tuner: 이웃 테이블 크기 자동 확장
-
route table tuner: 라우트 테이블 크기 자동 확장
-
sysctl tuner: 튜닝된 sysctl 값이 수동 설정과 충돌할 경우 튜너 비활성화
-
TCP buffer tuner: TCP 버퍼 크기 자동 조정
-
net buffer tuner: 코어 네트워크 관련 튜닝 자동 조정
-
netns tuner: 네트워크 네임스페이스 추가 및 제거 감지