웹소켓으로 AWS 비용 10억을 날리고 얻은 교훈
이번 본문은 IT 전문가 David와 Recall.ai의 엘리엇 르빈(Elliot Levin)이 함께 작성한 <How WebSockets cost us $1M on our AWS bill>의 번역입니다. 엘리엇은 Recall.ai에서 엔지니어링 팀 리드를 맡아 클라우드 비용 최적화와 관련된 기술적 문제를 다루고 있습니다. 본 글에서는 클라우드 서비스 사용 시 비용 예측과 대체 기술의 중요성을 강조합니다.
이 글은 필자의 허락을 받고 번역하였으며, 각주는 ‘번역자주’입니다. 링크는 원문에 따라 표시하였습니다.
클라우드 비용 최적화를 논할 때 IPC*를 간과해서는 안 됩니다. AWS에서 IPC로 1TB의 영상을 처리할 경우 비효율적으로 구현하면 막대한 비용이 발생할 수 있습니다.
*IPC(Inter-Process Communication): 프로세스 간 데이터 전송 방식
웹소켓* 사용으로 연간 100만 달러의 AWS 비용이 발생한 사례와 이를 해결하기 위한 고대역폭·저지연 IPC 구현을 분석합니다.
*웹소켓: 웹 브라우저와 서버 간 실시간 양방향 통신 프로토콜
우리는 수백 개 기업에 미팅 봇 서비스를 제공하며, AWS 인프라를 통해 매월 수백만 건의 미팅을 처리하고 있습니다. 클라우드 서비스는 편리하지만 비용이 높은 단점이 있어 성능과 효율성이 중요해졌습니다.
최근 몇 년간 GPU 가용성이 불안정하자, 우리는 CPU로 영상 처리를 진행했습니다. 초기에는 봇이 4개의 CPU 코어로 모든 기능을 수행했으나, CPU 사용량을 반으로 줄이는 목표를 세웠습니다.
CPU 사용량에 대한 오해
영상 처리는 많은 컴퓨팅 자원을 요구하며, 초기 예상과는 달리 CPU 시간의 대부분이 __memmove_avx_unaligned_erms
와 __memcpy_avx_unaligned_erms
에 사용됐습니다. 이는 데이터를 수신하는 파이썬 웹소켓 클라이언트와 크로미움의 웹소켓 구현에서 크게 소모된 것입니다.
값비싼 소켓 통신의 대가
웹소켓을 사용하여 통화에 참여하는 봇들에게 원본 영상을 전송하는 방법을 고민했습니다. 웹소켓은 빠르고 편리하지만, 대량의 비압축 데이터를 처리하며 복잡성이 증가했습니다. 결국 웹소켓 RFC를 분석하여 성능 저하의 주된 원인을 찾았습니다.
단편화
웹소켓은 큰 메시지를 여러 프레임으로 나누는 단편화를 지원합니다. 크로미움의 구현에서는 131KB 이상의 메시지를 분할하며, 이는 너무 많은 복사 작업을 초래합니다.
마스킹
웹소켓의 데이터 마스킹 과정은 많은 컴퓨팅 자원을 소모하는데, 이는 보안상의 이유로 필수적입니다.
더 저렴한 방식은?
웹소켓을 대신할 방법으로 raw TCP/IP, 유닉스 도메인 소켓, 공유 메모리를 고려했습니다.
TCP/IP
루프백 장치를 통해 raw TCP/IP 패킷을 전송하며 단편화 문제를 해결할 수 있지만, 여전히 오버헤드가 발생합니다.
유닉스 도메인 소켓
빠르지만 사용자 공간에서 커널 공간으로의 복사 과정이 오버헤드를 초래합니다.
공유 메모리
최적의 효율성을 위해 공유 메모리 방식을 채택했습니다. 이는 여러 프로세스가 직접 메모리를 공유할 수 있게 해줍니다.
공유가 곧 성능
상위 레벨 전송 설계로 링 버퍼를 선택하여 CPU 사용량을 최대 50%까지 줄였으며, AWS 비용도 절감되었습니다. 이는 큰 성과로 평가됩니다.
<원문>
How WebSockets cost us $1M on our AWS bill
해당 기사는 GPT를 이용하여 요약한 내용입니다.