Ken Henderson - Query timeout 은 존재하지 않는다.

  • Post author:
  • Post category:
  • Post comments:5 Comments
  • Post last modified:October 21, 2005

Ken Henderson씨의 블로그에 Query Timeout에 관한 글이 실렸습니다. ‘서버엔진의 관점에서 Query timeout 이라는 개념은 존재하지 않는다.’라는 것이 글의 요지입니다. 다 읽고 나서 곰곰히 생각해보니 너무나 당연한 이야기였지만, 평소에 Query timeout에 대해 진지하게 생각해본 적은 없어서인지 처음에는 상당히 놀랐습니다. 대충 의역해서 번역해봤으니 원문이 부담스러운 분은 아래 글을 읽어보세요.

Query timeout 이란 것은 존재하지 않는다 …

적어도 데이터베이스 엔진에 관한 한 그렇다. 사람들은 Query timeouts이 클라이언트측 개념에 불과하다는 사실을 알고는 놀란다. Connection Timeouts과 마찬가지로 Query timeouts는 클라이언트측 개념일 뿐이다.

그렇다면 Query timeouts는 어떤 방식으로 작동하는 것일까? 클라이언트는 Attention event를 사용하여 서버에게 query timout 신호를 보낸다. Attention event는 클라이언트가 서버쪽으로 보낼 수 있는 TDS 패킷의 한 유형일 뿐이다. 클라이언트는 connect/disconnect, T-SQL batch, 그리고 RPC events 뿐만 아니라 attention 도 서버측에 전달할 수 있다. Attention은 서버에게 현재 연결이 요청한 쿼리 중 실행 중인 것이 있다면, 그것을 가능한 한 빨리 중지시키라고 요청한다. Attention은 열려있는 트랜잭션을 롤백시키지 않는다. 그리고 실행 중인 쿼리를 즉시 중지시키는 것도 아니다. 보통 실행 중인 쿼리는 재빨리 중지되지만, 반드시 그런 것은 아니다.

서버의 관점에서 Query timeout이 언제 일어날지 어떻게 알 수 있을까? 프로필러를 돌렸을 때 language event 또는 RPC execution 다음에 attention event가 따라온다면, 쿼리가 타임아웃되었던가 취소되었음을 의미한다. 이제 attention event의 시간기록을 확인하자. 만약 앞선 language event 나 RPC 와 뒤따른 attention 사이의 시간이 클라이언트의 timeout 설정과 일치한다면, 쿼리가 타임아웃되었음을 알 수 있다.

SQL Server를 지원하는 모든 클라이언트측 연결 라이브러리는 Query timeout 설정을 지원한다. 클라이언트 어플리케이션은 시간을 측정하기 위해 쓰레드를 생성할 필요도 없고, 반드시 attention을 보내야 할 필요도 없다.클라이언트는 timeout 설정을 바꾸기 API를 호출하거나 연결속성을 설정하기만 하면 된다. 어플리케이션에 따라 서로 다른 방식으로 최종사용자(End User)에게 이러한 기능을 제공한다. 예를 들어 쿼리분석기의 경우에는 Tools | Options | Connection 에서 Query timeout을 설정할 수 있다. Timeout 값이 0 이면 timeout 기능을 사용하지 않겠다는 의미이다.

왜 query timeout에 신경을 써야 할까? 왜냐하면 query timeouts이 성능상의 문제를 보여주는 지표이기 때문이다. 만약 보통 5초면 수행되는 쿼리가 30초째에 타임아웃된다면, 문제가 있음을 알 수 있다. 가능성 있는 문제의 원인은 여러가지이다. 하지만 프로필러에서 클라이언트의 timeout 설정에 부합하는 attention event를 보게 된다면, 반드시 주의(attention)해야 한다.

일반적으로 클라이언트 어플리케이션은 query timeout이 일어났을 때, 이를 사용자에게 알린다. 하지만 반드시 그래야 하는 것은 아니다. 나는 예전에 어떤 어플리케이션을 디버그한 적이 있다. 그 어플리케이션의 개발자들은 자주 타임아웃되는 성능이 떨어지는 쿼리를 의도적으로 감추려고 했었다. 그들은 어플리케이션이 단순히 타임아웃된 쿼리를 다시 요청하도록 했다. 이런 방식은 락과 동시성 문제를 일으켰다. 내가 프로필러로 attention event와 클라이언트측의 query time 설정 간의 연관관계를 확인하기 전까지 말이다.

Author Details
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

5 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
toro
toro
18 years ago

안녕하세요? 블로그 재미있게 읽고 있습니다. 그런데 RSS같은 feed는 제공하지 않으시나봐요?

최재훈
18 years ago

재밌다니 다행입니다. 그리고 물론 RSS를 제공하고 있습니다. 사이드바|Navigate|RSS·Bookmarks 에 있습니다. 잘 안보이는 곳에 있나요? 위치를 좀 바꿔야겠군요.

toro
toro
18 years ago

찾았습니다. 감사합니다. 

정원혁
18 years ago

어쩌다 여기까지 또 들렸어요. 자료 검색하다가^^
그만큼 훌륭한 자료가 많다는 의미지요? 멋집니다!

최재훈
18 years ago

가끔 들려주세요.