deadlock basics

데드락 발생 조건

멈춘 것처럼 보이는 상황도 자원 보유, 추가 요청, 선점 가능성, 순환 대기 여부를 나누어 보면 진단 경로가 생깁니다.

mutex자원은 동시에 못 씀
hold쥔 채로 더 기다림
no preempt강제로 빼앗지 못함
cycle서로가 서로를 기다림
정의

프로세스나 스레드가 상대가 가진 자원을 기다리며 아무도 진행하지 못하는 상태입니다.

자원 할당 그래프

프로세스와 자원을 노드로 놓고 요청과 할당 간선을 보면 순환 대기가 드러납니다.

DB 락

트랜잭션이 행 락을 다른 순서로 잡으면 데이터베이스에서도 같은 고리가 생깁니다.

파일 잠금

OS 파일 잠금은 순서와 timeout 규칙까지 정합니다.

증상

CPU 사용률은 낮은데 요청이 멈추고 스레드 덤프가 같은 락 대기를 반복합니다.

진단 도구

gdb, pstack, jstack, InnoDB status는 대기 중인 락과 호출 스택을 드러냅니다.