× - 코드 및 콘솔 화면은 [ code ] 내용 [ /code ] 태그 처리하여 주세요.
- 강조하고자 하는 내용은 [ b ] 내용 [ /b ] 태그 처리하여 주세요.

Docker container http requests limit 에 관하여

  • Weiweismart
    (Weiweismart)
  • Weiweismart's Avatar 이 글의 작성자
  • Offline
  • Newbie
  • Newbie
더보기
19 Feb 2022 14:56 - 24 May 2022 00:57 #5507 작성자: Weiweismart
Weiweismart 님의 글: Docker container http requests limit 에 관하여
[질문]

저는 기본적으로 MySQL 데이터베이스를 쿼리하고 HTTP 요청을 하는 일부 데이터를 삽입하기 위해 동료가 개발한 스크립트를 사용했습니다.

문제는 이러한 요청 중 상당수가 실패할 때까지 중단된다는 것입니다.
netstat -tn | grep 9200 I get:

[답변]

따라서 Docker나 Elastic 모두 문제가 되지 않았습니다. 요약하자면 Elasticsearch 설정에서 PUT 요청을 던지는 동일한 스크립트가 로컬에서 작동했지만 Elasticsearch로 컨테이너에서 던지면 수천 개의 문서(20k) 후에 실패했습니다. 전체 문서 수는 약 800k였습니다.

그래서, 무슨 일이 있었나요? localhost에서 실행되는 무언가를 설정하고 이에 대한 요청(이 경우 PUT 요청)을 하면 해당 요청은 루프백 인터페이스를 통과합니다. 실제로는 TCP 연결이 생성되지 않아 훨씬 빨라집니다.

도커 컨테이너가 설정될 때 포트는 호스트에 바인딩되었습니다. 스크립트는 여전히 원하는 포트의 localhost에 요청을 하지만 docker0 인터페이스를 통해 호스트와 도커 컨테이너 간에 TCP 연결이 생성됩니다. 이것은 다음 2가지를 희생합니다.

- TCP 연결을 설정하는 시간
- TIME_WAIT 상태

이것은 실제로 더 현실적인 시나리오입니다. 우리는 다른 머신에 Elasticsearch를 설정하고 정확히 동일한 테스트를 수행했고 예상한 대로 동일한 결과를 얻었습니다.

문제는 우리가 요청을 보내고 각각에 대해 새로운 연결을 생성한다는 것입니다. TCP 작동 방식으로 인해 연결을 즉시 닫을 수 없습니다. 이는 생성 비율이 실제 닫기 비율이 더 높았기 때문에 사용할 연결이 없을 때까지 사용 가능한 모든 연결을 사용했다는 것을 의미합니다.

이 문제를 해결하기 위한 세 가지 제안:

1. 때때로 요청을 일시 중지합니다. TIME_WAIT가 통과하고 연결이 닫힐 수 있도록 모든 X 요청에 절전 모드를 설정합니다.
2. Send Connection: closeheader: 옵션은 발신자가 응답 완료 후 연결이 닫힐 것임을 알리는 신호입니다.
3. 연결을 재사용합니다.

나는 옵션 3)을 사용하여 결국 동료의 스크립트를 다시 작성하고 동일한 TCP 연결을 재사용했습니다.
Time to create page: 0.053 seconds
Powered by Kunena Forum