TASK_UNINTERRUPTIBLE
Linux / DevOps
Траблшутинг зависания процессов в состоянии D-State (Uninterruptible Sleep) в Linux
- Процессы находятся в статусе
Dв выводеps/topи не завершаются поkill -9. - Аномальный рост показателя Load Average при низком использовании CPU.
- В
dmesgпоявляются сообщенияINFO: task blocked for more than 120 seconds. - Зависание операций ввода-вывода с сетевыми хранилищами (NFS, Ceph, CIFS) или локальными дисками.
1. Идентификация зависших процессов
ps -eo pid,user,state,time,command | awk '$3 ~ /D/ {print $0}'2. Анализ точки зависания в ядре
PID=12345
cat /proc/$PID/wchan
cat /proc/$PID/stack3. Проверка блокировок и дискового I/O
iostat -xz 1 5
dmesg -T --level=err,warn | grep -Ei "timeout|blocked|hung_task|nfs|sd[a-z]"4. Аварийная разблокировка
Если проблема связана с зависшей сетевой шарой, выполните отложенное принудительное размонтирование:
umount -f -l /mnt/remote_shareЕсли зависание вызвано блокировкой очереди dirty pages, принудительно сбросьте кэши:
sync
echo 3 > /proc/sys/vm/drop_caches
Практический опыт инженера:
Процессы в D-state почти всегда указывают на аппаратные тайм-ауты контроллеров дисков или сетевые сбои NFS. Не пытайтесь перезапускать зависимые сервисы вслепую — сначала проверьте стек /proc/PID/stack.
Частые вопросы (FAQ)
Почему процесс в состоянии D невозможно убить через kill -9?
В состоянии TASK_UNINTERRUPTIBLE процесс ожидает ответа от системного вызова ядра или драйвера оборудования. До завершения вызова ядро намеренно игнорирует любые асинхронные сигналы (включая SIGKILL), чтобы не допустить повреждения внутренних структур данных.
Как принудительно вывести стек всех заблокированных задач?
Включите SysRq и отправьте триггер: echo 1 > /proc/sys/kernel/sysrq && echo w > /proc/sysrq-trigger. Трассировка появится в выводе dmesg.