Go 1.27, HTTP/1 연결 재사용 자동화로 5배 성능 개선
원제 Better HTTP/1 connection reuse in Go 1.27
161 포인트댓글 27

Key Point
HTTP/1 연결 재사용 실패로 인한 성능 저하는 상태 코드나 부분 응답만 필요한 실제 코드에서 자주 발생하는데, Go 1.27이 이를 자동 처리하므로 기존 인프라의 성능을 크게 개선할 수 있다.
핵심 요약
- Go 1.27은 HTTP/1 연결 재사용을 자동으로 최적화해 같은 요청을 100회 반복할 때 710ms(Go 1.26)에서 150ms로 약 5배 빨라졌다.
- HTTP 연결 설립에는 TCP 핸드셰이크(1 RTT)와 TLS 핸드셰이크(2 RTT)로 총 3 RTT가 소요되며, 크로스리전 통신에서는 300ms 이상 걸릴 수 있다.
- HTTP/1에서는 응답 본문을 끝까지 읽어야 다음 요청에서 같은 연결을 재사용할 수 있는데, 상태 코드만 필요한 경우처럼 응답 본문을 읽지 않으면 연결이 버려진다.
- 응답 본문을 읽지 않고 닫으면 net/http는 연결을 재사용할 수 없다고 판단해 매번 새 연결을 생성하게 되므로, 설립 비용이 반복적으로 발생한다.
- 개발자들은 이를 우회하기 위해 응답 본문을 드레인(버리기)하는 코드를 작성했는데, 256KB 용량 제한, 50ms 타임아웃, 고루틴 누수 방지 등을 고려해야 해 복잡했다.
- Go 1.27부터 net/http.Transport는 미읽은 HTTP/1 응답 본문을 비동기로 최대 50ms 또는 256KB 범위 내에서 자동 드레인하며, 'Connection: close' 헤더가 있으면 드레인을 건너뜀으로써 최적화한다.
- 이제 개발자는 단순히 응답을 닫기만 하면 되고, net/http가 백그라운드에서 복잡한 연결 재사용 로직을 처리하므로 코드를 간결하게 유지할 수 있다.