RDBMS 에서 Deadlock 이라는 단어가 종종 등장한다. 대부분의 DB 안내서에 자주 등장하는 이야기 지만.. 의외로 해당 문제 때문에 trouble shooting 을 수행하여야 하는 경우는 드뭅니다. 대부분의 dealock 이 개발 단계에서 탐지되고, 수정되기 때문이죠.
그렇다면, 여기서 '대부분' 이라는 키워드를 사용하는 경우는 어떤 경우이며, '대부분' 에 포함되지 않는 예외 Case 는 어떤 것들이 있는지, 그리고 그에 대한 해결은 어떻게 접근하는지에 대하여 생각해 보기로 하겠습니다..
Deadlock 의 정의에 대해서는 따로 설명하지 않겠습니다. 정의는 적당한 문서가 많이 있습니다..
Deadlock 의 탐지
1. SQL 이벤트
2. 과도한 CPU 의 사용
3. 작업 모니터에 CXPacket 의 기록
1 의 경우 대부분의 개발 과정에서 탐지 됩니다. 그리고 안되더라도... 왠만큼 작은 서비스가 아닌 담에야 초짜 DBA 또는 개발자에게 DML 이나 SQL Query 를 통째로 맡길 강심장 프로젝트 메니져는 많지 않습니다.
뭐 실제로 그렇다 하더라도, 그런 SQL 이야 좀 Deadlock 이 걸리면 어떠랴...
Lock 은 성능을 저하 시키는 가장 큰 부분이라 튜닝의 대상이지만, Deadlock 은 application time out 같은 장애 상황을 유발하는 오류이므로 튜닝이 아닌 Trouble shooting 의 대상이라는 것을 기억하여야 합니다.
해결의 방법은 SQL coding 에서 해결하는 부분이니 다른 참고 자료를 참고하시고...
개발 이후 운영 중에 발생하는 deadlock 의 탐지와 해결에 대해서 한번 이야기해 보겠습니다.
별로 사용하는 쿼리나 Data 도 없는데, CPU 의 사용이 급격하게 증가하고, 심지어 Application 의 Timeout 이 발생할 경우 deadlock 을 의심해 볼 수 있습니다.
많은 경우 CPU 를 대량으로 사용하거나 하는 경우는 일반적으로 DML 이라 쿼리 문을 잘못 작성한 경우가 많습니다.
하지만 작업 모니터 (activity monitor) 에서 CXPACKET 이 발견되는 경우는 Deadlock 때문입니다.
- 작업 모니터에서 대량으로 발견되는 CXPACKET... 이 정도면 대부분의 사용자들이 성능 저하 또는 Time out 을 경험하게 됩니다
그런데...개발 발견되지 않은 CXPACKET 이 왜 운영 환경에거 발견될까요?
MAXDOP
이유는 개발 환경보다 운영 환경의 HW Spec 이 높은 경우, 특히 CPU 의 Core 개수가 많은 경우 발생합니다.
대중의 CPU 가 리소스 점유율이 높은 Query 를 동시에 실행할 경우 CPU 자원의 사용 교착 상태로 인하여 해당 문제가 발생할 수 있습니다.
이 경우 SQL 인스턴스의 CPU 병렬 처리 값을 조정해 주면 간단히 해결됩니다.
서버 속성/고급/병렬처리에서 '최대 병렬 처리 수준' 의 값을 4 이하로 조정해야 합니다.
경우에 따라서는 2 또는 극단적인 경우 1이 될 수도 있으며, 실제적인 성능 저하 (예를 들어 10 msec 걸리는 query 가 500 msec 로 걸리는) 가 없다면, 해당 값을 조정해도 문제가 없습니다.
이는 영문 표기로 Max degree of Parallelism 으로 표기되며, 해당 정보는 MS 에서도 공식적으로 4 이하로 권고하고 있습니다. 기본 값은 0 으로 무한대로 사용하게 되어 있습니다. 특히 복잡한 쿼리를 많이 쓰는 경우 Deadlock 문제가 발생할 확률이 높습니다.
'IT Professional > Microsoft SQL Server' 카테고리의 다른 글
Microsoft SQL Server CPU 경합 방지 옵션 (0) | 2013.07.30 |
---|---|
SQL 서버 사용 중 Query 나 DML 이 인덱스 사용을 비 정상적으로 할 때... (0) | 2013.07.29 |
잘 되던 SQL Replication 이 안될 때 - OS error 3. (0) | 2013.01.10 |
MSCS 상에서SQL 2005 서버 설치시 11001 오류 (0) | 2011.02.05 |
Domain controller 취약점 장애로 인한 SQL 2005 의 설치 오류 (0) | 2011.02.05 |