ebpf-exporter를 활용하여 AWS EKS 네트워크 모니터링하기
놓치고 있는 지표들
AWS 환경에서는 VPC Flow Logs를 통해 엔드포인트 별 데이터 전송량을 볼 수 있습니다. 특히 AWS Flow Logs로 엔드포인트의 리전과 가용 영역 정보를 알 수 있어, 네트워크 전송량 과금을 모니터링할 때 유용합니다.
그런데 TCP 계층의 성능 모니터링은 어떻게 해야 할까요? TCP 계층에서는 패킷 유실, out-of-order delivery로 인한 latency 증가, throughput 저하 등의 성능 문제가 발생할 수 있습니다. 하지만 이를 모니터링하는 것은 쉽지 않은데, 이때 필요한 것이 eBPF입니다. 또, Cloudflare의 ebpf-exporter를 사용하면 eB...
리눅스 네트워크 모니터링 2편 - 네트워크 혼잡 모니터링
개요
리눅스 네트워크 모니터링 1편에서는 호스트 내에서 드랍되는 패킷을 모니터링하는 방법을 설명드렸습니다. 이번 글에서는 네트워크에서 발생한 문제를 감지하는 방법을 소개드리겠습니다.
이상적으로는 우리가 온전히 제어할 수 있는 데이터센터 내부에서는 패킷 유실 등의 네트워크 문제가 없어야 합니다. 하지만 현실에서는 네트워크 장비의 부하나 오동작으로 인해 네트워크 문제가 발생하고는 합니다.
네트워크 장비에서 패킷 드랍 통계를 모니터링하여 이를 감지할 수 있기도 하지만, 이것 만으로는 어떤 패킷이 버려졌는지 그리고 그로 인해 어떤 서비스가 얼마나 영향을 받았는지는 알기 어렵습니다. 리눅스 호스트에서 모니터링을 한다면 ...
타이머 기반 유휴 커넥션 정리 시 주의점
유휴 커넥션이란?
커넥션 기반 통신을 위해서는 각 엔드포인트 서버에서 커넥션의 정보를 저장하고 있어야 합니다. 커넥션 정보에는 해당 커넥션의 상태(established, syn_sent, time_wait 등), 엔드포인트의 IP 주소와 포트 번호, TCP 타이머 정보 등이 있습니다.
만약 커넥션을 통해서 더 이상 데이터를 주고받지 않는데도 불구하고 커넥션을 오랫동안 유지한다면 그만큼 서버 리소스를 낭비하게 됩니다. 많은 HTTP 어플리케이션에서는 이런 유휴 커넥션을 줄이기 위해 일정 시간 동안 활동이 없거나, 일정 수의 요청을 처리한 커넥션들을 종료하는 설정을 제공합니다.
예를 들어 Nginx에서는 keepa...
서비스 가용성을 더 높이는 방법
개요
서비스의 고가용성을 위해 일반적으로 로드밸런서 혹은 DNS를 사용합니다. 로드밸런서는 주기적으로 서버들에게 상태 검사 요청을 보내 문제가 있는 서버를 감지하고 자동으로 제외합니다. AWS의 Route 53과 같은 일부 DNS 솔루션도 이와 같은 기능을 제공합니다.
하지만 로드밸런서와 DNS가 문제를 감지하는 데에는 보통 몇 초 정도의 시간이 걸립니다. 예를 들어 로드밸런서가 각 서버로 3초마다 probe 요청을 보내고 연속하여 3번 이상 probe가 실패하였을 때 해당 서버를 제외한다면, 서버에 장애가 발생한 시점으로부터 약 9초에서 12초 후에 서버가 제외됩니다. 그동안은 장애가 지속될 수 있습니다. ...
Java InetAddress DNS 질의 성능 문제
개요
멀티스레딩 Java 어플리케이션에 트래픽이 평소보다 조금 더 몰려 요청을 제대로 처리하지 못하는 장애가 발생했습니다. 하지만 장애 당시 트래픽은 어플리케이션에서 예상하던 최대 수용 가능한 트래픽에 한참 못 미치는 수준이었습니다.
장애 원인을 분석해 보니 특정 조건을 만족할 때 DNS 질의가 성능 문제를 일으킴을 확인했습니다.
문제 발생 조건
문제가 발생하는 조건은 다음과 같습니다.
DNS 캐시 TTL이 0초로 설정되어 있습니다.
멀티스레딩을 사용하고 있습니다.
어플리케이션에서 다른 서비스 도메인을 질의합니다 (지속 커넥션을 사용하지 않아 매 요청마다 DNS 질의가 발생한다면 상황이 훨씬 악화됩...
perf-tools의 tcpretrans 스크립트 성능 개선기
개요
패킷 재전송을 트레이싱 하는 건 많은 상황에서 유용하게 쓰일 수 있기에, 이를 쉽게 사용하게 하는 유저 영역 프로그램들이 이미 존재합니다. Ftrace로 구현된 것과 bpftrace, bcc로 구현된 것들이 있습니다.
이 중 Ftrace를 사용하여 구현한 perf-tools 프로젝트의 tcpretrans는 이 툴들의 원조로, 10년 전에 작성되었지만 여전히 유용합니다. Bpftrace와 bcc 기반 툴을 사용하기 위해서는 여러 의존 패키지들을 설치해야 하지만, perf-tools의 tcpretrans는 의존성 없이 스크립트 파일 하나만으로 바로 실행이 가능하다는 장점이 있습니다. 또, eBPF를 지원하지 않...
리눅스 네트워크 모니터링 1편 - 호스트에서 드랍된 패킷 모니터링
개요
서비스를 운영하다보면 네트워크 문제로 인해 어플리케이션 응답이 지연되는 것을 종종 경험합니다. 네트워크 문제는 어플리케이션에서는 인지하기가 어려워 문제 원인을 찾는 데에 시간이 오래 걸리기도 합니다. 다행히 리눅스의 여러 기능들을 통해 네트워크 문제를 직간접적으로 모니터링할 수 있습니다.
네트워크 문제는 호스트 내에서도 발생할 수도 있고 호스트 외부 네트워크에서 발생할 수도 있습니다. 이 글에서는 호스트 내부에서 패킷이 드랍되는 문제를 모니터링하는 방법을 소개드리겠습니다.
리눅스의 네트워킹 스택은 매우 복잡하여 그만큼 다양한 구간에서 패킷 유실이 발생할 수 있습니다. 최근에는 DPDK, XDP 등으로 커널...