일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- kubernetes
- Python
- 쿠버네티스
- BFS
- 로깅
- fast api
- 솔루션조사
- 생성형
- 메세지큐
- vuejs
- LLaMa
- GPT
- 도커
- Machine Learning
- k8s
- 생성형 AI
- 컨설팅
- Docker
- vue.js
- Redis
- fastapi
- 리트코드
- POD
- 컨설턴트
- LeetCode
- SpringBoot
- 오픈시프트
- 머신러닝
- jpa
- OpenShift
- Today
- Total
수 많은 우문은 현답을 만든다
Connection Pool 설정에 대한 고민 본문
안녕하세요 조영호입니다.
제가 개발에 참여한 한 프로젝트에서 아래와 같이 PoolingHttpClientConnectionManager를 설정할 일이 있었습니다.
PoolingHttpClientConnectionManager clientConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
clientConnectionManager.setMaxTotal(1500);
clientConnectionManager.setDefaultMaxPerRoute(1000);
기본 라우트 수를 1000개, max를 1500개로 지정해놓고 쓰고 있었는데요.
어느날 하나의 2000개 리스트를 가진 하나의 요청을 프로그램에 보냈습니다. 프로그램 내에서 요청은 2000개의 배열로 split 되고, 각 리스트는 각각 하나의 HTTP 요청을 보냅니다. 그런데 Error: read ECONNRESET 이런 에러가 발생했습니다.
위 에러는 TCP Conversation 과정에서 한 쪽의 연결이 비정상적으로 끊긴 Common System Error를 의미하고 서버의 네트워크 보안 옵션 설정값을 변경해서 해결해야 한다고 찾아보았습니다. 하지만 되도록 이 커널 파라미터 설정값을 수정하지 않는것을 권장한다고 합니다. 시스템 메모리에 맞게 이미 최적화된 값이 설정되어 있기 때문인데요.
그럼 이 에러의 원인은 뭘까요? 요청자 서버에서 네트워크 요청을 할때 요청 또는 수신의 개수가 버퍼의 한계치를 넘어서면 더 이상 요청을 발송하지 못하고 연결이 끊기기 때문입니다. (참고)
저는 setDefaultMaxPerRoute 를 늘려보면 어떨까 생각하게 되었습니다.
이 설정은 '각 HOST (IP + PORT) 당 Connection Pool 에 생성가능한 Connection 의 수' 를 의미합니다.
그러면 제가 반복해서 2000번의 요청을 보내더라도 1개의 Connection Pool 만 사용하는 것 일까요?
일단 커넥션 풀의 의미를 정확히 알아야합니다.
커넥션 풀은 WAS와 DB 간에 발생하는 3HandShaking 작업을 줄여주어 퍼포먼스를 향상시키는 기술입니다.
그럼 커넥션 풀을 2000개로 늘려도 좋을까요? 아닙니다. 커넥션 풀을 무작정 늘리면 성능저하가 올 수 있습니다.
커넥션풀에 대한 자세한 설명과 성능에 대한 고민은 이 블로그에 잘 나와있으니 참고 바랍니다.
감사합니다.