Ipcs

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Ressources IPC System V (mémoire partagée, sémaphores, files de messages)
Commande ipcs / ipcrm
Contexte Diagnostic de fuites IPC, nettoyage après un crash applicatif (bases de données notamment)
Voir aussi Grep, Awk (filtrage de la sortie)

ipcs affiche l'état des ressources de communication interprocessus System V actuellement allouées sur le système : segments de mémoire partagée, sémaphores et files de messages. Ces mécanismes sont largement utilisés par les bases de données (PostgreSQL, Oracle, DB2...) pour leur mémoire partagée interne, ce qui rend ipcs particulièrement utile pour diagnostiquer une fuite de ressources ou nettoyer des reliquats après un crash.

Affichage global

ipcs -a   # affiche les trois types de ressources en une seule fois

Par type de ressource

ipcs -m   # segments de mémoire partagée (shared memory)
ipcs -s   # sémaphores (semaphore arrays)
ipcs -q   # files de messages (message queues)

Exemple de sortie pour ipcs -m :

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x0052e2c1 32768      postgres   600        39845888   12
0xdeadbeef 65536      oracle     640        20971520   0

Colonnes utiles : shmid est l'identifiant à passer à ipcrm, owner l'utilisateur propriétaire, bytes la taille du segment, et nattch le nombre de process actuellement attachés — un segment avec nattch à 0 (comme le second ci-dessus) est un bon candidat orphelin, un segment avec nattch supérieur à 0 (comme le premier) est encore utilisé.

Supprimer une ressource IPC (ipcrm)

ipcrm -m <shmid>   # supprimer un segment de mémoire partagée
ipcrm -s <semid>   # supprimer un tableau de sémaphores
ipcrm -q <msqid>   # supprimer une file de messages

⚠️ AVERTISSEMENT : supprimer une ressource IPC encore utilisée par un process vivant peut le faire planter immédiatement. Les bases de données comme PostgreSQL ou Oracle dépendent lourdement de leur mémoire partagée System V pour fonctionner : ne jamais faire de ipcrm à l'aveugle sur une instance en production sans avoir d'abord vérifié qu'aucun process ne l'utilise encore (colonne nattch, et éventuellement lsof/fuser pour identifier les PID attachés).

Nettoyer les IPC orphelins d'un utilisateur après un crash

Cas d'usage typique : une base de données (ou tout autre process s'appuyant sur IPC System V) crashe et laisse derrière elle des segments de mémoire partagée, sémaphores ou files de messages orphelins, toujours possédés par son utilisateur système mais qu'aucun process vivant n'utilise plus. Ces ressources ne se libèrent jamais toutes seules — il faut les repérer et les supprimer explicitement.

Repérer puis supprimer, ressource par ressource, tout ce qui appartient à un utilisateur donné (ici postgres) :

ipcs -m | grep postgres | awk '{print $2}' | xargs -r ipcrm -m
ipcs -s | grep postgres | awk '{print $2}' | xargs -r ipcrm -s
ipcs -q | grep postgres | awk '{print $2}' | xargs -r ipcrm -q

grep postgres filtre les lignes appartenant à cet utilisateur (colonne owner), awk '{print $2}' en extrait l'identifiant (shmid/semid/msqid, deuxième colonne dans les trois cas), et xargs -r ipcrm -m (ou -s/-q) l'exécute pour chaque identifiant trouvé. À vérifier avant coup : le champ nattch, pour s'assurer qu'aucun process vivant n'est encore attaché à ces segments avant de les supprimer.

Voir aussi

  • Grep — filtrer les lignes par utilisateur avant suppression
  • Awk — extraire la colonne id à passer à ipcrm