안녕하세요. 현재 postgresql 9.6을 서비스에 사용하기 위해 준비 중입니다.
그런데 한가지 문제점이 있는데 검색 쿼리를 실행할 때 잘 돌다가 한번씩 응답이 굉장히
느려지는 경우가 발생합니다. 플랜을 확인해보면 인덱스를 잘 타고 있는 상황이고
실제로 쿼리 속도가 늦지도 않습니다. 그런데 페이징을 누르거나 검색을 누르거나 하면서
쿼리를 실행하다가 특정 시점이 됐을때 갑자기 반응 속도가 확 떨어집니다. 이 때
vmstat를 확인해보면 interrupt와 context switching이 굉장히 늘어나 있고
8 core중 1개의 cpu가 100%를 표시합니다. iowait나 스와핑은 전혀 일어나지
않고 실제 디스크에 쓰기 작업도 전혀 일어나지 않고 있습니다. 이상하게 운영체제 상에
전혀 수상한 발자국을 남기지 않으면서 쿼리 성능만 확 떨어지는 현상입니다. 그리고
그 쿼리 이후부터는 성능이 갈수록 계속 떨어져 세션을 끊어야만 하는 상황이 됩니다.
shared_buffers: 8G
work_mem : 16MB
temp_buffers : 8MB
와 같이 설정되어 있고 나머지는 디폴트 옵션입니다. 쿼리가 처음부터 꾸준히 늦으면
쿼리 탓이라고 생각할텐데 잘 돌다가 갑자기 무슨 조건인지도 모를 때에 성능이 확
줄어드는 현상에 대해서 짚이시는 곳이 있으신 분은 제발 도와주시길 부탁드립니다.
참고로 모든 쿼리가 늦어지는게 아니고 해당 쿼리만 그런 문제가 발생하고 있습니다.
대상 데이터는 현재 11만건 정도이고 DML은 전혀 이루어지지 않고 읽기만 하는
상황입니다.
쓰다보니 한가지 더 짚이는게 있네요. 이게 psql이나 pgadmin에서는 전혀 성능저하가
없습니다. 문제가 되는 어플리케이션의 쿼리를 그대로 psql이나 pgadmin에서는 아무리
날려도 성능저하가 없습니다. 현재 spring, jpa(hibernate), hikari CP로 구현되어
있는데 jdbc로 연결된 상태에서만 발생하는 현상입니다. 혹시 커넥션 풀의 문제일까
싶어서 커넥션 풀없이 PreparedStatement로 바인딩 파라미터로 쿼리를 직접 날리는
테스트 코드를 작서앻서 1.5초마다 쿼리를 날리도록 했는데 이 역시 어느 순간에 응답이
오지 않는 상태가 되었습니다. 쿼리가 전송은 됐는데 디비로부터 응답이 없고 pgadmin이나
psql은 바로 응답을 주고 무슨 영문인지 모르겠습니다. 물론 pgadmin과 psql도 리모트로
접속해서 날려보았습니다. |