>백엔드 개발 >Golang >Gin Gonic 웹 서버 메모리 누출?

Gin Gonic 웹 서버 메모리 누출?

PHPz
PHPz앞으로
2024-02-08 21:51:08634검색

Gin Gonic 网络服务器内存泄漏?

php 편집자 Baicao는 Gin Gonic 웹 서버를 사용할 때 메모리 누수 문제가 있을 수 있음을 발견했습니다. 메모리 누수는 프로그램이 너무 많은 메모리 리소스를 차지하게 하여 궁극적으로 시스템의 안정성과 성능에 영향을 미치는 일반적인 버그입니다. 개발자에게는 적시에 메모리 누수를 감지하고 해결하는 것이 중요합니다. 이 기사에서는 Gin Gonic 네트워크 서버의 메모리 누수 원인과 해결 방법을 탐색하여 개발자가 코드를 최적화하고 시스템 성능을 향상시키는 데 도움을 줍니다.

질문 내용

설명

gin-gonic/gin 웹 서버에서 잠재적인 메모리 누수를 발견했습니다. 간단한 /health_check 엔드포인트를 생성하여 문제를 재현해 보았습니다. 엔드포인트 /health_check는 매초 적중됩니다. 이 문제로 인해 사용 가능한 Pod 메모리가 소진되면 메모리 부족(OOM) 상태가 발생합니다. 포드에서 실행 중인 다른 컨테이너는 없습니다.

문제를 이해하기 위해 pprof 및 prometheus 측정항목도 노출했지만 아무것도 찾을 수 없었습니다. 동일한 문제를 보고하는 다른 문제가 나열되어 있지 않으므로 누군가가 문제를 격리하는 데 도움을 줄 수 있기를 바랍니다.

힙이나 스택 메모리는 늘어나지 않는데, 프로세스 메모리는 계속 늘어나네요. RSS를 사용하여 증가를 볼 수 있고 pmap을 사용하여 해당 메모리 블록을 볼 수 있지만 메모리가 왜 지워지지 않는지, 할당된 메모리가 어디에 사용되는지 추적할 수 없습니다.

재생산 방법

관련 엔드포인트가 포함된 간단한 코드 예:

으아악 으아악

빌드 명령:

으아악

Pod 리소스 제한:

  1. 64MiB RAM
  2. 1 CPU

기대

메모리 사용량이 일관되게 유지될 것으로 기대합니다. 약간의 변동은 허용되지만 메모리 사용량이 대부분 일관되게 유지되고 메모리가 부족하지 않기를 바랍니다.

실제 결과

약 90분 동안 메모리를 계속 늘리는 OOM으로 인해 포드가 충돌했습니다. 아래 그래프의 각 급증은 OOM으로 인한 Pod 재시작을 나타냅니다.

코루틴

으아악

환경

  • Go 버전: go1.21.1 linux/amd64
  • 도커 이미지: 1.21.1-bullseye
  • gin 버전(또는 커밋 참조): github.com/gin-gonic/gin v1.9.1
  • 운영 체제: Debian GNU/Linux 11(Bulls Eye)
  • GOGC=10;GOMEMLIMIT=64MiB(기본값을 사용해도 시도했지만 결과는 동일함)

어떤 도움이나 안내도 감사드립니다.

Solution

그래서 어디에서 메모리가 증가하는지 알아보기 위해 몇 가지 실험을 했습니다.

-race 빌드 플래그 없이 테스트를 시도했는데 이제 메모리는 괜찮은 것 같습니다. 유휴 서버에서는 지속적으로 증가하는 것을 볼 수 없습니다(활성 상태, 준비 상태 프로브 및 메트릭 엔드포인트만 사용 가능).

이런 일이 왜 발생하는지, 예상되는 것인지 완전히 확신할 수는 없지만, 더 자세히 조사하여 프로덕션 배포에서 플래그를 일시적으로 제거하겠습니다.

이 플래그를 제거한 후 메모리 추세를 공유하면(빌드 명령은 go build), 최고점은 제가 실행 중인 로드 테스트로, 1M 요청(한 번에 100개 병렬)을 트리거합니다.

Pod 메모리 사용량은 다음과 같습니다.

다음은 RSS입니다:

다음은 힙 및 스택 메모리 사용량입니다.

PS: 지금은 이것을 답변으로 표시하고 있지만 자유롭게 정정해 주시기 바랍니다. 저는 아직 golang을 처음 접했고 모든 분들의 기여에 감사드립니다. 이 결과와 상반되는 내용을 발견하면 이 답변을 업데이트/삭제하겠습니다. 감사합니다.

위 내용은 Gin Gonic 웹 서버 메모리 누출?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제