![]() |
|||||||||||||||||||||||||||||||||||||||||||||
|
Les latch Les latch sont des mécanismes de sérialisation de très bas niveau qui protégent les structures de mémoire partagées dans la SGA. Leur implémentation est intimement liée au système d’exploitation. Un latch est un type de verrou qui doit être très rapidement libéré, d’ailleurs ils connaissent uniquement deux états : mis ou pas mis ! Typiquement, ils empêchent que plus d’un process modifie la zone mémoire qu’ils protégent. Pour qu’un process puisse altérer la zone mémoire protégée par un latch, l’autre process qui détient ce latch doit le relâcher. Si le process qui détient le latch meurt, ORACLE déverrouillera les zones de mémoire et nettoiera le latch. Globalement, aux latch sont associés divers niveaux qui permettent d’éviter les deadlocks. Un process qui tient un latch à un niveau quelconque ne peut pas demander un latch d’un niveau inférieur, à moins qu’il ne le demande en mode dit nowait.
Du fait de la portée des latch (niveau atomique) et leur durée, aucun autre moyen de protection de la mémoire n’est nécessaire. Il n’y a pas de files d’attente des latch : le latch teste la disponibilité de la zone qu’il doit protéger : si elle est disponible, il la bloque et il la protége, si elle est déjà protégée, ou bien il s’endort et il la teste après son réveil (latch de type willing to wait) ou bien il renonce. Ce comportement ne garantit donc pas que les latch soient acquis dans l’ordre d’arrivée des demandes. Chaque zone mémoire est protégée par son type de latch. La liste des latch avec leurs niveaux respectifs peut être obtenue par la requête :
Select name, level# from v$latch order by level#; Les latch sont des verrous qui protégent la mémoire accédée par plusieurs transactions concurrentes. Ils aident la sérialisation des événements au niveau atomique (bloc). Ils pointent vers les zones protégées et sont en deux états : ON si la mémoire est protégée, sinon il est OFF. Ils agissent durant un bref intervalle de temps et ils sont spécifiques à l’instance. Un process doit acquérir un latch lors de l’utilisation d’une structure quelconque dans la SGA. Pendant la durée de l’utilisation le latch sera maintenu, il sera libéré à la fin de l’opération. Chaque type de latch (en ORACLE 8i ils sont 81), protège un type de zone de la SGA qui lui donne son nom : redo allocation latch, lru latch, etc. Tout autre process qui a besoin du même latch attendra que celui-ci soit libéré. Si un process meurt avec le latch verrouillé, PMON le libère. Le phénomène d’attente d’un latch par un process est appelé spin. Pendant l’attente (sleep), le process essaie à des intervalles réguliers d’acquérir le latch. Le degré d’utilisation des latch est visible dans v$latch. Il est essentiel que la période d’acquisition des latch reste très courte. L’algorithme de modification concurrente d’une zone de mémoire est le suivant :
Tuning des latch Il est important de noter que l’attente pour les latch est coûteuse: les process consomment de la CPU pendant les brefs moments de recherche du latch. Les attentes sont de deux catégories :
willing-to-wait
Si le latch demandé en ce mode n’est pas disponible, le process réitérera sa démarche jusqu'à l’obtention du latch
immediate
Si le latch demandé en ce mode n’est pas disponible, le process renoncera à l’obtenir.
La vue V$LATCH contient des statistiques pour chaque type de latch. Les différentes colonnes représentent les statistiques des divers types d’essais d’obtentions des latch. Les colonnes GETS, MISSES et SLEEPS reflètent les requêtes en mode willing to wait, ou GETS représente le nombre de requêtes satisfaites, MISSES est le nombre initial de fois où un latch de ce type a été recherché et non obtenu, SLEEPS est le nombre de fois où un process a attendu un latch après un échec. Les colonnes IMMEDIATE_GETS et IMMEDIATE_MISSES reflètent les statistiques concernant les latch recherchés en mode immediat, ou IMMEDIATE_GETS est le nombre d’obtentions et IMMEDIATE_MISSES le nombre d’échecs dans ce même mode.
Les latch les plus couramment vérifiés (parce que les plus rebelles) sont :
Cache buffers chains latch
Ce latch est nécessaire lors de la recherche des buffers dans le cache.
Cache buffers LRU chain latch
Ce latch est nécessaire pour pouvoir accéder à la liste LRU .
Redo allocation latch
Ce latch contrôle l’allocation de la mémoire pour les informations redo dans le redo log buffer. Il existe un seul latch de ce type par instance.
Redo copy latch
Ce latch est nécessaire quand la taille d’une information redo est supérieure au paramètre LOG_SMALL_ENTRY_MAX_SIZE.
Row cache objects latch
Ce latch protège les données caches du dictionnaire.
Avant de modifier les paramètres non documentés, consulter le support technique ORACLE. Lors de la mesure des attentes, quelques-unes sont liées au latch : latch free
Cet événement intervient lors de la demande par un process d’un latch de type "willing to wait", que le latch n’est pas disponible et donc le process attend (spin). Il apparaît dans plusieurs situations, mais généralement lors d’une surcharge du library cache (lc trop petit, trop de process concurrents, etc).
|
||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||