수 많은 우문은 현답을 만든다

Connection Pool 설정에 대한 고민 본문

카테고리 없음

Connection Pool 설정에 대한 고민

aiden.jo 2022. 2. 16. 16:13

안녕하세요 조영호입니다.

제가 개발에 참여한 한 프로젝트에서 아래와 같이 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개로 늘려도 좋을까요? 아닙니다. 커넥션 풀을 무작정 늘리면 성능저하가 올 수 있습니다.

커넥션풀에 대한 자세한 설명과 성능에 대한 고민은 이 블로그에 잘 나와있으니 참고 바랍니다.

 

 

감사합니다.