go

22 개의 포스트

cloudflare

보안 인사이트 확장: 글로벌 스캔 처리 역량을 10배 향상한 방법 (새 탭에서 열림)

Security Insights는 기존 주 1~2회에 그치던 보안 검사를 모든 계정에 더 자주 적용하기 위해 처리량을 초당 10건에서 100건으로 약 10배 높여야 했다. Cloudflare는 Kafka 소비 병렬화, 느린 작업 분리, Postgres 대량 삽입 최적화, 지역 간 네트워크 지연 분석을 통해 스캔 처리량을 10배 이상 향상시켰다. 그 결과 수백만 고객에게 보안 인사이트를 제공하고 전체 고객의 검사 주기를 두 배로 늘릴 수 있었다. ## 기존 보안 검사 구조와 확장 과제 - 스케줄러가 검사 시점이 된 계정과 Zone을 감지한다. - 검사 작업을 Apache Kafka 메시지로 발행하고, 여러 Go 기반 checker 마이크로서비스가 메시지를 나누어 처리한다. - 각 checker는 특정 자산이나 설정을 검사한 뒤 내부 API로 결과를 전송한다. - API는 결과를 Postgres 데이터베이스에 저장한다. - 기존 시스템은 다음 문제를 겪고 있었다. - 검사가 주 1~2회만 수행되어 위험이 최대 2주간 탐지되지 않을 수 있었다. - 많은 무료 요금제 계정에서 자동 검사가 선택 사항이라 검사 자체가 이뤄지지 않았다. - Kafka backlog 증가, API 타임아웃, 프로세스 충돌이 발생했다. - 모든 계정에 자동 검사를 적용하고 검사 빈도를 높이려면 평균 처리량을 초당 10건에서 100건으로 늘려야 했다. ## Kafka 파티션의 병목 - Kafka는 일반적인 큐와 달리 파티션 내 메시지를 순서대로 소비하고 처리한다. - 하나의 consumer group에서는 파티션당 활성 consumer를 하나만 둘 수 있다. - 따라서: - 처리 시간이 긴 메시지 하나가 뒤따르는 메시지의 처리를 막을 수 있다. - checker별 병렬 소비자 수는 Kafka 파티션 수에 제한된다. - 파티션을 추가하면 확장할 수 있지만, 여러 서비스가 공유하는 Kafka 브로커의 자원 사용량이 증가하므로 최후의 수단으로 남겨두었다. ## 배치 기반 병렬 처리 - 메시지를 하나씩 처리하던 checker를 배치 단위로 소비하도록 변경했다. - 배치 안의 각 메시지는 별도의 Go goroutine에서 동시에 처리했다. - 이 방식의 trade-off는 다음과 같다. - 배치 처리 중 프로세스가 중단되면 이미 처리한 작업을 다시 수행해야 할 수 있다. - 동시에 처리하는 작업이 늘어 메모리 사용량이 증가한다. - 검사 시스템에서는 재처리 비용과 메모리 증가가 감당 가능한 수준이었기 때문에 병렬 처리를 선택했다. ## 느린 작업으로 인한 Head-of-Line Blocking 제거 - 일부 계정이나 Zone은 자산 수가 많아 검사에 수초가 아니라 수분 또는 수시간이 걸릴 수 있었다. - 이런 느린 메시지가 일반 메시지 앞에 있으면 Kafka 소비가 멈춰 빠른 작업까지 지연됐다. - 해결책으로 checker와 consumer group을 두 개의 처리 경로로 분리했다. - **Fast lane**: 빠르게 처리할 수 있는 일반 메시지 담당 - **Slow lane**: 처리 시간이 긴 메시지 전담 - 메시지의 예상 처리 시간을 빠르게 판단하고, fast lane이 느린 메시지를 만나면 건너뛰도록 했다. - 그 결과 느린 작업은 전용 자원을 사용하고, 빠른 작업은 지연 없이 계속 처리할 수 있었다. ## Postgres 대량 저장 최적화 - 기존 API는 인사이트 하나마다 별도의 `INSERT ... ON CONFLICT DO UPDATE` 쿼리를 실행했다. - 한 요청에 최대 50만 개의 인사이트가 포함될 수 있어, 최악의 경우 50만 번의 데이터베이스 왕복과 쿼리 실행이 발생했다. - 처음에는 임시 테이블에 `COPY`하는 Postgres 표준 대량 삽입 방식을 시도했지만, Postgres 시스템 테이블의 bloat가 증가하는 문제가 나타났다. - 최종적으로 입력 규모에 따른 하이브리드 방식을 채택했다. - 작은 데이터셋: `UNNEST`를 사용해 빠르게 삽입 - 큰 데이터셋: `COPY`를 사용해 대량 삽입 - 이 방식은 대규모 데이터에는 수초 수준의 처리 시간을, 소규모 데이터에는 밀리초 수준의 빠른 처리를 제공했다. ## 지역 간 지연으로 발생한 API 타임아웃 - 확장 과정에서 다음 현상이 관찰됐다. - 클라이언트 타임아웃 증가 - checker 처리 시간의 20~90%가 단일 API 호출에 소요 - 대량 검사 시 초기 처리량은 높지만 시간이 지나며 감소 - 원인은 API와 데이터베이스 간 네트워크 지연이었다. - 주 데이터베이스는 미국 오리건주 포틀랜드에 위치했다. - API는 포틀랜드와 네덜란드 암스테르담에서 active-active로 운영됐다. - 포틀랜드 API 호출은 평균 10ms였지만, 암스테르담 인스턴스에서는 거의 3초가 걸렸다. - 암스테르담 API가 데이터베이스 연결을 오래 점유하면서 checker의 클라이언트 연결 풀이 고갈됐다. - 연결을 기다리는 요청이 타임아웃되고, 암스테르담 API에 연결된 Kafka 파티션만 지속적으로 지연됐다. - 결국 API의 단순한 지역 분산이 전체 Kafka 소비 처리량의 불균형과 lag를 유발할 수 있음을 확인했다. ## 실용적인 결론 대규모 이벤트 처리 시스템에서는 소비자 수를 늘리는 것만으로 충분하지 않다. Kafka의 파티션 제약을 고려한 병렬 처리, 느린 작업의 별도 격리, 대량 데이터베이스 작업의 배치화, 데이터베이스와 API 간 지역 지연 관리까지 함께 최적화해야 안정적인 처리량 확장이 가능하다. 특히 분산 배포 환경에서는 평균 latency뿐 아니라 연결 풀 점유 시간과 파티션별 처리 편차까지 함께 측정해야 한다.

github

던전 & 데스크톱: GitHub Copilot CLI로 절차적으로 생성되는 로그라이크 만들기 (새 탭에서 열림)

GitHub Dungeons는 GitHub 저장소를 터미널에서 플레이할 수 있는 로그라이크 던전으로 변환한 Go 기반 GitHub CLI 확장이다. 저장소의 최신 커밋 SHA를 시드로 삼아 BSP(Binary Space Partitioning) 방식으로 방과 통로를 생성하므로, 같은 커밋에서는 같은 맵이 만들어지고 코드가 변경되면 던전도 달라진다. 저자는 GitHub Copilot CLI의 `/delegate`와 에이전트를 활용해 구현과 문서화를 위임하고, 게임 설계와 플레이 경험에 집중했다. ## 코드 저장소가 로그라이크 던전이 되는 방식 - 저장소의 코드 구조를 바탕으로 방, 통로, 적, 출구가 있는 던전을 생성한다. - 플레이어는 터미널에서 화살표 키로 이동하며 버그와 싸우고 출구를 찾아야 한다. - HP가 0이 되면 처음부터 다시 시작하는 영구 사망(permadeath) 구조를 따른다. - 저장소마다 맵의 구조가 달라지고, 커밋이 바뀔 때마다 새로운 레이아웃이 만들어진다. - 최신 커밋 SHA를 난수 생성의 시드로 사용한다. - 같은 커밋은 항상 같은 던전을 생성한다. - 서로 다른 저장소는 구조적으로 서로 다른 맵을 만든다. - 코드 변경은 던전의 변화로 이어진다. ## 로그라이크와 절차적 생성 - 로그라이크는 1980년대 게임 *Rogue*에서 시작된 장르다. - 주요 특징은 다음과 같다. - 실행할 때마다 달라지는 절차적 생성 맵 - 죽으면 다시 시작하는 영구 사망 - 텍스트 기반 인터페이스 - 절차적 생성은 콘텐츠를 사람이 하나씩 설계하는 대신, 규칙과 무작위성을 이용해 알고리즘으로 생성하는 방식이다. - 하나의 던전을 직접 만드는 것이 아니라, 여러 던전을 생성할 수 있는 시스템을 만든다는 점이 핵심이다. - 이러한 구조 덕분에 매 플레이마다 레이아웃과 상황이 달라져 반복 플레이가 가능해진다. ## BSP 기반 던전 생성 - BSP(Binary Space Partitioning)는 큰 공간을 반복해서 더 작은 영역으로 나누는 알고리즘이다. - 기본 흐름은 다음과 같다. - 전체 던전을 하나의 큰 직사각형 공간으로 설정한다. - 공간을 두 영역으로 분할한다. - 각 영역을 재귀적으로 다시 나눈다. - 충분히 작은 영역 안에 방을 배치한다. - 방들을 통로로 연결한다. - BSP가 로그라이크에 적합한 이유는 다음과 같다. - 직사각형 방을 만들기 쉽다. - 방 사이의 연결 구조를 보장하기 쉽다. - 완전히 무작위인 맵보다 구조적으로 이해하기 쉽다. - 일정한 규칙 안에서 무작위성이 생겨 매번 다른 맵을 만들 수 있다. - 결과적으로 맵은 무질서하지 않으면서도 반복 플레이에 적합하고, 막다른 길이나 이동 불가능한 구조를 줄일 수 있다. ## GitHub Copilot CLI를 활용한 개발 - 저자는 Go 문법을 모두 직접 작성하기보다, Copilot CLI에 원하는 동작을 자연어로 설명하는 방식으로 개발했다. - `/delegate` 명령은 작업을 클라우드에서 실행되는 Copilot 코딩 에이전트에 위임한다. - 개발자는 요구사항을 평문으로 작성한다. - 에이전트가 비동기적으로 코드를 구현한다. - 작업이 끝나면 결과가 Pull Request로 생성된다. - 개발자는 PR을 검토하고 수정해 완성도를 높인다. - 예를 들어 다음과 같은 요구를 위임했다. - 레벨이 올라갈수록 적을 늘리고, 대신 체력 회복 아이템도 추가하기 - 플레이어를 무적으로 만드는 치트 코드 추가하기 - Copilot이 초기 구현과 보일러플레이트를 맡는 동안 저자는 난이도 조정, 게임 메커니즘, 이스터 에그 등 플레이 경험에 집중했다. ## 에이전트를 통한 문서화 - 저자는 Copilot으로 “dungeon scribe”라는 별도 에이전트도 생성했다. - 이 에이전트는 다음 작업을 수행했다. - 던전 생성 방식에 대한 문서 작성 - ASCII 아트 다이어그램 생성 - BSP 기반 레이아웃 생성 과정 설명 - 이를 통해 구현 코드뿐 아니라 알고리즘의 동작 원리와 프로젝트 구조도 함께 문서화할 수 있었다. ## 실용적인 결론 절차적 생성과 커밋 기반 시드를 결합하면 코드 저장소 자체를 재현 가능하면서도 변화하는 게임 세계로 만들 수 있다. 또한 Copilot CLI의 `/delegate`처럼 구현 작업을 에이전트에 위임하고 결과를 PR 단위로 검토하는 방식은, 개발자가 반복적인 코딩보다 기능 설계와 사용자 경험에 집중하는 데 유용하다.

figma

PGKeeper: Postgres에 꼭 필요했던 보안관 만들기 | Figma 블로그 (새 탭에서 열림)

Figma는 데이터베이스 트래픽과 제품 규모가 커지면서 기존 PgBouncer의 확장성·부하 제어·연결 관리 한계에 부딪혔고, 이를 대체할 자체 서비스 PGKeeper를 구축했다. PGKeeper는 DBProxy와 PostgreSQL 사이에서 연결 풀링과 트래픽 관리를 담당하며, 과부하로부터 데이터베이스와 연결을 보호하는 것을 목표로 한다. 글은 Figma의 데이터베이스 구조와 PgBouncer를 교체하게 된 이유, 그리고 PGKeeper를 직접 개발한 배경을 설명한다. ## Figma의 PostgreSQL 데이터베이스 구조 - PostgreSQL은 Figma의 OLTP 시스템 기반이다. - 데이터 증가에 대응하기 위해 데이터베이스를 수평·수직으로 확장하고 여러 PostgreSQL 인스턴스를 운영했다. - 애플리케이션이 샤딩 구조를 직접 알 필요 없도록 **DBProxy**라는 요청 라우팅 계층을 구축했다. - DBProxy는 쿼리를 분석해 적절한 PostgreSQL 인스턴스를 선택하고, 필요하면 여러 인스턴스를 대상으로 쿼리를 재작성한다. - DBProxy와 PostgreSQL 사이에는 연결 풀러가 위치한다. - 각 PostgreSQL 머신에는 전용 연결 풀러 복제본 그룹이 배치되어, 여러 풀러가 하나의 데이터베이스에 연결되는 n-to-1 구조를 이룬다. ## PgBouncer가 한계에 도달한 이유 - **확장성 부족** - PgBouncer는 단일 스레드 아키텍처라 수직 확장에 한계가 있었다. - 복제본을 늘려 수평 확장했지만 트래픽 분배가 치우치면서 성능 저하가 발생했다. - **정교한 부하 관리 부재** - 중요한 트래픽을 낮은 우선순위의 문제성 트래픽보다 먼저 처리할 수 없었다. - 백프레셔가 없어 급격한 트래픽 증가를 우아하게 제어하기 어려웠다. - 대기 시간에 기반해 작업을 버리는 CoDel(Controlled Delay) 같은 부하 완화 알고리즘도 지원하지 않았다. - **연결 폭증과 연결 churn 위험** - PostgreSQL 연결은 많은 자원을 사용한다. - 연결이 빠르게 생성되거나 과도하게 재생성되면 데이터베이스 안정성이 크게 떨어진다. - 장애 이후 무제한으로 연결을 다시 만들면 복구 과정 자체가 PostgreSQL을 압박할 수 있다. - 이로 인해 연결 churn과 연쇄적인 과부하가 장시간 지속될 수 있다. - **확장성과 운영 제어의 한계** - 트래픽 유형별 admission control, 공정한 자원 분배 등 세밀한 정책이 필요했다. - 심층적인 관측성, 기능 플래그 기반의 안전한 롤아웃도 요구됐다. - PgBouncer에 작은 수정 사항을 유지하는 것만으로도 부담이 컸기 때문에, 대규모 확장은 장기적인 유지보수 비용을 초래할 가능성이 컸다. ## DBProxy에 연결 풀링을 통합하지 않은 이유 - PostgreSQL 인스턴스 하나의 연결 풀은 대략 100개 규모로 운영됐다. - 반면 DBProxy는 수백 개의 상태 비저장 복제본으로 구성됐다. - 각 DBProxy가 독립적으로 연결 풀을 관리하면: - 전체 PostgreSQL 연결 제한을 초과할 수 있고, - 복제본 간 복잡한 조정이 필요하며, - 고정된 소규모 연결 풀을 수백 개 인스턴스에 분산하기 어렵다. - 따라서 연결 풀링은 DBProxy 내부가 아니라 별도의 중앙화된 계층에서 담당해야 했다. ## PGCat 대신 자체 서비스를 만든 배경 - Figma는 PgBouncer의 단일 스레드 한계를 해결하기 위해 멀티스레드 PostgreSQL 프록시인 PGCat도 검토했다. - 그러나 필요한 기능을 추가하려면 PGCat의 핵심 실행 경로를 크게 수정해야 했다. - 관측성, 기능 플래그, admission control을 upstream에 반영하기도 쉽지 않았다. - 결국 PGCat을 포크해 장기적으로 유지해야 할 가능성이 높았으므로, Figma는 요구사항에 맞는 Go 기반 자체 서비스 **PGKeeper**를 개발했다. ## PGKeeper의 역할 - PGKeeper는 DBProxy와 PostgreSQL 사이에 위치하는 Go 서비스다. - 주요 목적은 다음과 같다. - 데이터베이스를 과도하거나 잘못된 트래픽으로부터 보호 - PostgreSQL 연결의 급격한 생성과 churn 방지 - 트래픽 우선순위와 자원 사용을 세밀하게 제어 - 대규모 환경에 맞는 확장성과 운영 도구 제공 - 이름은 골키퍼처럼 위험한 트래픽이 시스템을 압도하지 못하도록 막고, 연결 자체도 보호한다는 의미에서 붙여졌다. Figma의 사례는 단순히 연결 풀러를 교체한 것이 아니라, 데이터베이스 앞단에서 트래픽을 선별하고 과부하를 제어하는 별도 인프라 계층이 필요해졌음을 보여준다. PostgreSQL 연결 수가 제한적이고 프록시 복제본이 많은 환경에서는 풀링을 애플리케이션 프록시에 분산하기보다, 독립적인 계층으로 관리하는 편이 적합하다.

github

GitHub가 eBPF를 사용하여 배포 안전성을 향상시키는 방법 (새 탭에서 열림)

GitHub는 장애 상황에서도 배포를 계속할 수 있도록 배포 코드가 GitHub 자체나 다른 내부 서비스에 의존하는 순환 의존성을 차단하려 한다. 이를 위해 배포 프로세스만 별도 Linux cGroup에 배치하고, eBPF의 `BPF_PROG_TYPE_CGROUP_SKB`를 이용해 해당 프로세스의 네트워크 송신을 선택적으로 감시·차단하는 방식을 검토했다. 이 접근법은 호스트 전체의 네트워크를 막지 않으면서 배포 과정의 외부·내부 의존성을 검증할 수 있다는 점이 핵심이다. ## GitHub 배포의 순환 의존성 - GitHub는 자체 소스 코드를 `github.com`에 보관하므로, GitHub 장애 시 소스 코드 접근과 복구 배포가 동시에 어려워질 수 있다. - 이를 완화하기 위해 다음을 유지한다. - 장애 시 수정 배포를 위한 코드 미러 - 롤백에 사용할 사전 빌드된 배포 자산 - 하지만 배포 스크립트가 새롭게 순환 의존성을 만들 가능성은 여전히 남아 있다. - 내부 서비스 호출 - GitHub에서 바이너리 다운로드 - 실행 중인 도구의 자동 업데이트 확인 등 ## 순환 의존성의 세 가지 유형 ### 직접 의존성 - 배포 스크립트가 GitHub에서 오픈 소스 도구의 최신 릴리스를 직접 다운로드한다. - GitHub 장애로 릴리스 데이터를 제공할 수 없으면 배포 스크립트도 완료되지 않는다. ### 숨은 의존성 - 필요한 도구가 이미 호스트 디스크에 존재하더라도, 실행 시 업데이트 가능 여부를 확인할 수 있다. - 이때 도구가 GitHub에 접속하지 못하면: - 오류를 반환하고 실패하거나 - 네트워크 타임아웃으로 멈출 수 있다. - 코드만 검토해서는 이런 런타임 의존성을 발견하기 어렵다. ### 일시적·간접 의존성 - 배포 스크립트가 내부 마이그레이션 서비스 같은 다른 서비스를 API로 호출한다. - 해당 서비스가 다시 GitHub에서 최신 바이너리를 받으려 하면, 의존성이 여러 단계 뒤에서 발생한다. - 최종적으로 GitHub 장애가 내부 서비스와 배포 스크립트까지 연쇄적으로 실패시킨다. ## 기존 검증 방식의 한계 - 기존에는 각 상태 저장 호스트를 담당하는 팀이 배포 스크립트를 검토해 순환 의존성을 찾아야 했다. - 실제로는 많은 의존성이 장애가 발생한 뒤에야 드러난다. - 가장 단순한 검증 방법은 호스트에서 `github.com` 접근을 전부 차단하는 것이다. - 그러나 해당 호스트는 롤링 배포, 드레인, 재시작 중에도 고객 트래픽을 처리하므로 호스트 전체의 네트워크를 차단하면 운영 기능까지 손상된다. ## cGroup과 eBPF를 이용한 선택적 네트워크 차단 - eBPF는 Linux 커널에 사용자 정의 프로그램을 로드하고 네트워크 같은 핵심 시스템 동작에 연결할 수 있다. - GitHub가 주목한 프로그램 유형은 `BPF_PROG_TYPE_CGROUP_SKB`다. - 특정 cGroup의 네트워크 ingress/egress에 연결 가능 - 특히 프로세스 그룹의 외부 송신 트래픽을 제어할 수 있음 - cGroup은 프로세스 집합에 리소스 제한과 격리를 적용하는 Linux 기능이다. - Docker 전용 기능이 아니며 직접 생성·구성할 수 있다. - 따라서 다음 구조가 가능하다. - 배포 스크립트만 별도 cGroup에 배치 - 해당 cGroup의 egress 트래픽만 eBPF로 감시 - GitHub나 특정 내부 서비스로 향하는 연결만 차단 - 같은 호스트에서 실행 중인 고객 트래픽 처리 프로세스는 계속 네트워크 사용 ## Go와 `cilium/ebpf`를 이용한 구현 - GitHub는 Go 기반 proof of concept을 만들고 `cilium/ebpf` 라이브러리를 사용했다. - 이 라이브러리는 다음 작업을 단순화한다. - eBPF 프로그램과 맵을 읽고 수정 - 프로그램을 컴파일·로드 - 커널의 다양한 hook에 연결 - Go 코드에서는 다음 흐름으로 cGroup에 eBPF 프로그램을 연결한다. - 사전 컴파일된 eBPF 오브젝트와 맵을 커널에 로드 - `/sys/fs/cgroup/system.slice` 같은 cGroup 경로 지정 - `ebpf.AttachCGroupInetEgress`를 사용해 송신 트래픽 hook에 연결 - eBPF 맵에서 패킷 수 등 관측 데이터를 주기적으로 조회 - 예제 eBPF 프로그램은 `BPF_MAP_TYPE_ARRAY` 맵에 값을 저장하고, `cgroup_skb/egress` hook이 호출될 때마다 송신 패킷 수를 증가시키는 구조다. - 이처럼 먼저 트래픽을 관찰한 뒤, 특정 목적지에 대한 연결을 허용하거나 차단하는 정책으로 확장할 수 있다. ## 실용적인 의미 - 배포 시스템은 “호스트 전체를 격리”하는 대신 “배포 프로세스만 제한”할 수 있다. - 장애 대응 전에 GitHub, 내부 API, 자동 업데이트 서버 등 필수 경로에 대한 의존성을 실제 실행 환경에서 검증할 수 있다. - eBPF 기반 필터링은 숨은 의존성과 간접 의존성을 찾아내는 방어 계층으로 활용할 수 있다. - 다만 실제 운영에서는 차단 정책을 적용하기 전에 관찰 모드로 트래픽을 수집하고, 정상적인 고객 트래픽과 배포 트래픽이 정확히 분리되는지 검증하는 것이 바람직하다.

cloudflare

Cloudflare 이메일 서비스: 이제 퍼블릭 베타로 제공됩니다. 에이전트를 위한 준비 완료 (새 탭에서 열림)

Cloudflare Email Service가 퍼블릭 베타로 전환되며, AI 에이전트가 이메일을 주요 인터페이스로 활용할 수 있는 포괄적인 인프라를 제공합니다. 개발자는 이 서비스를 통해 별도의 API 키 관리나 복잡한 인증 설정 없이 Workers 내에서 직접 이메일을 수신, 처리 및 전송할 수 있는 환경을 구축할 수 있습니다. 결과적으로 이메일은 단순한 알림 수단을 넘어, 에이전트가 비동기적으로 복잡한 작업을 수행하고 사용자와 소통하는 독립적인 실행 채널로 진화하게 되었습니다. ### 이메일 전송 기능의 퍼블릭 베타 전환과 편의성 * **네이티브 Workers 바인딩:** Workers 내에서 `env.EMAIL.send`와 같은 간단한 코드로 이메일을 즉시 발송할 수 있으며, 복잡한 API 키나 시크릿 관리가 필요 없습니다. * **다양한 환경 지원:** Workers뿐만 아니라 REST API를 비롯해 TypeScript, Python, Go 언어용 SDK를 통해 어떤 플랫폼에서든 이메일 발송 기능을 연동할 수 있습니다. * **자동화된 도메인 인증:** 이메일 도달률의 핵심인 SPF, DKIM, DMARC 레코드를 Cloudflare가 자동으로 구성하여, 보낸 메일이 스팸으로 분류되지 않도록 관리합니다. * **글로벌 네트워크 활용:** Cloudflare의 전 세계적인 네트워크를 통해 지연 시간을 최소화하며 안정적인 전송 성능을 보장합니다. ### 이메일 기반 에이전트(Agentic Email)로의 진화 * **비동기적 작업 수행:** 실시간으로 즉시 응답해야 하는 챗봇과 달리, 에이전트는 이메일을 수신한 후 데이터를 처리하고 외부 시스템을 조회하는 등 장시간의 작업을 독립적으로 수행한 뒤 결과를 회신할 수 있습니다. * **Agents SDK 연동:** Agents SDK의 `onEmail` 훅을 사용하면 수신된 이메일을 기반으로 에이전트의 상태를 업데이트하거나 비동기 워크플로우를 트리거하는 것이 용이합니다. * **주소 기반 라우팅:** 특정 이메일 주소(예: support@example.com)를 특정 에이전트 인스턴스에 연결하는 주소 기반 리졸버를 통해 복잡한 로직 없이도 개별 에이전트에게 작업을 배분할 수 있습니다. ### 에이전트 구축을 위한 통합 툴킷 제공 * **새로운 도구 지원:** 효율적인 개발을 위해 Wrangler CLI용 이메일 명령어와 에이전트용 Email MCP(Model Context Protocol) 서버를 새롭게 도입했습니다. * **레퍼런스 앱 활용:** 오픈 소스로 공개된 'Agentic Inbox' 레퍼런스 앱을 통해 에이전트 전용 편지함과 워크플로우를 어떻게 구성하는지 구체적인 가이드를 얻을 수 있습니다. * **양방향 이메일 자동화:** 기존의 Email Routing(수신)과 신규 Email Sending(발신)을 결합하여, Cloudflare 플랫폼 내에서 이메일의 수신-처리-응답으로 이어지는 완전한 자동화 파이프라인을 완성했습니다. 기존의 복잡한 서드파티 이메일 API 연동이나 SMTP 설정에서 벗어나고 싶은 개발자에게 이번 퍼블릭 베타는 훌륭한 대안이 될 것입니다. 특히 고객 지원 시스템이나 인보이스 처리와 같이 비동기적인 워크플로우가 필수적인 AI 에이전트를 개발 중이라면, Cloudflare의 통합 개발 플랫폼을 활용해 인프라 관리 부담을 획기적으로 줄여보시길 추천합니다.

slack

커스텀에서 오픈으로: Prometheus를 활용한 확장 가능한 네트워크 프로빙 및 HTTP/3 준비성 (새 탭에서 열림)

Slack은 HTTP/3 도입 과정에서 기존 모니터링 도구가 QUIC/UDP 기반 엔드포인트를 측정하지 못하는 관측성 공백을 발견했다. 이를 해결하기 위해 Prometheus Blackbox Exporter에 `quic-go` 기반 HTTP/3 프로빙 기능을 추가하고 오픈소스로 공개했다. 그 결과 HTTP/1.1, HTTP/2, HTTP/3를 Grafana에서 통합 관찰하고 더 정확한 알림과 장애 분석이 가능해졌다. ### 기존 모니터링 도구의 한계 - Slack은 AWS Availability Zone 간 내부 트래픽과 인터넷에서 인프라로 유입되는 외부 트래픽을 상용 SaaS 및 자체 도구로 측정해 왔다. - HTTP/3는 TCP 대신 UDP 기반의 QUIC 프로토콜을 사용한다. - 기존 SaaS 관측성 도구 대부분은 HTTP/3 프로빙을 기본 지원하지 않았다. - 핵심 모니터링 도구인 Prometheus Blackbox Exporter(BBE)에도 QUIC 네이티브 지원이 없었다. - 수십만 개의 HTTP/3 엔드포인트를 측정할 수 없어 HTTP/2로의 회귀, 실제 왕복 시간(RTT), 클라이언트 관점의 성능 변화를 파악하기 어려웠다. ### `quic-go` 기반 HTTP/3 프로브 구현 - 인턴 Sebastian Feliciano가 BBE에 QUIC 지원을 구현하고 오픈소스로 기여했다. - Go용 QUIC 라이브러리로 널리 사용되는 `quic-go`를 선택했다. - HTTP/3 전송 계층을 다음과 같이 구성해 기존 HTTP 클라이언트에 연결했다. ```go http3Transport := &http3.Transport{ TLSClientConfig: tlsConfig, QUICConfig: &quic.Config{}, } client = &http.Client{ Transport: http3Transport, } ``` - BBE의 기존 설정 방식과 아키텍처를 유지해 새로운 프로브도 기존 기능과 조합할 수 있도록 설계했다. - 이를 통해 HTTP/3 엔드포인트에 대해 설정 가능한 Prometheus 프로브가 제공됐다. ### 오픈소스 기여와 사내 통합 - 새로운 기능을 Prometheus BBE에 upstream 기여해 다른 조직도 사용할 수 있게 했다. - 오픈소스 PR의 병합을 기다리는 동안, Slack은 새 기능을 활용하는 사내 프로빙 시스템도 별도로 설계했다. - 결과적으로 외부 공개 기능과 Slack 인프라에 맞춘 운영 시스템을 함께 확보했다. ### 통합 관측성과 운영 개선 - Grafana에서 HTTP/1.1, HTTP/2, HTTP/3 지표를 하나의 화면에서 확인할 수 있게 됐다. - 프로토콜별 성능을 비교하고 다른 텔레메트리와 상관관계를 분석하기 쉬워졌다. - HTTP/3 엔드포인트의 상태와 성능을 기반으로 더 정확하고 신뢰성 높은 알림을 만들 수 있게 됐다. - 장애 발생 시 관련 지표를 한곳에서 확인해 원인 분석과 디버깅 속도를 높였다. ### 향후 확장 방향 - **SNI 라우팅 테스트** - 공유 IP를 사용하는 CDN이나 멀티테넌트 로드밸런서에서 요청한 호스트명이 올바른 백엔드로 라우팅되는지 검증한다. - 올바른 TLS 인증서가 반환되는지도 확인해 잘못된 라우팅을 방지할 수 있다. - **종단 간 네트워크 경로 시각화** - 단순한 성공/실패 확인을 넘어 모니터링 에이전트부터 서비스까지의 네트워크 홉을 시각화한다. - 지연 증가나 패킷 손실이 어느 구간에서 발생했는지 파악할 수 있다. ### 실무적인 시사점 - 새로운 프로토콜이나 인프라로 마이그레이션하기 전에 먼저 관측성을 확보해야 한다. - 기존 도구에 기능이 없을 때 직접 구현하고 오픈소스로 공유하면 조직과 커뮤니티 모두의 비용을 줄일 수 있다. - HTTP/3 도입을 검토하는 팀이라면 Prometheus Blackbox Exporter의 QUIC 프로브를 활용해 마이그레이션 전후 성능과 장애를 지속적으로 비교하는 것이 좋다.

grammarly

Superhuman Go, Box, Gamma, (새 탭에서 열림)

Superhuman Go는 기업용 지식 관리, 시각적 콘텐츠 제작, 대화형 학습 도구를 사용자의 워크플로우 내에 직접 통합하여 업무 효율을 대폭 확장했습니다. 사용자는 여러 애플리케이션을 오가는 번거로움 없이 현재 작업 중인 환경에서 즉각적으로 정보를 요약하고 결과물을 생성할 수 있습니다. 이러한 통합 에이전트 생태계는 단순한 도구 모음을 넘어, 데이터 추출부터 최종 실행까지의 과정을 단절 없이 연결하는 강력한 생산성 환경을 구축하는 데 초점을 맞추고 있습니다. **기업 지식 통합 및 업무 프로세스 최적화** * **Box**: 문서 저장소와 Go를 직접 연결하여 기존 파일에서 지식을 요약 및 추출하고, 적절한 폴더에 새 문서를 즉시 생성하여 문서 재사용성을 극대화합니다. * **Common Room**: 다양한 채널에 흩어진 구매자 인텔리전스를 워크플로우로 가져와 맥락 전환 없이 비즈니스 의사결정을 지원합니다. * **Fireflies**: 과거 회의의 핵심 결정 사항과 후속 조치(Action Items)를 요약하여 사용자가 회의 흐름을 빠르게 파악하고 업무에 집중할 수 있게 합니다. **시각적 창작 및 프레젠테이션 자동화** * **Gamma**: 메모나 회의록 같은 가공되지 않은 텍스트를 구조화된 프레젠테이션 슬라이드로 즉시 변환하여 반복적인 포맷팅 작업을 제거합니다. * **Napkin AI**: 텍스트 형태의 콘텐츠를 시각적 프레임워크로 변환하여 복잡한 메시지를 명확하게 전달하고 구성원의 행동을 유도합니다. **대화형 학습 및 정보 습득 가속화** * **Wayground**: 현재 화면에 띄워진 이메일, 웹페이지, 문서의 맥락을 분석하여 퀴즈나 플래시카드 형태의 학습 자료를 즉석에서 생성합니다. * **Quizlet**: 메모나 에세이를 한 번의 프롬프트로 플래시카드로 변환하여 작성 단계에서 학습 단계로 빠르게 전환할 수 있도록 돕습니다. * **Speechify**: 텍스트를 AI 음성으로 변환하여 최대 4.5배 빠른 속도로 청취할 수 있게 함으로써 정보 습득 효율을 높입니다. **전문성 강화 및 신뢰도 확보** * **Parallel & Latimer**: 실시간 데이터 기반의 팩트 체크와 인용 제안(Parallel) 및 내부 데이터 검색과 편향 감지(Latimer)를 통해 작업물의 정확성과 공정성을 높입니다. * **Saifr**: 금융 분야의 규제 위험을 실시간으로 감지하고 대안 문구를 제안하여 법적 준수성을 갖춘 외부 커뮤니케이션을 지원합니다. * **Radical Candor**: Kim Scott의 프레임워크를 바탕으로 명확하면서도 배려 있는 피드백을 작성할 수 있도록 가이드를 제공합니다. **에이전트 생태계 확장 및 배포** * **SDK 및 MCP 클라이언트**: 조직이 자체적인 에이전트를 구축하여 Go 환경 내에서 활용할 수 있도록 개발 도구를 제공하며, 현재 비공개 베타를 운영 중입니다. * **플랫폼 지원**: 현재 크롬(Chrome) 및 엣지(Edge) 브라우저 확장 프로그램에서 사용 가능하며, 향후 macOS 및 Windows 전용 앱으로도 출시될 예정입니다. 이번 업데이트는 사용자가 도구 간 이동에 낭비하는 '컨텍스트 스위칭' 비용을 최소화하고, 화면상의 맥락을 이해하는 에이전트를 통해 실시간 생산성을 높이는 데 주력하고 있습니다. 복잡한 데이터 정리나 반복적인 프레젠테이션 제작에 시간을 많이 소비하는 조직이라면, Superhuman Go의 에이전트 생태계를 통해 워크플로우를 자동화하고 업무의 질을 높여보시길 권장합니다.

cloudflare

2026년 (새 탭에서 열림)

2026년 2월 20일, Cloudflare는 사용자 지정 IP(BYOIP) 서비스 관리 방식의 변경 과정에서 발생한 소프트웨어 오류로 인해 약 6시간 동안 서비스 장애를 겪었습니다. 이번 장애는 내부 자동화 시스템이 유효한 IP 접두사(Prefix)들을 실수로 인터넷 경로(BGP)에서 철회하면서 발생했으며, 이로 인해 일부 고객 서비스와 Cloudflare의 1.1.1.1 웹사이트 접속이 불가능해졌습니다. Cloudflare는 즉각적인 롤백과 수동 복구 작업을 통해 문제를 해결했으며, 향후 자동화 배포의 안전성을 강화하기 위한 체계적인 개선을 약속했습니다. ### Addressing API와 자동화 프로세스의 결함 * **Addressing API의 역할**: Cloudflare 네트워크에 존재하는 주소 데이터의 단일 진실 공급원(Source of Truth)으로, 여기서 발생한 변경 사항은 즉시 전 세계 에지(Edge) 네트워크로 전파됩니다. * **위험한 수동 작업의 자동화**: 기존에 수동으로 이루어지던 BYOIP 접두사 삭제 작업을 자동화하기 위해 '정기 정리 하위 태스크'를 도입했습니다. 이는 배포 규모를 작게 유지하고 안전성을 높이려는 'Code Orange: Fail Small' 프로젝트의 일환이었습니다. * **API 쿼리 버그**: 정리 태스크가 API를 호출할 때 `pending_delete` 매개변수를 처리하는 로직에 버그가 있었습니다. 삭제 대기 중인 객체만 불러와야 했으나, 코드상에서 매개변수의 존재 여부만 체크하는 오류로 인해 정상적인 접두사들까지 삭제 대상에 포함되는 결과를 초래했습니다. ### 고객 서비스 영향 및 BGP 경로 탐색 현상 * **IP 접두사 철회**: 전체 BYOIP 접두사 중 약 25%에 해당하는 1,100개의 접두사가 인터넷 광고에서 제외되었습니다. 이로 인해 해당 IP를 사용하는 서비스는 외부에서 접근할 수 없는 상태가 되었습니다. * **BGP 경로 탐색(Path Hunting)**: 접두사가 철회되자 사용자 연결은 목적지를 찾기 위해 여러 네트워크를 헤매는 '경로 탐색' 현상을 겪었으며, 결국 연결 타임아웃과 실패로 이어졌습니다. * **특정 서비스 오류**: Cloudflare의 재귀 DNS 리졸버 웹사이트(1.1.1.1) 접속 시 403 오류("Edge IP Restricted")가 발생했습니다. 다만, 실제 DNS 질의 서비스와 DoH(DNS over HTTPS)는 이번 장애의 영향을 받지 않았습니다. ### 복구 과정에서의 기술적 난관 * **단계적 복구**: 엔지니어들이 변경 사항을 감지하고 롤백을 시작하면서 약 800개의 접두사가 먼저 복구되었습니다. 일부 고객은 대시보드를 통해 직접 IP를 재광고함으로써 자가 복구를 수행하기도 했습니다. * **소프트웨어 버그로 인한 지연**: 나머지 300여 개의 접두사는 단순한 경로 철회를 넘어 에지 서버에서 서비스 구성 정보 자체가 삭제되는 추가적인 소프트웨어 버그가 발생했습니다. 이로 인해 대시보드 설정만으로는 복구가 불가능했습니다. * **수동 상태 전파**: 엔지니어들은 삭제된 설정 상태를 에지 서버에 다시 강제로 전파하는 수동 작업을 수행해야 했으며, 장애 발생 6시간 7분 만인 23:03 UTC에 모든 서비스가 정상화되었습니다. Cloudflare는 이번 사고를 계기로 모든 주소 관리 워크플로우에서 수동 개입을 완전히 배제하고, 자동화된 헬스 체크 기능을 강화할 계획입니다. BYOIP를 사용하는 기업 고객은 유사한 장애 발생 시 Cloudflare 대시보드를 통해 IP 광고 상태를 직접 제어함으로써 복구 시간을 단축할 수 있는 운영 매뉴얼을 숙지해 두는 것이 권장됩니다.

datadog

Agent Go 바이너리 크기를 최대 77% 줄인 방법 (새 탭에서 열림)

Datadog은 에이전트 바이너리 크기가 5년 사이 3배 이상 비대해진 문제를 해결하기 위해, 기능 삭제 없이 Go 바이너리 크기를 최대 77% 줄이는 성과를 거두었습니다. 이들은 체계적인 의존성 감사, 코드 리팩토링, 링커 최적화 복원을 통해 1.22 GiB에 달하던 아티팩트를 5년 전 수준으로 되돌렸으며, 이 과정에서 발견한 Go 컴파일러의 특성을 활용해 Kubernetes 등 다른 대규모 오픈소스 프로젝트에도 기여했습니다. ### 데이터독 에이전트의 빌드 구조와 비대화 문제 * 데이터독 에이전트는 단일 제품처럼 보이지만, 실제로는 OS, 아키텍처, 환경(Docker, K8s, IoT 등)에 따라 수십 개의 서로 다른 빌드 구성을 가집니다. * 수백 개의 외부 라이브러리(Cloud SDK, 컨테이너 런타임 등)를 사용하며, Go 빌드 태그와 의존성 주입(Dependency Injection)을 통해 기능을 제어합니다. * 5년간의 기능 추가로 인해 Linux amd64 패키지의 압축 전 크기가 428MiB에서 1,248MiB로 약 192% 증가했으며, 이는 네트워크 비용 상승과 서버리스/IoT 환경에서의 사용 제약을 초래했습니다. ### Go 의존성 제거를 위한 전략적 접근 * **컴파일러의 패키지 처리 이해**: Go 컴파일러는 패키지 단위로 동작하며, 빌드 제약 조건에 맞는 파일 내에서 `main` 패키지로부터 전역적으로 도달 가능한(reachable) 모든 임포트를 포함합니다. * **빌드 태그 활용**: 불필요한 의존성을 포함하는 파일에 특정 빌드 태그(`//go:build`)를 추가하여, 해당 기능이 필요 없는 빌드에서는 컴파일 단계부터 제외되도록 구성했습니다. * **심볼 분리 및 리팩토링**: 무거운 의존성을 사용하는 특정 함수나 심볼을 별도의 패키지로 격리했습니다. 이를 통해 해당 기능이 꼭 필요한 바이너리에서만 해당 패키지를 임포트하도록 구조를 개선했습니다. ### 바이너리 분석 및 시각화 도구 활용 * **`go list`**: 특정 OS와 아키텍처, 빌드 태그 조합에서 포함되는 패키지 목록을 추출하여 의존성 현황을 파악했습니다. * **`goda`**: 패키지 임포트 관계를 그래프로 시각화하여, 특정 무거운 패키지가 어떤 경로를 통해 바이너리에 포함되었는지 추적했습니다. * **`go-size-analyzer`**: 바이너리 내부에서 각 의존성 패키지가 차지하는 실제 바이트 크기를 텍스트나 인터팩티브 웹 화면으로 분석하여 최적화 우선순위를 정했습니다. * **링커의 한계 파악**: 단순 임포트만으로도 `init` 함수 실행이나 전역 변수 초기화가 발생하여 링커가 해당 코드를 제거하지 못하는 경우가 있음을 확인하고 이를 관리했습니다. 대규모 Go 프로젝트에서 바이너리 크기를 줄이려면 단순한 코드 최적화를 넘어, `goda`나 `go-size-analyzer` 같은 도구로 의존성 그래프를 분석하고 빌드 태그를 활용해 패키지 간의 결합도를 낮추는 아키텍처적 접근이 필수적입니다. 특히 사용하지 않는 기능이 `init` 함수나 리플렉션(reflection)으로 인해 링커 최적화를 방해하지 않도록 주의 깊게 설계해야 합니다.

dropbox

Dropbox Dash의 실시간 (새 탭에서 열림)

Dropbox Dash는 흩어져 있는 업무 데이터를 통합하여 실시간으로 답변과 검색 결과를 제공하는 AI 도구이며, 이 시스템의 핵심은 머신러닝 모델에 필요한 데이터 신호인 '피처(Feature)'를 관리하고 전달하는 피처 스토어입니다. 수만 개의 문서 중 가장 관련성 높은 정보를 순위화하기 위해 드롭박스는 온프레미스와 클라우드가 결합된 하이브리드 인프라 위에서 초저지연 읽기와 실시간 데이터 업데이트가 가능한 독자적인 피처 스토어를 구축했습니다. 결과적으로 이 시스템은 수천 개의 피처를 병렬로 조회하면서도 100ms 미만의 응답 속도를 유지하여 사용자에게 최적화된 검색 경험을 제공합니다. ### 하이브리드 인프라를 위한 설계 목표와 요구사항 * **복합적인 인프라 환경 대응:** 저지연 통신을 위한 온프레미스 에코시스템과 대규모 데이터 처리를 위한 Spark 기반 클라우드 환경을 동시에 지원해야 했습니다. * **대규모 병렬 조회 처리:** 사용자 쿼리 하나당 수천 건의 피처 룩업(Lookup)이 발생하므로, 엄격한 지연 시간 예산 내에서 막대한 병렬 읽기를 처리할 수 있는 구조가 필요했습니다. * **실시간성 확보:** 사용자의 최근 행동(문서 열람, 채널 참여 등)이 몇 초 내에 다음 검색 결과에 반영될 수 있도록 빠른 데이터 수집 파이프라인이 요구되었습니다. * **통합 프레임워크 구축:** 실시간 스트리밍과 배치 처리를 통합하여 엔지니어가 아이디어 단계부터 실제 배포까지 빠르게 진행할 수 있는 환경을 목표로 했습니다. ### Feast와 Dynovault를 활용한 아키텍처 설계 * **Feast 프레임워크 채택:** 피처 정의와 인프라 구현을 분리하고 모듈화된 어댑터 생태계를 가진 Feast를 선택하여 인프라 복잡성을 추상화했습니다. * **Dynovault 활용:** 드롭박스 자체 개발 DynamoDB 호환 스토리지인 Dynovault를 온라인 저장소로 사용하여 공용 인터넷 호출 없이 약 20ms의 클라이언트 지연 시간을 달성했습니다. * **관측 가능성 강화:** 작업 실패 모니터링, 데이터 신선도 추적, 데이터 계보(Lineage) 가시성 등을 추가하여 안정적인 운영 기반을 마련했습니다. ### Go 언어 재작성을 통한 성능 최적화 * **Python SDK의 한계 극복:** 초기 Python 기반 구현에서는 JSON 파싱 속도와 GIL(Global Interpreter Lock)로 인해 동시성 처리에 병목이 발생했습니다. * **고성능 서빙 레이어 구축:** 서빙 레이어를 Go 언어로 재작성하고 가벼운 고루틴(Goroutine)과 공유 메모리를 활용하여 동시성 성능을 극대화했습니다. * **지연 시간 단축:** 최적화 결과 p95 기준 지연 시간을 25~35ms 수준으로 유지하며, 초당 수천 개의 요청을 처리할 수 있는 확장성을 확보했습니다. ### 효율적인 데이터 신선도 유지 전략 * **계층화된 수집 방식:** 복잡한 연산이 필요한 데이터는 메달리온 아키텍처(Medallion architecture) 기반의 배치 수집을, 실시간 신호는 스트리밍 방식을 병행합니다. * **지능형 변경 감지:** 모든 데이터를 매번 다시 쓰는 대신 변경된 레코드만 온라인 스토어에 기록하는 방식을 도입했습니다. * **비용 및 성능 최적화:** 변경 감지 기술을 통해 쓰기 작업량을 수억 건에서 백만 건 미만으로 줄여 업데이트 시간을 단축하고 인프라 부하를 최소화했습니다. 이러한 드롭박스의 접근 방식은 기성 제품을 그대로 사용하기보다 오픈소스를 활용해 내부 인프라에 최적화된 형태로 커스터마이징하는 것이 대규모 AI 서비스 운영에 얼마나 중요한지를 잘 보여줍니다. 특히 성능 병목 지점을 정확히 파악하여 서빙 레이어를 Go로 전환한 결정은 지연 시간에 민감한 실시간 랭킹 시스템 구축 시 고려해 볼 만한 전략입니다.

datadog

수작업으로 튜닝한 Go에서 자기 최적화 코드까지: BitsEvolve 구축하기 (새 탭에서 열림)

Datadog은 대규모 인프라에서 Go 언어로 작성된 핵심 함수의 성능을 최적화하여 연간 수십만 달러의 비용을 절감했으며, 이 과정에서 얻은 노하우를 'BitsEvolve'라는 내부 AI 에이전트 시스템으로 자동화했습니다. 단순히 코드 효율을 높이는 것에 그치지 않고, 호출 빈도가 높고 오토스케일링이 적용되는 '핫 패스(Hot-path)' 지점을 데이터 기반으로 식별하여 실제 비즈니스 가치인 비용 절감으로 연결했습니다. 이 글은 전문가의 수동 최적화 기법이 어떻게 대규모 조직을 위한 자동화된 성능 최적화 시스템의 청사진이 되었는지를 상세히 설명합니다. ### 최적화 대상 선정을 위한 세 가지 조건 성능 최적화가 실제 인프라 비용 절감으로 이어지기 위해서는 다음과 같은 조건이 충족되어야 합니다. * **실행 규모:** 함수가 연간 수백만 또는 수십억 번 이상 호출되는 핵심 경로에 있어야 합니다. * **오토스케일링 환경:** CPU 사용량 감소가 단순히 서버의 유휴 시간을 늘리는 것이 아니라, 실제 운영되는 머신 대수의 감소로 이어질 수 있도록 공격적인 오토스케일링이 적용된 서비스여야 합니다. * **유의미한 자원 절감:** 전체 컴퓨팅 자원의 0.5%와 같이 작은 비중을 차지하는 함수라도, 대규모 호출 환경에서는 수만 달러의 비용 절감 효과를 낼 수 있는 지점을 타겟팅합니다. ### 컴파일러 경계 검사 제거를 통한 성능 향상 가장 빈번하게 호출되는 태그 정규화 함수(`isNormalizedASCIITag`)를 최적화하기 위해 하위 수준의 분석을 수행했습니다. * **문제 식별:** Compiler Explorer를 활용해 어셈블리 코드를 분석한 결과, Go 컴파일러가 루프 내부에서 인덱싱 안전성을 확신하지 못해 불필요한 배열 경계 검사(`runtime.panicBounds`)를 반복 실행하는 것을 발견했습니다. * **코드 재구조화:** 컴파일러가 경계 검사를 생략할 수 있도록 루프 구조를 미세하게 재설계했습니다. * **결과:** 함수 실행 속도가 25% 향상되었으며, 이는 서비스 전체 CPU 사용량의 0.75% 감소와 연간 수만 달러의 비용 절감으로 이어졌습니다. ### 관측 데이터 기반의 비관적 코드 개선 모든 예외 상황을 고려하는 방어적인 코드를 실제 데이터에 기반하여 '낙관적'으로 개선함으로써 극적인 성능 향상을 이뤄냈습니다. * **데이터 분석:** 임의의 입력을 처리하는 함수(`NormalizeTagArbTagValue`)가 모든 바이트를 의심하며 검사하고 있었으나, 관측 결과 입력값의 97%가 단순 ASCII였으며 잘못된 UTF-8 데이터는 0.01% 미만이었습니다. * **Fast-path 도입:** 대다수를 차지하는 일반적인 케이스(ASCII)를 즉시 통과시키는 최적화 경로를 추가하여 예외 처리 로직의 부하를 줄였습니다. * **결과:** 해당 함수의 성능을 90% 이상 개선하여 연간 수십만 달러의 인프라 비용을 절감하는 성과를 거두었습니다. ### 수동 최적화에서 에이전틱 자동화 시스템으로의 확장 전문 엔지니어의 수동 최적화는 성과가 크지만 조직 전체로 확장하기 어렵다는 한계가 있습니다. * **BitsEvolve 구축:** 전문가들이 수동 최적화 과정에서 사용한 휴리스틱과 분석 기법을 LLM 기반의 에이전틱 시스템인 'BitsEvolve'의 로직으로 이식했습니다. * **반복 가능한 프로세스:** 특정 전문가의 '영웅적 활약'에 의존하던 방식에서 벗어나, 관측 가능한 데이터를 기반으로 최적화 지점을 찾고 코드를 수정하는 과정을 자동화하고 표준화했습니다. * **지식의 자산화:** 수동으로 해결한 복잡한 최적화 사례들은 AI 시스템이 학습하고 모방해야 할 중요한 데이터 세트이자 벤치마크가 되었습니다. 성능 최적화의 진정한 가치는 단순히 실행 시간을 단축하는 것이 아니라, 관측 데이터(Observability)를 통해 비즈니스 비용과 직결된 병목 구간을 정확히 찾아내는 데 있습니다. 대규모 시스템을 운영하는 엔지니어라면 방어적인 코딩 관습에 의문을 제기하고, 실제 트래픽 특성을 반영한 'Fast-path' 설계와 컴파일러 최적화 원리를 이해함으로써 가시적인 비용 절감을 실현할 수 있습니다.

datadog

수백 개의 파드에서 Go 1.24 메모리 회귀를 추적해 찾아낸 방법 (새 탭에서 열림)

Go 1.24로의 업그레이드 이후, 새로운 맵 구현인 스위스 테이블(Swiss Tables)에 대한 기대와 달리 일부 서비스에서 메모리 사용량(RSS)이 약 20% 증가하는 현상이 발견되었습니다. 조사 결과, Go 런타임 내부의 메모리 관리 지표는 안정적이었으나 시스템 레벨의 실제 물리 메모리 점유가 늘어난 것으로 확인되었습니다. 이는 Go 1.24에서 진행된 `mallocgc` 함수의 리팩토링 과정에서 발생한 미묘한 메모리 할당자 회귀(Regression) 현상이 원인이었습니다. ### 런타임 지표와 시스템 지표의 불일치 * Go 1.24 업그레이드 후 데이터 처리 서비스의 RSS(Resident Set Size)가 눈에 띄게 증가했으나, Go 런타임 지표와 힙 프로파일상에는 아무런 변화가 기록되지 않았습니다. * 이는 Go 런타임 입장에서는 메모리를 더 사용하고 있지 않다고 판단하지만, 운영체제(Linux) 입장에서는 프로세스가 더 많은 물리 메모리를 점유하고 있는 상태임을 의미합니다. * Kubernetes의 메모리 제한(Limit)이나 OOM 킬러는 시스템 지표인 RSS를 기준으로 작동하기 때문에, 런타임 지표에 나타나지 않는 이러한 증가는 서비스 안정성에 치명적일 수 있습니다. ### 주요 변경 사항에 대한 가설 검증 * 먼저 Go 1.24의 핵심 변화인 '스위스 테이블'과 '스핀 비트 뮤텍스(Spin bit mutex)'를 원인으로 의심하고 실험을 진행했습니다. * `GOEXPERIMENT=noswissmap` 및 `GOEXPERIMENT=nospinbitmutex` 플래그를 사용하여 해당 기능들을 각각 비활성화한 후 빌드하여 배포했으나, 메모리 증가 현상은 해결되지 않았습니다. * 이를 통해 이번 문제는 새로운 기능 자체가 아니라, 런타임의 더 깊은 곳에서 발생한 변화 때문임을 확인했습니다. ### 가상 메모리와 물리 메모리의 매핑 분석 * 리눅스의 `/proc/[pid]/smaps` 파일을 분석하여 프로세스의 메모리 영역별 가상 메모리(Size)와 물리 메모리(RSS)의 차이를 추적했습니다. * 분석 결과, Go 1.23에서는 힙 영역의 RSS가 가상 메모리 크기보다 약 300 MiB 낮게 유지되었으나, Go 1.24에서는 가상 메모리 크기와 RSS가 거의 일치하는 현상이 발견되었습니다. * 결과적으로 Go 1.24의 런타임이 이전 버전보다 가상 메모리를 실제 물리 RAM에 더 공격적으로 할당(Commit)하고 있다는 사실을 밝혀냈습니다. ### mallocgc 리팩토링과 할당자 이슈 * Go 1.24 변경 로그를 정밀 분석한 결과, 메모리 할당의 핵심 로직인 `mallocgc` 함수에 대대적인 리팩토링이 있었음을 확인했습니다. * 이 과정에서 발생한 의도치 않은 로직 변화가 할당된 메모리를 실제 물리적 공간에 매핑하는 방식에 영향을 주어 RSS 상승을 유도한 것으로 파악되었습니다. * 작성자는 이 문제를 Go 개발 팀과 공유하여 원인을 확인했으며, 이는 런타임 리팩토링으로 인한 성능 회귀의 일종으로 결론지어졌습니다. Go 1.24 업그레이드를 고려 중인 팀은 런타임 내부 지표(Heap usage)뿐만 아니라 시스템 레벨의 RSS 지표를 면밀히 모니터링해야 합니다. 비록 메모리 할당자에서 미묘한 RSS 증가가 관측되었지만, 동시에 도입된 스위스 테이블은 대규모 인메모리 맵을 사용하는 서비스에서 수백 기가바이트의 메모리를 절약할 수 있는 잠재력을 가지고 있으므로 서비스 특성에 따른 비교 분석이 필요합니다.

datadog

Go 1.24의 Swiss (새 탭에서 열림)

Datadog이 Gartner의 2026년 Observability Platforms 매직 쿼드런트에서 ‘Leader’로 선정되었다는 소식을 알리는 글입니다. 제공된 내용은 선정 사실과 Datadog의 제품·플랫폼 영역을 소개하는 내비게이션 중심이며, 평가 기준이나 구체적인 비교 분석은 포함되어 있지 않습니다. ### Gartner 매직 쿼드런트 리더 선정 - Datadog은 Gartner® Magic Quadrant™ for Observability Platforms 2026에서 Leader로 소개되었습니다. - 관련 Gartner 보고서 및 Datadog 발표 페이지로 연결되는 링크가 제공됩니다. - 본문에는 Gartner의 평가 근거, 경쟁사 비교, 점수 또는 세부 순위는 제시되지 않았습니다. ### 인프라 및 애플리케이션 모니터링 - 인프라 모니터링, 메트릭, 컨테이너와 Kubernetes 모니터링을 제공합니다. - 네트워크, 서버리스, GPU, 스토리지 및 클라우드 비용 관리 기능을 포함합니다. - 애플리케이션 성능 모니터링(APM), 서비스 모니터링, 지속적 프로파일링, 동적 계측도 지원합니다. ### 로그·데이터 관측성 - 로그 관리, 민감 데이터 스캐닝, 감사 추적, Observability Pipelines를 제공합니다. - 데이터베이스, 데이터 스트림, 데이터 품질, 데이터 작업(Job) 모니터링 기능을 포함합니다. - 수집된 로그와 데이터를 처리·필터링하고 보안 및 운영 분석에 활용할 수 있도록 구성되어 있습니다. ### 보안과 디지털 경험 - 코드 보안, SAST·IAST, 소프트웨어 구성 분석, IaC 및 클라우드 보안 기능을 제공합니다. - Cloud SIEM, 워크로드 보호, 애플리케이션·API 보호, 취약점 관리도 제품 범위에 포함됩니다. - 브라우저·모바일 RUM, 세션 리플레이, 신디틱 모니터링, 오류 추적, 제품 분석을 통해 사용자 경험을 관찰합니다. ### 소프트웨어 제공과 서비스 관리 - CI Visibility, 테스트 최적화, 지속적 테스트, 코드 커버리지, 기능 플래그를 제공합니다. - 내부 개발자 포털과 IDE 플러그인 등 개발자 생산성 기능도 포함합니다. - 이벤트 관리, 서비스 카탈로그, SLO, 인시던트 대응, 워크플로 자동화 기능으로 운영 프로세스를 지원합니다. ### AI 기반 관측성 - Bits AI Agents, Bits Chat, Bits Investigation 등 AI 기반 분석·조사 기능을 제공합니다. - AI 에이전트 관측성, GPU 모니터링, MCP Server 및 에이전트 디렉터리도 제품군에 포함됩니다. - 이러한 기능은 모니터링 데이터를 바탕으로 문제 탐색과 운영 자동화를 지원하는 방향으로 구성되어 있습니다. 실제로 Datadog 도입을 검토한다면 ‘Leader’라는 선정 결과만으로 판단하기보다, 필요한 로그·메트릭·트레이스 범위, 데이터 보존 비용, 기존 클라우드와의 통합성, 보안 및 AI 기능의 실제 운영 효과를 별도로 검증하는 것이 좋습니다.

datadog

Go 1.24의 스위스 테이블로 수백 기가바이트를 절약한 방법 (새 탭에서 열림)

Go 1.24에서 도입된 새로운 맵(map) 구현체인 '스위스 테이블(Swiss Tables)'은 대규모 인메모리 데이터를 다루는 서비스에서 획기적인 메모리 절감 효과를 제공합니다. Datadog의 실제 서비스 적용 사례에 따르면, 특정 고부하 환경에서 라이브 힙(Live Heap) 사용량이 500 MiB 감소했으며, 가비지 컬렉터(GOGC)의 영향을 고려할 때 전체 물리 메모리(RSS)는 약 1 GiB까지 절약되었습니다. 이는 Go 1.24의 다른 런타임 오버헤드를 상쇄하고도 남는 수준의 성능 향상을 보여줍니다. **실서비스에서의 메모리 절감 수치** * `ShardRouter` 패키지 내의 `shardRoutingCache`라는 대형 맵에서 약 500 MiB의 라이브 힙 사용량이 감소했습니다. * Go의 기본 GOGC 설정(100)을 기준으로 계산하면, 힙 사용량 감소는 실제 물리 메모리(RSS)에서 약 1 GiB(500 MiB x 2)의 절감으로 이어집니다. * Go 1.24의 다른 회귀 문제(mallocgc 이슈)로 인해 예상되는 400 MiB의 RSS 증가를 고려하더라도, 결과적으로 600 MiB의 순 메모리 감소가 확인되었습니다. **데이터 구조와 메모리 추정** * 해당 맵은 `string`을 키로, `Response` 구조체를 값으로 가집니다. * `Response` 구조체는 `ShardID`(int32), `ShardType`(int), `RoutingKey`(string header), `LastModified`(*time.Time)로 구성됩니다. * 64비트 아키텍처 기준으로 키-값 쌍 하나당 패딩을 포함해 약 56바이트를 차지하며, 서비스 시작 시 대량으로 생성된 후 런타임 중에는 거의 변경되지 않는 특성을 보입니다. **Go 1.23의 버킷 기반 맵 방식과 한계** * 기존 Go 1.23은 8개의 슬롯을 가진 '버킷' 배열로 해시 테이블을 관리했으며, 버킷 수는 항상 2의 거듭제곱으로 유지되었습니다. * 데이터 삽입 시 버킷 내부의 모든 요소를 순차적으로 스캔해야 하므로 CPU 오버헤드가 발생하며, 버킷이 가득 차면 '오버플로우 버킷'을 체이닝 방식으로 추가했습니다. * 평균 로드 팩터(Load Factor)가 13/16(약 81%)을 초과하면 버킷 배열의 크기를 2배로 늘리는 재할당이 발생하는데, 이 과정에서 점진적 복사(Evacuation) 방식을 사용하여 지연 시간을 관리했습니다. **결론 및 권장사항** 대규모 맵 데이터를 메모리에 유지하는 Go 애플리케이션은 Go 1.24로의 업그레이드만으로도 상당한 메모리 효율성 개선을 기대할 수 있습니다. 특히 읽기 중심의 거대 캐시 시스템이나 데이터 라우팅 테이블을 운영하는 경우, 스위스 테이블 기반의 최적화된 메모리 레이아웃이 비용 절감과 성능 향상에 큰 기여를 할 것입니다.

datadog

수백 개의 파드에서 (새 탭에서 열림)

제공된 내용에는 본문이 포함되어 있지 않고, Datadog 웹사이트의 메뉴 목록과 링크 정보만 있습니다. 따라서 글의 주장, 기술적 접근법, 결론을 정확히 요약할 수 없습니다. 확인되는 정보로는 글의 URL에 `go-memory-regression`이 포함되어 있어 Go 애플리케이션의 메모리 회귀 문제를 다룬 글일 가능성이 있다는 점뿐입니다. 본문 요약을 위해서는 다음 중 하나를 보내 주세요. - 블로그 본문 전체 - 본문이 포함된 HTML 또는 Markdown - 글의 실제 텍스트가 보이는 캡처나 링크 내용 현재 제공된 메뉴에는 인프라 모니터링, APM, 로그 관리, 보안, RUM, CI/CD, AI 등 Datadog 제품 내비게이션만 포함되어 있으며, 기술적인 설명이나 분석 내용은 없습니다.