ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Cloud NAT][운영] allocation error는 없는데 port_usage만 치솟을 때 connection reuse와 앱 동시성을 어떤 순서로 다시 보나
    카테고리 없음 2026. 7. 16. 09:13

    IT 리서치 노트

    [Cloud NAT][운영] allocation error는 없는데 port_usage만 치솟을 때 connection reuse와 앱 동시성을 어떤 순서로 다시 보나

    Cloud NAT에서 allocation error는 안 보이는데 `compute.googleapis.com/nat/port_usage`만 빠르게 치솟는 상황은 의외로 자주 나온다. 2026년 7월 16일 기준 Google Cloud 공식 문서를 다시 보면 Cloud NAT 로그는 모든 패킷을 다 기록하지 않고, dynamic port allocation은 포트를 추가로 배정하는 동안 latency가 나타날 수 있으며, Cloud Run 쪽에서는 connection pooling과 reuse를 권장한다. 이 글은 error 로그가 조용한데 port_usage만 튈 때 NAT 설정과 애플리케이션 동시성을 어떤 순서로 다시 봐야 하는지 정리한 것이다.

    1. 개요

    결론부터 말하면 allocation error 0만 보고 NAT 문제를 배제하면 안 된다. port_usage가 급등하는데 에러 로그가 조용하면, 먼저 앱이 새 연결을 과하게 만들고 있는지와 Cloud Run 동시성이 burst를 키우는지부터 본 뒤, 그다음 minimum ports per VM과 목적지 분포를 보는 편이 빠르다.

    즉 이번 증상은 NAT 설정 단독 문제보다 앱 연결 습관과 NAT 지표를 함께 읽는 문제다. connection pooling과 reuse가 부족하면 NAT가 동적으로 포트를 늘리고 있어도 burst 구간에서 port_usage만 빠르게 튈 수 있다.

    2. 어디서 실제로 막히는가

    실무에서 자주 겪는 증상은 세 가지다. 첫째, Cloud Monitoring에서 port_usage가 짧게 급등하는데 NAT allocation errors는 계속 0이다. 둘째, 지연은 보이는데 Cloud NAT 로그에 명확한 error가 적게 남는다. 셋째, Cloud Run revision을 늘리거나 fan-out 작업을 붙인 뒤 같은 목적지로 새 연결이 쏟아진다.

    이 상황에서 많은 팀이 minimum ports만 바로 올리거나 NAT IP 수만 늘린다. 하지만 Cloud Run networking best practices는 같은 목적지에 높은 요청률을 보낼수록 connection pooling과 reuse를 먼저 보라고 설명한다. 즉 포트 압박의 출발점이 NAT가 아니라 앱의 연결 생성 패턴일 수 있다.

    또 Cloud NAT monitoring 문서는 로그가 모든 패킷을 기록하지 않는다고 적고 있다. 따라서 error 로그가 조용하다고 해서 포트 배정 과정이나 재사용 대기 때문에 생긴 지연이 없었다고 단정하면 안 된다. port_usage 시계열, burst 시점, 동시성 설정, keepalive 여부를 같은 시간축에 놓아야 원인 분리가 된다.

    • 증상: allocation error는 없는데 port_usage와 지연만 튄다.
    • 실패: NAT 에러 로그가 없으니 앱은 정상이라고 가정한다.
    • 막힘: connection pooling과 Cloud Run concurrency를 같이 보지 않는다.
    • 누락: burst 시점과 목적지 연결 수를 같은 타임라인에 남기지 않는다.
    증상 먼저 볼 곳 판단 기준
    짧은 burst에서만 spike connection reuse, fan-out 새 연결이 한 번에 몰리는지 본다
    장시간 port_usage 높음 minimum ports, 목적지 수 NAT 설정이 실제 트래픽 패턴보다 작은지 본다
    에러 로그가 거의 없음 port_usage와 앱 로그 로그 부재를 정상 신호로 오해하지 않는다

    3. 실무에서 적용하는 순서

    가장 빠른 점검 순서는 다섯 단계다. 먼저 port_usage 급등 시점을 찾는다. 두 번째로 같은 시점의 Cloud Run concurrency, queue fan-out, batch dispatch 수를 본다. 세 번째로 애플리케이션이 keepalive와 connection pooling을 켰는지 확인한다. 네 번째로 그래도 장시간 높게 유지되면 minimum ports per VM과 목적지 분포를 다시 본다. 마지막으로 only-NAT 변경이 아니라 앱 설정과 NAT 설정을 같은 실험 메모로 남긴다.

    1. port_usage 급등 시점을 먼저 찾는다.
    2. 같은 시점의 앱 동시성과 fan-out 이벤트를 대조한다.
    3. connection pooling과 keepalive가 실제로 켜졌는지 확인한다.
    4. 장시간 압박이면 minimum ports와 NAT IP 구성을 다시 본다.
    5. 앱 변경과 NAT 변경을 같은 실험 표에 기록한다.
    재점검 순서 메모
    1. metric window에서 nat/port_usage spike 구간 찾기
    2. 같은 구간의 Cloud Run concurrency와 request fan-out 확인
    3. HTTP keepalive, db/client connection pool 여부 확인
    4. 목적지 IP 수와 minimum ports per VM 비교
    5. 필요 시 NAT minimum ports 조정 후 같은 실험 반복

    핵심은 설정 변경 순서다. connection reuse가 꺼져 있는데 NAT minimum ports부터 올리면 문제는 줄어들지 않고 비용만 늘 수 있다. 반대로 앱이 이미 연결을 잘 재사용하고 있는데도 장시간 port_usage가 높다면 그때는 NAT minimum ports와 목적지 분산 전략을 보는 편이 맞다.

    4. 공식 문서와 예시 화면으로 확인하기

    첫 자료는 Cloud NAT monitoring 문서다. 여기서는 로그가 모든 패킷을 다 남기지 않으며, 로그 부재를 사건 부재로 해석하면 안 된다고 분명히 적고 있다.

    Cloud NAT 문서는 에러 로그가 없다고 해서 포트 압박이 없다고 단정하면 안 된다고 설명한다.
    Cloud NAT 문서는 에러 로그가 없다고 해서 포트 압박이 없다고 단정하면 안 된다고 설명한다.

    즉 allocation error가 안 보인다고 바로 NAT 설정을 배제하면 안 된다. port_usage는 치솟는데 로그는 조용한 상황이 실제로 생길 수 있고, 이때는 connection reuse와 동시성 패턴을 먼저 의심해야 한다.

    두 번째 자료는 ports and addresses 문서다. dynamic port allocation은 필요에 따라 포트를 더 배정하지만, 그 사이에 latency나 timeout이 보일 수 있다고 적혀 있다.

    동적 포트 할당은 포트를 아끼지만, 배정이 늘어나는 순간 latency와 timeout이 보일 수 있다.
    동적 포트 할당은 포트를 아끼지만, 배정이 늘어나는 순간 latency와 timeout이 보일 수 있다.

    이 문장은 allocation error가 0이어도 체감 지연이 남을 수 있는 이유를 설명한다. 결국 앱이 너무 빠르게 새 연결을 열고 있다면 NAT가 따라가도 port_usage는 크게 튈 수 있다.

    세 번째 자료는 Cloud NAT troubleshooting 문서다. Google Cloud는 minimum ports per VM 판단에 `compute.googleapis.com/nat/port_usage`를 직접 보라고 안내한다.

    공식 troubleshooting 문서는 allocation error보다 먼저 port_usage 시계열과 minimum ports 조정을 같이 보라고 안내한다.
    공식 troubleshooting 문서는 allocation error보다 먼저 port_usage 시계열과 minimum ports 조정을 같이 보라고 안내한다.

    즉 문제가 없다고 끝내는 지표가 아니라, 포트 압박이 조용히 쌓이는지 보는 지표가 port_usage다. 특히 burst 직후만 높게 치솟는다면 앱 레벨 연결 재사용 실패일 가능성이 커진다.

    네 번째 자료는 Cloud Run networking best practices다. 여기서는 같은 목적지로 많은 요청을 보낼 때 connection pooling과 reuse를 쓰라고 직접 권장한다.

    Cloud Run 문서는 단일 목적지로 높은 요청률을 보낼수록 connection pooling과 reuse가 포트 고갈과 연결 오류를 줄인다고 설명한다.
    Cloud Run 문서는 단일 목적지로 높은 요청률을 보낼수록 connection pooling과 reuse가 포트 고갈과 연결 오류를 줄인다고 설명한다.

    즉 NAT minimum ports만 올리기 전에 앱이 매 요청마다 새 소켓을 만드는지부터 봐야 한다. 포트 압박은 NAT 설정 문제처럼 보이지만, 실제 출발점이 애플리케이션 연결 습관인 경우가 많다.

    실무에서는 NAT와 앱을 함께 보는 triage 표가 필요하다. allocation error 0이라는 한 줄만으로는 NAT 쪽인지 애플리케이션 쪽인지 설명이 안 된다.

    port_usage 급등 시 NAT 설정과 애플리케이션 동시성을 나눠 보는 triage 표다.
    port_usage 급등 시 NAT 설정과 애플리케이션 동시성을 나눠 보는 triage 표다.

    이미 allocation errors는 없는데 burst 지연이 남는 글이 timeout 축을 다뤘다면, 이번 표는 connection reuse와 동시성 축을 먼저 나누는 버전이다.

    마지막 자료는 운영 관찰 메모다. NAT 지표와 앱 설정을 한 줄로 묶어 두면 다음 장애 때 재현성이 좋아진다.

    port_usage, concurrency, connection pooling 여부를 함께 남기는 점검 메모 예시다.
    port_usage, concurrency, connection pooling 여부를 함께 남기는 점검 메모 예시다.

    이 구조를 남겨 두면 packet drop과 allocation errors 시간축 글처럼 NAT 지표를 볼 때도 앱 레벨 동시성과 연결 재사용 상태를 같이 대조할 수 있다.

    5. 주의사항과 리스크

    첫 번째 리스크는 error 로그가 없으니 NAT는 정상이라고 단정하는 것이다. 두 번째 리스크는 connection pooling이 꺼진 채 NAT minimum ports만 계속 올리는 것이다. 세 번째 리스크는 Cloud Run 동시성과 batch fan-out이 port_usage에 미치는 영향을 별도 로그로 남기지 않는 것이다.

    운영 전에는 같은 목적지로 가는 요청이 많은 코드 경로부터 connection reuse를 강제하는 편이 좋다. 그리고 NAT minimum ports 조정은 그다음 단계다. 그래야 앱 패턴과 NAT 패턴을 따로 검증할 수 있다.

    • error 로그 부재는 원인 부재가 아니다.
    • port_usage spike는 NAT와 앱 동시성을 함께 봐야 한다.
    • connection reuse를 먼저 고정하고 NAT minimum ports를 조정한다.

    6. 결론

    allocation error가 없는데 port_usage만 치솟는 상황은 NAT보다 앱 연결 습관이 먼저 문제인 경우가 많다. port_usage 시계열과 Cloud Run 동시성, connection pooling 여부를 먼저 묶어 보고, 그다음 minimum ports per VM을 조정하면 훨씬 짧게 원인을 좁힐 수 있다.

    관련 흐름으로는 packet drop과 allocation errors 시간축 글, EIM과 dynamic allocation 분기 글, allocation errors 없이 burst 지연이 남는 글을 같이 보면 NAT 설정과 앱 패턴이 한 사다리로 이어진다.

    또 2026년 7월 16일 후속 글인 새 Cloud NAT gateway의 TCP TIME_WAIT 기본값이 30초로 바뀌는 롤아웃 구간 점검 글을 함께 보면, port_usage 해석 전에 gateway 생성 시점과 지역 롤아웃 차이부터 기록해야 하는 이유가 더 분명해진다.

    7. 참고 링크

    1. https://docs.cloud.google.com/nat/docs/monitoring
    2. https://docs.cloud.google.com/nat/docs/ports-and-addresses
    3. https://docs.cloud.google.com/nat/docs/troubleshooting
    4. https://docs.cloud.google.com/run/docs/configuring/networking-best-practices
Designed by Tistory.