
tomcat:
threads:
max: 300 # 최대 스레드 수
min-spare: 50 # 최소 대기 스레드
accept-count: 100 # 큐 대기 요청 수
ElasticSearchConfig 확인.setRequestConfigCallback(requestConfigBuilder ->
requestConfigBuilder
.setConnectTimeout(10000)
.setSocketTimeout(60000)
)
.setHttpClientConfigCallback(httpClientBuilder ->
httpClientBuilder
.setMaxConnTotal(100) // 최대 연결 수
.setMaxConnPerRoute(100) // 라우트당 최대 연결 수
)
.build();
이부분은 Connection 수가 100으로 문제가 없었습니다.
ElasticSearch 내부의 쓰레드 풀 확인
kkm06100@kkm06100-550XED:~/frontend$ curl -X GET "http://localhost:9200/_cat/thread_pool/search?v"
node_name name active queue rejected
e2feb59eb8f1 search 0 0 0
자동완성에 적합한 edge-ngram 방식을 content 같은 대용량 필드에 불필요하게 적용하고 있어 토큰 수가 폭발적으로 증가 하고, 검색 시에도 그 넓은 역색인을 탐색해야하므로 성능저하가 발생했습니다. 이를 제거 했고, 검색 중 불필요한 연산을 줄여 성능을 향상시켰습니다.
게시물 content 필드는 5000자가 넘는 대용량 데이터입니다. 검색 결과 20개를 반환할 때 content를 포함하면 ES가 각 문서의 _source에서 해당 필드를 읽고 반환하는 I/O 비용과 네트워크 전송량이 모두 증가합니다. 검색 목적상 content 전문은 불필요하므로 이를 제외해 성능을 향상시켰습니다.
50th pct는 14인데에 반해 max는 3초 가까이 되는 모습을 볼 수 있습니다.
또한 응답시간의 표준 편차는 308ms로 매우 높습니다.
로컬에서 별도의 격리없이 부하테스트와 애플리케이션 가동을 동시에 해서 결과에 대한 신뢰성이 떨어집니다.