eBPF를 사용한 시끄러운 이웃 감지 노트

eBPF를 사용한 시끄러운 이웃 감지

넷플릭스는 eBPF를 사용하여 지속적으로 런 큐 지연 시간을 모니터링합니다. 런 큐 지연 시간은 성능이 저하되는 인접 컨테이너에서 서버 리소스를 과도하게 사용하는 '시끄러운 이웃' (noisy neighbors) 컨테이너의 지표입니다.eBPF 훅 (sched_wakeup, sched_wakeup_new, sched_switch)은 런 큐 지연 시간을 캡처하고, cgroup ID와 관련시킵니다. kfuncs (커널 함수)를 사용하여 안전한 RCU 보호 데이터 액세스를 제공합니다.eBPF의 속도 제한기는 사용자 공간으로 전송되는 데이터 포인트를 제한하여 관찰 가능성과 성능을 균형을 맞춥니다.사용자 공간 프로세스는 eBPF 링 버퍼에서 이벤트를 처리하고, 런 큐 지연 시간 (runq.latency)과 선점 카운트 (sched.switch.out)를 포함한 메트릭을 Atlas에 전송합니다. 이러한 메트릭은 cgroup ID로 식별됩니다.런 큐 지연 시간과 선점 카운트 메트릭은 모두 시끄러운 이웃을 식별하는 데 필요합니다. 런 큐 지연 시간만으로는 CPU 제한에 도달한 컨테이너에서 오류가 발생할 수 있기 때문입니다.사례 연구에서는 새로운 컨테이너가 호스트 CPU를 완전히 사용하여 런 큐 지연 시간과 선점이 급증하는 시끄러운 이웃 문제를 보여줍니다.시스템 프로세스는 선점 카운트 메트릭을 사용하여 시끄러운 이웃으로 식별되었습니다.eBPF 코드 최적화, BPF_MAP_TYPE_HASH 사용, 직접 태스크 구조 멤버 액세스 및 커널 태스크 무시를 통해 오버헤드를 최소화했습니다.커널 통계 계산을 개선하기 위해 리눅스 커널 패치가 제출되어 승인되었습니다.BPFtop, 오픈 소스 eBPF 프로세스 모니터링 도구를 사용하여 eBPF 코드의 오버헤드를 측정했습니다.