« Ça ne répond plus » mélange quatre situations. Les confondre fait tuer le mauvais process ou attendre un -9 qui ne viendra jamais.
Runnable mais affamé. État R, load élevé, peu de temps CPU obtenu : contention, pas hang. On regarde top, pidstat 1, nice, cgroup CPU.
Sleep interruptible (S). Le plus fréquent et souvent normal : epoll, select, attente d’une requête. Un worker idle est en S. Ce n’est bloqué que si le client, lui, attend une réponse depuis trop longtemps.
Uninterruptible (D). Attente I/O noyau : disque, NFS, iSCSI. kill -9 ne sert à rien tant que le driver ne revient pas. On regarde wchan / /proc/pid/stack (si exposé), iostat, le mount (nfsstat, dmesg reset SCSI). C’est le cas où « je ne peux pas le tuer » est la bonne observation, pas un échec.
Stoppé (T) ou zombie (Z). T : SIGSTOP, un débogueur. Z : le père n’a pas fait wait — le mort n’occupe plus de CPU, il occupe un PID. On soigne le père, pas le zombie.
ps -o pid,stat,wchan:32,etime,cmd -p PID
L’état et où le noyau dit qu’il dort. wchan wait_for_completion + NFS oriente tout de suite.
/proc/PID/fd et cwd.
Fichier sur un FS mort, socket vers une IP qui ne répond plus, pipe dont l’autre bout est mort.
Le réseau du process.
ss -p | grep PID : ESTABLISHED figé, SYN-SENT (l’autre n’accepte pas), beaucoup de CLOSE-WAIT (l’appli ne lit plus).
Les journaux et l’unité.
Un reload qui n’a jamais fini, un lockfile, un flock sur un fichier partagé.
strace -p un court instant, filtré, si les étapes 1–4 ne suffisent pas : dernier syscall qui ne revient pas.
Décider.
Relance du service si l’état est corrompu et l’I/O saine ; ne pas reboot la machine pour un D NFS sans avoir regardé le filer ; dump thread Java (jstack) si c’est du userspace et que le CPU est à zéro sur un service qui devrait travailler.
Redémarrer au premier mot. Dire « je fais un kill -9 » sans avoir lu STAT. Traiter un S idle comme un hang. Ignorer le cgroup (le process est throttlé, pas bloqué).
« Tous les process Apache sont en D. »
Ce n’est plus « Apache ». C’est le stockage ou le réseau de fichiers sous les DocumentRoot / les sessions. On remonte au mount, pas au Restart= de l’unité.
« strace ne montre rien. »
Soit vous n’êtes pas sur le bon thread (-f), soit c’est du CPU userspace (boucle, GC), soit le process est déjà D et le prochain syscall ne s’affiche pas comme vous l’attendez. On change d’outil, on ne force pas strace plus longtemps.
La méthode tient en une ligne : qualifier l’état, identifier la ressource attendue, n’agir qu’ensuite.