Un processus est bloqué : quelle est votre démarche ?

Questions d’entrevue Linux

Seniorprocessusdiagnostic

Bloqué n’est pas une seule maladie

« Ç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.

La séquence

  1. ps -o pid,stat,wchan:32,etime,cmd -p PID
    L’état et le noyau dit qu’il dort. wchan wait_for_completion + NFS oriente tout de suite.

  2. /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.

  3. 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).

  4. Les journaux et l’unité.
    Un reload qui n’a jamais fini, un lockfile, un flock sur un fichier partagé.

  5. strace -p un court instant, filtré, si les étapes 1–4 ne suffisent pas : dernier syscall qui ne revient pas.

  6. 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.

Ce que l’intervieweur pénalise

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é).

La relance

« 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.

Toutes les questions Linux