안녕하세요! 프로젝트 매니저로서 Network Performance Monitoring 프로젝트를 이끌며 얻은 경험과 성과에 대해 회고해 보겠습니다. 이 프로젝트를 통해 총 1년 동안 수많은 도전과 협업을 경험하면서, 우리 그룹이 어떻게 기술적인 문제를 해결하고 성공적으로 제품을 출시할 수 있었는지 살펴보겠습니다.
프로젝트 초기, 우리는 Network Performance Monitoring에 eBPF 기술을 도입하기로 결정했습니다. Extended Berkeley Packet Filter의 약자로, eBPF는 리눅스 커널 내에서 실행되는 프로그램을 통해 네트워크 이벤트를 캡처하고 분석할 수 있는 강력한 도구입니다. eBPF를 적용함으로써 성능 측정에 높은 정확성과 효율성을 얻을 수 있었습니다.
eBPF를 구현할 유연한 애플리케이션 언어로 Golang을 선택했습니다. 모니터링 에이전트는 데이터 수집 및 전송에서 소비 서버 자원을 최소로 유지할 수 있어야 합니다. 또 단일 실행파일로 작성할 수 있어 설치 시에도 복잡도를 줄일 수 있습니다. eBPF 코드는 C 계열 언어로 작성되어야 하지만, Golang은 C 코드를 호출할 수 있는 CGO(C Go) 패키지를 제공합니다. eBPF 코드를 작성하고 컴파일한 후, Golang에서 호출할 수 있도록 준비합니다.
// example.bpf.c#includeSEC("kprobe/sys_connect")int kprobe__sys_connect(struct pt_regs *ctx) {// eBPF 코드 작성return 0;}
Golang에서는 CGO를 이용하여 eBPF 코드를 로드할 수 있습니다. 필요한 헤더 파일을 포함하고, eBPF 코드를 Golang 함수로 감싸서 사용합니다.
// main.gopackage main/*#cgo CFLAGS: -I/usr/include#include "example.bpf.c"*/import "C"func main() {// eBPF 코드 로드 및 실행C.kprobe__sys_connect(nil)}
Golang에서는 eBPF를 사용하여 네트워크 데이터를 캡처하고 분석할 수 있습니다. 필요에 따라 데이터를 가공하고, 성능 지표를 추출하여 모니터링 대시보드에 표시할 수 있습니다.
eBPF를 활용하여 TCP/UDP 세션의 성능을 측정하고 수집하는 부분은 프로젝트에서 핵심적인 역할을 하였습니다. 세션의 성능에는 대역폭에 해당하는 초당 바이트 및 패킷과 건강함을 나타내는 jitter, latency 및 연결 개수를 지표로 삼았습니다.
jitter, latency는 연결의 건강 정보로, 패킷이 서버와 클라이언트를 왕복하는 시간과 시간의 변동성의 가중 평균입니다. Jitter, Latency는 악화되면 화상회의와 같이 세션에 기반한 서버 및 클라이언트의 실시간 작동에 영향을 미칩니다. 또 대역폭 사용량을 관측함으로써 애플리케이션이 설계 부하 범위에서 작동하는지 확인하고 장기적인 증설 계획을 세울 수 있습니다.
또 보안 기능이나 관리 기능을 담당하는 프로세스가 만들어내는 트래픽도 투명하게 관측되어 서비스 네트워크와 관리 네트워크가 분리되어 있지 않은 환경에서도 개별 세션 부하를 각각 관측할 수 있었습니다. 개발 과정에서 와탭의 네트워크 사용량을 관측했을 때 분산 네트워크가 설계대로 작동하고 있음을 시각적으로 확인할 수 있어 매우 기뻤습니다.
이 프로젝트의 주요 목표 중 하나는 애플리케이션 관점에서 연결 성능을 철저히 분석하는 것이었습니다. 특히, retransmission과 같은 문제가 발생했을 때, 이러한 이슈가 애플리케이션에 미치는 영향을 직접적으로 비교 분석할 수 있었습니다. 연결의 안정성과 성능을 측정하면서 어떠한 영향이 발생하는지에 대한 통찰을 얻을 수 있었습니다. 사용자가 실제로 느끼는 문제와 연결 성능 간의 상관관계를 교차 검증하는 방법을 배웠습니다. 평소 트랜잭션과 CPU 및 메모리 모니터링은 많이 하지만 네트워크 연결 성능은 알 수 없었는데 와탭 네트워크에도 제품을 적용해 보면서 연결의 개수 및 대역폭 특히 retransmission 발생 빈도를 확인할 수 있었습니다. 이를 바탕으로 내부 네트워크의 품질 및 외부 API 연동시 동시 처리 성능 요구사항을 이해하고 개선에 필요한 통찰을 얻을 수 있었습니다.
제품을 만들면서 실시간 연결정보를 사람이 이해할 수 있는 형태로 단순화하고 성능 정보를 전달하는데 집중했습니다. 개발자는 설계된 트래피 인입 경로에 맞춰서 개발을 진행하여 실제 환경에서의 부하 분산이나 내부 및 외부 네트워크가 동시 존재하는 상용 환경에서 애플리케이션의 성능 영향을 막연히 알고 있습니다. 실제 환경에서 작동하는 네트워크 품질과 부하를 개발자가 이해할 수 있도록 단순화 시각화하여 토폴로지를 개발했습니다. 네트워크에 대한 배경지식이 없는 인원도 토폴로지를 보며 쉽게 소통할 수 있었습니다. 중요 연결에 대해서는 에지(토폴로지의 노드 간 연결)를 강조하는 기능을 넣어 정보 전달성을 높이고자 노력하였습니다.
고객에게 제품을 전달할 때 세일즈 포인트를 설정하기 위해 PM과 개발자가 고객과 프리세일즈를 롤플레이를 진행했습니다. 제품 프레젠테이션 및 스토리텔링에 대한 가상 경험을 통해 애자일 사이클에서 개선 포인트를 반복 도출할 때, 고객 전달 포인트를 파악할 수 있었습니다. 특히 네트워크 비전문가를 상정하여 제품을 만들기 때문에 예산 확보 단계부터 고객에게 전달할 메세지가 중요하다고 설정하고 기능이 메세지에 부합하도록 노력하였습니다. 세일즈 및 마케팅 담당자들의 고민을 짧게나마 느껴볼 수 있었습니다.
이번 프로젝트에서 우리는 새로운 기술인 eBPF를 활용하여 연결 성능을 효과적으로 분석하는 방법을 배우고 적용해 보았습니다. 우선 eBPF 도입으로 성능 측정에 있어 높은 정확성과 효율성을 달성할 수 있었습니다. Golang을 활용하여 eBPF 코드를 유연하게 구현함으로써 모니터링 에이전트의 성능을 최적화하고, 단일 실행파일로 쉽게 설치할 수 있는 장점을 활용했습니다.
프로젝트에서는 TCP/UDP 세션의 성능 측정을 중점적으로 다뤄, 대역폭, 초당 바이트 및 패킷, 그리고 jitter와 latency를 통한 건강 상태 지표를 수집했습니다. 이를 통해 세션의 안정성을 높이고, 실시간 서비스에 영향을 미치는 지연과 변동성을 최소화할 수 있었습니다.
애플리케이션 관점에서의 연결 성능 분석은 특히 중요한 과제였습니다. Retransmission과 같은 문제가 발생했을 때, 그 영향을 사용자 경험으로 직접적으로 비교 분석하는 방법을 터득하였습니다. 또한 네트워크 연결 성능에 대한 시각화를 통해 개발자와 비전문가 모두가 쉽게 이해할 수 있는 정보를 제공할 수 있었습니다.
마지막으로, 제품 판매를 위한 고민을 통해 고객과의 소통에서 중요한 포인트를 발견했습니다. 프리세일즈 롤플레이를 통해 제품의 강점을 부각시키고, 애자일 개발에서 개선을 반복하면서 놓치기 쉬운 세일즈 포인트를 파악하는 계기가 되었습니다.
NPM 제품 개발을 결정하고 실제 제품을 출시하기까지 많은 분들이 도와주셨습니다. Network Performance Monitoring 프로젝트를 함께 이끌어가며 수고해 주셔서 감사합니다. 이번 프로젝트를 통해 우리는 기술적인 도전과 협업을 통해 어떻게 성공적인 제품을 만들어내는지 배우고, 다양한 경험을 쌓을 수 있었습니다. 앞으로도 더 많은 도전과 성취가 기다리고 있을 것입니다. 함께 힘을 모아 나아가 봅시다! 감사합니다.