Привет, Хабр!
У синхронного зависания в Rust есть приятное свойство: поток стоит на конкретной строке, и gdb или дамп покажут вам её. С async всё иначе. Задача, которая «висит», физически не занимает поток, она просто не возвращается в исполнитель. В стеке потока её нет, точнее, там будет исполнитель Tokio, который вежливо ждёт работу, и ни слова о том, какая ваша задача застряла и почему.
Отсюда особый жанр багов: сервис жив, отвечает на часть запросов, метрики CPU в норме, а часть запросов висит вечно или отвечает через минуту вместо десяти миллисекунд. Паники нет, лога нет, стек бесполезен.
Разберём, как такие вещи диагностировать — от простых случаев с блокирующим вызовом до тонких дедлоков на честном async‑мьютексе.