성능 4

로그 모니터링 개발 기록 03. 검색엔진의 성능 최적화

2021년 11월부터 현재(24년 1월)까지 약 2년동안 와탭 로그 모니터링을 개발하면서 배우고 느꼈던 것들을 정리하고 있습니다. 검색 엔진의 저장 구조, 조회 구조 다음으로 성능 최적화를 다루고 있습니다. 이번 글에서는 가장 아쉬움이 많이 남는 기능인 동시에, 가장 성능 개선이 많이 진행된 기능인 ‘임의의 문자열로 검색하기’에 대해서 이야기를 해보겠습니다. 들어가며 엄청나게 많은 문서 속에서 임의의 문자열이 등장하는 단 하나의 문서를 찾으려면 어떻게 해야할까요? 첫 번째 방법은 모든 키워드에 대해서 색인을 생성하는 것입니다. 검색엔진의 저장 구조 이해하기를 읽어주신 분이라면 ‘색인’은 특정 단어로 직접 이동할 수 있는 자료구조라는 것과 Inverted Index, SSTable을 사용해서 개념적으로 어..

로그 모니터링 개발 기록 02. 검색엔진의 조회 구조 이해하기

2021년 11월부터 현재(24년 1월)까지 약 2년동안 와탭 로그 모니터링을 개발하면서 배우고 느꼈던 것들을 정리하려고 합니다. 전체적인 흐름을 어떻게 구조를 잡을까 고민해보다가 Lucene In Action에서 Lucene에 대해서 설명하고 있는 구조를 그대로 차용하겠습니다. 검색 엔진의 조회 구조 이전 글에서 Inverted Index와 SSTable의 구조에 대해서 설명었습니다. 이 두가지 자료구조에 대한 설명을 전제로 시작해보겠습니다. 검색 엔진에서 제공하는 검색 기능에는 크게 3가지 종류의 이론적이 모델이 있습니다. 순수 불리언 모델 벡터 공간 모델 순수 불리언 모델 질의에 매칭되는 문서가 있는지 없는지를 판단합니다. 각각의 Token에 대한 가중치 또는 검색 결과에 대한 점수 계산은 존재하지..

QueryHint를 적용하기 전에 고려해볼 사항

변경감지를 위해서는 원본과 현재의 값을 어쩔 수 없이 둘 다 가지고 있어야 합니다. 어떤 부분이 변경되었는지 파악할 수 있어야하니까요. 정말 조회에만 영향이 있는 쿼리라면 별도의 MemberReadOnlyRepository를 분리해서 읽기 전용 조회를 구성할 수도 있습니다. 하지만 쿼리 힌트보다는 1차 캐시를 우선 적용해서 DB로의 쿼리 자체를 줄이는 것을 먼저 적용하는게 우선입니다. redis와 같은 별도의 구성 없이 쿼리힌트만으로 최적화가 될 수 있는지는 성능 테스트를 진행해봐야 합니다. @Repository public interface MemberJpaRepository extends JpaRepository { @QueryHints(value = @QueryHint(name = "org.hibe..

DEV/Spring Data JPA 2023.09.24

성능과 사용자 경험의 사이에서

저는 회사에서 로그 모니터링 서비스를 만들고 있습니다. 위의 화면에서 검색 조건은 content:*Exception*으로 입력되어 있습니다. 수집 된 로그 중에서 Exception이 포함된 로그를 조회하는 모습을 보여줍니다. 지정한 키워드가 포함되었는지 확인할 때에는 java.lang.String#startsWith(java.lang.String)을 사용합니다. 물론 이렇게 수집된 모든 로그에 대해서 FULL-SCAN을 하면 검색 속도도 안나오고 CPU도 많이 사용할 수 있습니다. 더 큰 문제는 지정한 검색 시간 안에 로그가 N개 있으면 N개의 문자열에 대해서 모두 startsWith 연산을 수행한다는 점입니다. RDBMS를 사용하는 환경이라면 Connection Pool을 오랫동안 점유하게 되고, Fi..

DEV/INSIGHT 2023.09.20