Как дебажить deadlock в production?

Senior
157 просмотров
AFK Offer AI

Deadlock в production — сервис зависает, не отвечает на запросы. Первый шаг: послать SIGQUIT (kill -3 pid) — Go напечатает все горутины со стеками в stderr. Ищешь горутины в состоянии "semacquire" или "lock" — они ждут мьютекс. Если две горутины ждут мьютексы друг друга — deadlock. Также помогает pprof mutex profile (go tool pprof /debug/pprof/mutex). Профилактика: фиксированный порядок захвата блокировок, не держи мьютекс при вызове внешних сервисов, используй context с timeout. В Go нет deadlock detector для пользовательских мьютексов — только для всех горутин сразу.

Следующий вопрос

Как провести spike?