La mémoire partagée

Identifiants

La mémoire partagée est allouée par le serveur logiciel au démarrage : chaque serveur, test et prod, a sa propre mémoire partagée.

Chaque mémoire a un numéro identifiant (défini au démarrage du serveur logiciel). On trouve ce numéro dans le répertoire tmp à la racine du serveur. Depuis loris/, il faut faire : cd ../../../tmp
On trouve là deux fichiers texte contenant le numéro de la mémoire partagée allouée par les deux serveurs logiciels : _ShmPath_test_ et _ShmPath_unics_

Pour connaître les détails des segments de mémoire partagée utilisés, lancer la commande : ipcs -m.
On doit retrouver dans la colonne shmid les numéros contenus dans les fichiers _ShmPath_test_ et _ShmPath_unics_

Exemple :

-sh-2.05b$ ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0xdf636be4 0          oraclev8  640        30703616   18
0x91024108 65538      loris     644        5000000    6
0x00000978 98307      loris     600        4456448    7
0x00000b0c 131076     loris     666        4194304    1
0x00000000 163845     loris     600        46084      11         dest
0x910240bb 196614     loris     644        5000000    6
0x00000e34 229383     loris     600        4456448    7

Dans cet exemple, le numéro 65538 est aussi contenu dans _ShmPath_unics_

Les permissions 600 sont affectées aux mémoires de communication.
Les permissions 644 sont affectées aux mémoires partagées.
Pour un système avec deux bases (prod et test), il devrait donc y avoir 4 lignes dont le propriétaire est loris.

Lorsqu'on lance un StopServer, la mémoire partagée est détruite.

Mémoires fantômes

Il peut arriver que le numéro contenu dans l'un des fichiers _ShmPath_<base>_ ne corresponde plus aux numéros renvoyés par ipcs -m.
Pour tester ça, il suffit de faire un StopServer : normalement, la mémoire partagée et la mémoire de communication disparaissent.
Si des segments de mémoire restent affichés, ce sont des mémoires fantômes.
Dans ce cas apparaît le risque que les modifications de paramétrage faites sur le client ne soient pas répercutées, bien que les fiches de la table PARAMS soient bien mises à jour.
Le plus radical serait de relancer le serveur physique : shutdown -r now. Mais il vaut mieux utiliser la commande ci-dessous.

Détruire et recréer une mémoire partagée

Pour détruire une mémoire partagée, lancer ipcrm -m <Numéro de la mémoire>.
Par exemple : ipcrm -m 10485766
Cependant, cela ne règle pas le problème : le segment est marqué "dest" = à détruire. Mais il n'est pas réellement détruit tant qu'il y a des processus qui l'utilisent (le nombre de processus est indiqué par nattch).

Pour recréer une mémoire partagée, aller dans bin/ : dt_loaddesc -U test -P test -A A.LORIS (pour la base test).

Un lien très instructif.