Rechercher sur arkzoyd.com

30 mai 2007

Latches & Enqueues /*+ 1. Latches */

Qu'est-ce qu'un "latch" et et à quoi les différents "latches" servent-ils ?

Un latch est un MutEx (i.e. Mutual Exclusion), c'est à dire un mécanisme qui permet d'assurer qu'un seul processus (ou thread) manipule une ressource particulière à un moment donné... Leur ensemble permet de protéger les différentes structures de la SGA (la mémoire partagées d'Oracle) ainsi un process qui lit ou modifie une structure mémoire a la garantie qu'aucun autre process ne modifiera la même structure. C'est un peu comme si les latches étaient des clés unique pour chacune des structures de la SGA et que avant de les manipuler, le process devait obligatoirement prendre cette clé. De cette manière, les structures mémoire sont protégées contre d'éventuelles erreurs dues à des manipulations concurrentes.

Comment un process acquière-t-il un latch ?

Les latches sont donc des points de sérialisation de l'instance Oracle; ils ne permettent pas des sérialisation au niveau de plusieurs instances dans le cas de RAC, dans ce cas, ce sont des enqueues qui seront utilisés. Que se passe-t-il donc si un process veut acquérir un latch et qu'il est déjà pris ? Avant tout, il faut préciser qu'il y a 2 manières de tenter d'acquérir un latch soit (willing to wait) avec l'intention d'attendre soit (no wait) sans l'intention d'attendre. La seconde méthode est explicite et c'est notamment le cas des latchs associés au log buffer : si un process n'arrive pas à prendre le latch, alors il essaiera d'accéder à un autre latch du même type.

Dans le cas où un process veut accéder à un latch avec l'intention de l'acquérir quoiqu'il arrive, il se passe ce qui est illustré ci-dessous :

  1. Avant d'accéder à une structure protégée par un latch, le process réclame le latch
  2. Si aucun process ne l'utilise, il le récupère et peut manipuler la structure
  3. Si, au contraire, un autre process utilise le latch, il va tenter plusieurs fois de récupérer le latch. On dit qu'il "spin" ! Le nombre de tentative dépend du paramètre caché _spin_count que vous pouvez récupérer la valeur avec la requête suivante : select b.ksppstvl value
    from sys.x$ksppi a, sys.x$ksppsv b where a.indx = b.indx and a.ksppinm like ‘\_spin\_count’ escape ‘\’;
  4. Si au bout du nombre maximal de tentative, il échoue toujours, le processus dort pendant quelques millisecondes
  5. Le process peut alterner les phases de spin et d'endormissement jusqu'à ce que le latch soit disponible
  6. Lorsqu'il le peu, le process acquiert le latch et manipule la structure sous-jascente
Remarques :
Les opérations sur les structures de la SGA qui requièrent l'utilisation d'un latch sont très courtes (quelques ms). Pour une opération plus longue comme le vérouillage d'une table, Oracle utilise les enqueues.
Dans le cas des latchs, l'ordre d'arrivée n'est pas équivalent à l'ordre d'utilisation. Il est possible qu'un process arrive après un autre process pour prendre un latch et que pourtant, il profite du temps pendant lequel le premier dort pour prendre le latch et utiliser la structure sous-jacente.

Comment en savoir plus sur les latchs utilisés par vos instances ?

La liste des différents types de latches est disponible dans la vue V$LATCHNAME.

Pour plus de détails sur les statistiques associées à chacun des types de latches, consultez V$LATCH qui contient
  • le nombre de latches obtenus (GETS),
  • le nombre de demandes de latches échouées (MISSES)
  • le nombre de fois qu'un process a dormi (SLEEP).
Cette table contient également les valeurs pour les latches avant utilisés la méthode "no wait" :
  • le nombre de latches obtenus (IMMEDIATE_GETS),
  • le nombre de demandes de latches échouées (IMMEDIATE_MISSES)
La vue V$LATCH_CHILDREN contient les adresses de chacun des latches par type. Lorsqu'un process réserve un latch, ce latch est réalité identifié par une adresse correspondant à une valeur dans cette vue. Cela permet de découper un type de ressource en nombreux morceaux et ainsi faciliter les accès concurrents. Par exemple, le latch "Cache Buffers Chains" qui protège les accès aux "cache buffers" est en fait constitué de plusieurs centaines d'adresses dans lesquelles les blocs sont répartis au moyen d'un algorithme de hash. De cette manière plusieurs process peuvent accéder de manière concurrente au buffer cache tout en garantissant qu'il ne se géneront pas mutuellement.

D'autres vues dynamiques permettent également d'en savoir plus sur les latchs :
  • V$LATCH_PARENT est identique à la vue V$LATCH
  • V$LATCH_MISSES contient plus d'informations sur les tentatives d'acquisition de latches ayant abouti à ce que le process dorme
  • V$LATCHHOLDER contient des informations sur les process qui possèdent actuellement un latch
  • Les vues GV$xxx qui permettent de visualiser les mêmes données pour toutes les instances du RAC
Mais également l'ensemble des interfaces wait events; Pour connaître les temps associées aux latches de l'instance depuis son démarrage, exécutez la requête suivante :
select *
from v$system_event
where event like 'latch%';

Et biensûr les vues qui contiennent les clichés des vues précédentes et qui permettent de voir les tendances ou identifier un problème passé :
  • STAT$LATCH, STAT$LATCH_MISSES_SUMMARY, STAT$LATCH_CHILDREN, STAT$LATCH_PARENT pour Oracle Statspack
  • DBA_HIST_LATCH_NAME, DBA_HIST_LATCH, DBA_HIST_LATCH_CHILDREN, DBA_HIST_LATCH_PARENT, DBA_HIST_LATCH_MISSES_SUMMARY pour Automatic Workload Repository (AWR nécessite les licences Diagnostic Pack)
Conclusion
Si vous pensez que cette série à propos des latchs et des enqueues à un quelconque intérêt et que vous voulez que je la continue, faîtes le moi savoir : je peux descendre dans le détail de plusieurs type de latch, discuter des enqueues ou parler de l'influence de ces derniers sur RAC; Qu'en pensez-vous ?

-GarK!

Latches & Enqueues /*+ Introduction */

Latches et enqueues sont au coeur des algorithmes d'Oracle et sont, sinon l'origine de tous types de contentions, la solution que le SGBD met en oeuvre pour les adresser :
  • Comment s'assurer que le vous ne lisez pas un bloc pendant qu'il est modifié par un autre utilisateur ?
  • Comment garantir que 2 processus n'écrivent pas leur données au même endroit dans la mémoire partagée ?
  • Comment mettre en corrélation les différentes modifications liées à une transaction pour les effacer en cas de crash du processus ?
  • Comment garantir qu'un verrou sur une ligne sera bien respecté par les autres utilisateurs ?
Voici quelques questions parmi les milliers qu'Oracle adresse avec des latches et des enqueues.

Comprendre le fonctionnement de ces structures ainsi que les raisons de leurs manifestations est donc essentiel pour comprendre pourquoi vos bases de données, même si elles sont performantes, ne permettront pas d'absorber plus de charge. C'est également essentiel pour faire la corrélation entre les statistiques et attentes (waits) des bases de données avec leur paramétrage, le fonctionnement du système d'exploitation ou celui de l'application.

En outre certains enqueues (TM, SQ...) ont, au même titre que les échanges de blocs inter-instances, des impacts importants sur le fonctionnement de RAC. Pour vous en persuader, vous serez surpris d'observer que le scripts ci-dessous ne s'éxécute pas dans les mêmes délais sur toutes les instances de votre RAC (faites l'opération plusieurs fois pour vous assurer de la reproductibilité des résultats - Si vous n'observez pas le phénomène parce que vous avez un interconnect performant, exécutez le script de manière concurrente sur plusieurs instances et comparez les temps "elapsed") :

set timing on

begin
for i in 1..50000 loop
lock table dual in exclusive mode;
commit;
end loop;
end;
/

Voilà, si ça intéresse quelqu'un (autre que toi maman !), ce post peut-être le premier d'une série plus longue sur ce que sont latches, enqueues, leurs types, leurs causes et comment les adresser. Qu'en pensez-vous ?

-GarK!

24 mai 2007

Quelques très (très) bon liens /*+ RAC */

Entre réseaux, RAC et ASM, voici quelques excellents documents glanés sur le Web

L'excellent site de Luca Canali et ses encore plus excellents documents :

Un autre site tout aussi intéressant de Julian Dyke et sa dernière présentation intitulée RAC Internals

-GarK!

23 mai 2007

Rapports RAC dans la SQL*Developer Plugin

J'ai ajouté 6 rapports RAC dans la Plug-In SQL*Developer comme vous pouvez le voir dans la copie d'écran ci-dessous :

Pour les télécharger, si vous avez déjà installé la Plug-In, sélectionner simplement le menu "Help | Check for Updates..." et effectuez la mise à jour, sinon, regarder mon post précédent ici.

-GarK!

22 mai 2007

A la MindManager

Le Web est plein de surprise et après Excel, Word ou Powerpoint, c'est à MindManager d'avoir un bébé clone http://www.mind42.com.

L'inscription est gratuite (pour l'instant) alors si vous cherchez un outils pour dessiner les méandres tortueux de vos pensées...

-GarK!

21 mai 2007

Enterprise Users sans OID

Il y a bientôt un an, j'expliquais sur ce même blog comment configurer les Enterprise Users avec iPlanet par l'intermediaire d'OID et de la de la "delegated authentication". Eh bien le monde et l'informatique bougent ! Mark Wilcox indique ici qu'il est désormais possible d'utiliser Oracle Virtual Directory 10.1.4.2 (aka OctectString) pour faire la même chose.

Vous pourrez donc bientôt stocker vos utilisateurs Oracle dans n'importe quel LDAP. Dommage qu'il faille encore attendre au moins la 11.1 pour que ça fonctionne avec les drivers JDBC thin.

-GarK!

Le patch 10.1.4.2 peut être téléchargé sur OTN ici.

Frontières françaises et Spatial

Pour développer une application spatial ou simplement pour vos démos, NAVTEQ fournis depuis quelques temps déjà un ensemble de frontières de pays comprenant :
  • La France
  • D'autres pays
Dans la Oracle 11x, il devrait y être tous, d'ici là téléchargez le bundle sur OTN (http://www.oracle.com/technology/software/products/mapviewer/index.html)

1ère application pratique, vous pourrez tracer l'orthodromie entre la belle ville de Maubeuge (0.87760972 radian Latitude;0.069231399 radian Longitude) et mon prochain domicile aux aletours de 45°19' Nord et 75°40' Ouest. 2ème application, Vous pouvez télécharge les coordonnées de :
Voilà, vous pourrez bientôt dessiner vos graphiques de ventes par pays aussi facilement que des camemberts sous Excel grace à Oracle 11x, Locator et ces nouvelles données.

-GarK!

14 mai 2007

Plugin SQL*Developer

Vous pouvez ajoutez ma plugin à SQL*Developer 1.1 ou supérieur comme décrit ci-dessous :
  • Sélectionnez le menu "Help | Check for Updates..."
  • Sur la page "Source", cliquez sur le bouton "Add..." pour ajouter un nouveau site de mise à jour et mettez à jour les champs suivants avant de cliquez sur le bouton "OK" :
    • name : ArKZoYd Update Center
    • location : http://arkzoyd.free.fr/center.xml
  • Sur la page "Updates" cochez "Partitioning tab and dimensions objects 0.2"
  • Cliquez sur le bouton "Fin" et redémarrez SQL*Developer
Note :
A cause d'un bug en cours de correction, il est possible que vous ayez à redémarrer SQL*Developer une seconde fois pour qu'il fonctionne correctement.


Le plugin ajoute les 2 fonctionnalités suivantes à SQL*Developer :
  • Un répertoire "Dimensions" en dessous de "Materialized View Logs" qui permet de voir les dimensions que vous avez créées
  • Un onglet "More About Partitions" lorsque vous sélectionnez une table qui donne plus d'informations sur les statistiques des partitions associées à la table
Avant de terminer, il faut préciser que ce plugin est en bonne partie construit sur une contribution anonyme alors si vous voulez vous aussi soumettre des propositions ou du code, n'hésitez pas à partager vos idées.

-GarK!

12 mai 2007

Mesurer son travail

Pour mesurer votre travail, voici un site web plus qu'intéressant http://www.slimtimer.com
Vous créer des taches et les chronométrer.


Idéal pour enfin savoir le temps que vous consacrez à travailler (vraiment).

-GarK!

Ateliers RAC

Il y a plusieurs façon de monter une plateforme Real Application Clusters :
  • Vous avez la possibilité d'utiliser une plateforme complète et valide (comme ici sur Linux)
Ou... Vous avez la possibilité d'utiliser des trucs complètement non supportés et qui marchent quand-même (quoique !) :
J'ai récemment installé une cible iSCSI Enterprise Target sur CentOS 4.4 en m'inspirant de ce document. Avec l'initiator Cisco, après avoir paramétré (correctement !) les firewalls et mis les bonnes bibliothèques (y compris C et C++ 3.2.3) , ça marche et c'est plutôt simple.

GarK!

07 mai 2007

Se connecter à un serveur VNC à travers un serveur passerelle

Après une bonne heure, ça y est, ça fonctionne enfin ! Ci-dessous le schéma de mes ennuis :

La question c'est donc comment se connecter avec WinVNC 4 à un serveur VNC à travers une machine qui sert de passerelle... On peut utiliser cette technique pour se connecter également à un serveur Oracle ou à n'importe que autre type de service ! Pour cela, il suffit de configurer un tunnel SSH me direz-vous...

Commençons par le piège...
Le client WinVNC 4 ne permet pas par défaut de se connecter à un serveur VNC sur la machine locale. Et justement, c'est l'impression qu'à le client VNC lorsqu'on établit un tunnel SSH. La solution consiste à ajouter la valeur DWORD nommée "AllowLoopBack" dans la registry dans la clé [HKEY_LOCAL_MACHINE\SOFTWARE\ORL\WinVNC3] (Oui WinVNC3 même si vous utilisez WinVNC 4 !). Si les clés n'existent pas, ce qui est probable, il faudra les créer

Un peu de détails quant à la création d'un tunnel SSH
Pour créer un tunnel SSH, vous pouvez par exemple utiliser putty ou cygwin. Je préfère Cygwin parce que, si l'installation est plus longue la mise en oeuvre est plus simple et la syntaxe identique aux systèmes Unix. Mais détaillons les étapes à valider...
  1. Vérifiez que vous avez sélectionné le package OpenSSH (dans la catégorie Net) lors du paramétrage de Cygwin. Tapez "ssh" au prompt Cygwin pour valider que le package est installé?. Sinon, relancez le programme setup.exe que vous pouvez télécharger depuis la page d'accueil de Cygwin : http://www.cygwin.com.
  2. Une fois ssh installé, connectez vous allez vous connecter au serveur passerelle en déclarant pour établir le tunnel avec la commande suivante :
    ssh -L :: @ cat -
    Le détail de ce qui suit est le suivant :
    • : est le port qui va être alloué sur le client et que vous allez adresser pour dialoguer avec votre serveur VNC
    • : est le nom (ou l'adresse IP) du serveur VNC
    • : est le port du serveur VNC. Les ports par défaut sont 5901 (pour :1) à 5906 (pour :6)
    • : est un nom d'utilisateur qui vous permettra de vous connecter sur le serveur passerelle
    • : est le nom ou l'adresse Ip du serveur passerelle
    • cat - : permet de maintenir en vie le tunnel
  3. Lorsque vous vous connectez, une clé pour la connexion SSH peut vous être réclamée. Le mot de passe de l'utilisateur du serveur vous servant de passerelle vous est demandé. Saisissez-le ; le tunnel est établi !
  4. Pour vous connecter, lancez le client VNC et tapez "localhost:" dans la fenêtre de connexion au serveur VNC. Si le serveur vous demande un mot de passe, vous êtes connecté.
Autres utilisations
  • Vous pouvez utiliser un tunnel SSH entre un serveur de base de données et un serveur qui héberge une base de données de standby. Dans ce cas, la passerelle est également le serveur cible. Cela permet de chiffrer les données qui transitent entre les serveur de production et de standby. Cela permet également (option -C lors de l'établissement du tunnel ssh) de compresser les données entre les 2 serveur et ainsi de réduire par un facteur allant jusqu'à 5x le flux de données entre les 2 serveurs... au prix de CPU bien sur !
  • Vous pouvez utiliser un tunnel comme un point de destination d'un autre tunnel à condition d'avoir utilisé l'option "-g" pour permettre cette mise en cascade. Vous pouvez ainsi créer des tunnels aussi long que le tunnel sous la manche et masquer votre identité.
Terminons par un autre piège
Si vous voulez créer un tunnel SSH entre votre machine et un serveur Oracle sous Windows (et Windows seulement), cela ne fonctionnera pas. En effet, contrairement aux systèmes Unix et Linux actuels qui continuent à dialoguer après l'établissement de la connexion TCP. Pour changer ce fonctionnement par défaut de Windows et arriver à créer un tunnel SSH pour vous connecter à Oracle, positionner la variable de registre d'Oracle USE_SHARED_SOCKET (cf la doc correspondante).

-GarK!

Audit Vault enfin dehors !

Annoncé en même temps que Database Vault, Audit Vault est un référentiel sécurisé de l'ensemble des informations d'audit de vos bases de données etd es outils Oracle. Il peut être téléchargé sur OTN: http://www.oracle.com/technology/software/products/auditvault/index.html

GarK!

2 liens sans rapport et intéressants

-GarK!