EF Core 사용시 첫 번째 쿼리가 느린 문제

@HyunJi_Lee 님의 말씀에 힌트를 얻어서, 다시 한 번 테스트를 해봤습니다.

Web API 서버가 Docker로 띄워진 DB 컨테이너를 찾는데 시간이 오래 걸리는게 아닌가?

{
  "ConnectionStrings": {
    "ShirtStoreManagement": "Host=localhost;Port=5432;Database=ShirtStoreManagement;Username=postgres;Password=postgres;Include Error Detail=true;"
  },
     :
     :
}

만약 ASP.NET Core 애플리케이션도 Docker Container로 띄웠다면, Connection String에서 HostDB 컨테이너의 이름을 사용했을 것입니다.

하지만 저는 DB(PostgreSQL)만 컨테이너로 띄웠었기 때문에, Hostlocalhost로 설정했었습니다.

그래서 이번에는 localhost 대신 127.0.0.1로 수정 후 다시 한 번 테스트를 해봤습니다.

{
  "ConnectionStrings": {
    "ShirtStoreManagement": "Host=127.0.0.1;Port=5432;Database=ShirtStoreManagement;Username=postgres;Password=postgres;Include Error Detail=true;"
  },
     :
     :
}

그랬더니 첫 쿼리 응답 속도가 8초 걸리던게, 1초대로 줄어들었습니다!

아무래도 호스트 네트워크와 Dokcer 네트워크 간의 DNS 과정이 가장 큰 문제 원인이었던 거 같습니다:face_holding_back_tears:

Connection String의 Host를 localhost에서 127.0.0.1로 변경함으로써, 본문에서 언급했던 문제 1)문제 2)가 모두 해결됐네요!

  • 문제 1) 서버 실행 후 첫 번째 쿼리의 응답 속도가 8초였던 문제
    • 이제는 DB를 빠르게 찾아 Connection을 맺기 때문에 8초에서 1초로 단축
    • 사실상 Connection을 맺고 쿼리 응답받는건 오래 걸리지 않음
      (앱 실행 후 최초 쿼리는 DB Context의 모델 초기화로 인해 좀 더 지연되는 부분이 있는걸로 추측)
  • 문제 2) Connection 유실 후 쿼리 수행하면 다시 8초대 응답을 받던 문제
    • 마찬가지로 DB를 빠르게 찾아 Connection을 맺기 때문에 문제 해결
    • 새로운 Connection을 맺고 쿼리 응답을 받는데 수십 또는 100ms 정도 걸림

제가 처음에 조치를 취해던 방법은 “Connection을 맺는 시간이 오래 걸리니까, API 서버 초기 실행 때 DB Connection을 미리 만들어 놓고 계속 유지하자” 였는데,

알고보니 Connection을 맺기 위해 DB를 찾는 시간이 오래 걸린거였고, 결국엔 불필요한 DNS 과정을 생략함으로써 모든 문제가 한 번에 해결됐습니다 ㅎㅎ

앞으로는 다음 사항에 유의하며 개발 공부를 해야겠습니다:sweat_drops:

  • 같은 Docker 네트워크로 묶여 있는 Docker 컨테이너들이라면 서로 컨테이너 이름을 이용하여 통신한다.
  • 호스트 네트워크에 있는 애플리케이션과 (포트포워딩된) Docker 컨테이너를 연결할 때는 localhost 대신 127.0.0.1를 사용함으로써 불필요한 DNS 과정이 생략되어 더 빠르게 통신한다.
11개의 좋아요