Vos recrutements informatiques

700 000 développeurs, chefs de projets, ingénieurs, informaticiens...

Contactez notre équipe spécialiste en recrutement

Developpez.com - Oracle
X

Choisissez d'abord la catégorieensuite la rubrique :


Réglages des redo

Date de publication : le 20 Octobre 2005

Par Mohammed Bouayoun
 


I. log file switch completion
II. log file switch (checkpoint incomplete)
III. L'attente de l'évènement log file sync
III.1. fréquence très élevée des validations
III.2. E/S lent
III.3. Log Buffer trop grand
IV. log file parallel write
V. log buffer space
VI. Log file sequential read
VI. Les latchs et les redos
VI-A. Le latch redo allocation
VI-B. Le latch redo copy
VI-C. Le latch redo writing


I. log file switch completion

Dans Oracle 10g, L'événement d'attente log file switch completion fait partie de la classe Configuration. Il faut toujours tenir compte des considérations suivantes :

idea Les log switch excessif provoqué par des petites tailles de fichiers redo et les transactions, produit beaucoup d'entrées redo.
Si une session passe beaucoup de son temps de traitements à attendre dans l'événement log file switch completion, c'est parce que la taille des fichiers redo sont petites par rapport à la quantité d'entrées redo qui se reproduisent, provoquant de nombreux log switch. La session Oracle attend constamment que le processus LGWR termine l'écriture dans le fichier redo en cours et d'ouvrir de nouveau un autre fichier redo.

Le temps d'attente de l'évènement log file switch completion peut être diminuer ou éliminer en réduisant le nombre de log switch. Cela signifie qu'on a besoin de créer de nouveaux groupes de fichiers redo assez grand et supprimer les anciens groupes. Un fichier redo assez grand diminuera le nombre de switch log et les checkpoints classiques qui sont très coûteux.

info Un simple log switch entraîne l'arrêt des générations redo, lecture et écriture dans les fichiers de contrôle (statut et SCN des fichiers redo), décharge de la mémoire, fermeture et ouverture des fichiers redo et encore d'autres ressources.
Quelle est la taille du fichier redo ?

La réponse dépend de la taille du fichier redo en cours, du taux actuel de switch log et de l'objectif fixé en nombre de log switch par heure pendant les traitements. Pour trouver la fréquence des log switch en utilise la requête données dans la section log buffer space. Si notre objectif est de 4 fichiers redo par heure au lieu de 60 et que la taille du fichier redo en cours est de 20M, alors le nouveau fichier redo devrait avoir une taille de 300M (60*20M/4).

Les étapes d'un log switch :

La génération des redo est entièrement désactivés pendant un log switch. Cela ça se fait en fixant la variable SGA reflétant la cause et le statut du log switch. Les sessions à propos de l'allocation d'espace dans le log buffer vérifie cette variable en premier et si le log switch est en progression, il attend dans l'un des plusieurs évènements d'attentes associées avec le log switch. Aucune allocation d'espace dans le log buffer n'est tenté tant que le log switch n'a pas été finis, en plus, l'événement d'attente log buffer space ne devrait pas être vu pendant le log switch. Pourtant, si un grand nombre de process attend un log switch d'être fini alors il peut être une explosion de génération redo par la suite cela à pour résultat un deuxième attente de log buffer space.

Le process LGWR accompli les 4 étapes suivantes pour effectuer un log switch :

  1. Il accompli une transaction de fichier de contrôle pour choisir le prochain fichier redo à utiliser et 'initialise l'entrée dans le fichier de contrôle. Normalement, c'est le fichier redo ayant le plus bas SCN qui est choisi. Si nécessaire, le log switch peut être retardé jusqu'au point où le process DBWR termine le log switch checkpoint suivant la précédente utilisation de ce fichier redo et jusqu'au processus ARCn à fini d'archiver. S'il en est ainsi , les sessions qui attendent le log switch devrait faire une pause dans l'événement d'attente log file switch (checkpoint incomplete) ou log file switch (archiving needed) à la place de l'événement log file switch completion.
  2. Il décharge touts les redo restants du log buffer vers le disque, et écrit après le SCN du dernier enregistrement redo du fichier redo (le high SCN) dans l'entête du bloc du fichier redo. Une fois ces écritures sont finies, le process LGWR ferme le fichier redo.
  3. Il fait avancer le SCN et accompli une deuxième transaction de fichier de contrôle pour marquer le prochain fichier redo comme CURRENT, et marque l'ancien fichier redo comme ACTIVE. Le statut de ce fichier redo devrait être modifié en INACTIVE, une fois le process DBWn à terminer le log switch checkpoint. Si la base est en mode ARCHIVELOG, alors le process LGWR ajoute aussi le fichier redo précédent dans la liste liée d'archive à travers la section des entrées du fichier redo dans le fichier de contrôle (voir V$ARCHIVE) et si l'archivage automatique est activé, il envoi le process ARCn pour l'archiver. A partir d'Oracle 8.1, le process LGWR peut créer un nouveau process ARCn jusqu'à la valeur log_archive_max_processes, si les processus d'archivages sont encore occupés.
  4. Finalement, le process LGWR ouvre tous les membres du nouveau groupe de fichiers redo et écrit le nouveau numéro de séquence et le low SCN dans l'entête du bloc. Après, il active les générations des redo à nouveau.
Les écritures dans les blocs de l'en-tête du fichier redo durant les opérations d'ouvertures et de fermetures sont des opérations log file single write. Les écritures dans l'entête du bloc sont des simples écritures ( plutôt que les écritures parallèles dans tous les membres du groupe) car une partie des informations de l'entête est le numéro de fichier ce qui est différent pour chaque membre.

info Les fichiers redo assez grands ont pour résultats un temps de restauration assez long. Oracle fournit le paramètre FAST_START_MTTR_TARGET pour entretenir le temps de restauration suite à un crash en réglant le lancement des checkpoints (depuis Oracle 9i) . Dans Oracle 8i, on utilise le paramètre FAST_START_IO_TARGET. Et dans les versions antérieures, on règle les checkpoints avec les paramètres LOG_CHECKPOINT_INTERVAL et LOG_CHECKPOINT_TIMEOUT.

II. log file switch (checkpoint incomplete)

Dans 10g, l'événement d'attente log file switch (checkpoint incomplete) fait partie des classes Configuration. Il faut toujours tenir compte des considérations suivantes :

info Les log switch excessif sont provoqués par de petites tailles de fichiers redo et un taux très élevé de transaction.
Le log file switch (checkpoint incomplete) et le log file switch completion sont deux évènements très proches et partagent la même cause, c'est à dire, la taille des fichiers redo sont assez petites par rapport à la quantité des entrées redo qui sont produites. Quand on a l'un de ces évènements, normalement on a l'autre. Dans ce cas, les processus foreground attendaient le processus DBWR au lieu d'attendre le processus LGWR. Cela arrive, quand une application produit beaucoup d'entrées redo, tellement que le processus LGWR n'arrive plus à recycler les fichiers redo car le DBWR n'a pas encore fini de copier les blocs modifiés. Le processus LGWR ne peut pas sur écrire ou passer le prochain fichier redo, car le checkpoint est incomplet. La solution est d'augmenter la taille des fichiers redo et d'ajouter d'autres groupes.


III. L'attente de l'évènement log file sync

Dans 10g, l'événement d'attente log file sync fait partie des classes Configuration. Il faut toujours tenir compte des considérations suivantes :

  • L'événement log file sync est relatif à l'arrêt des transactions (commit ou rollback).
  • Quand un processus passe beaucoup de temps sur l'événement log file sync, il indique généralement de nombreux commits ou des transactions assez brèves.
Oracle enregistre à la fois les transactions et les blocs modifiés dans le log buffer, une méthode connu sous le nom de : physiological logging. Le processus LGWR est responsable de libérer la place dans le log buffer en écrivant le contenu du log buffer dans les fichiers redo :

  • Toutes les trois secondes.
  • Quand la taille du log buffer est 1/3 pleins ou il a 1M d'entrées redo.
  • Quand un utilisateur valide ou annule une transaction.
  • Quand il est signalé par le process DBWR.
Les écritures initiées par des validations ou des annulations utilisateurs sont connues sous le nom d'écritures synchrone ; le reste est connu sous le nom d'écritures background. L'attente log file sync est toujours en rapport avec les écritures synchrone. Il se peut qu'un processus utilisateur effectue une grande transaction qui génère beaucoup d'entrées redo ce qui déclenchera le processus LGWR à exécuter des écritures background, mais la session de l'utilisateur n'attendra jamais que les écritures background se terminent. Toutefois, au moment où la session utilisateur valide ou annule sa transaction et le paramètre _WAIT_FOR_SYNC est à TRUE, le processus poste le LGWR et attends dans l'événement log file sync pour que le processus vide les entrées redo en cours, inclus le marqueur commit, dans les fichiers redo. Durant la synchronisation de ces fichiers redo, le processus LGWR attend en faveur d'une écriture synchrone pour terminer dans l'événement log file parallel write tandis que la session utilisateur attends en faveur d'un processus de synchronisation pour terminer dans l'événement log file sync.

Une fois le process entre dans l'attente log file sync, il aura deux possibilités pour sortir. L'un, est quand le process foreground est posté par LGWR quand la synchronisation des fichiers redo est complète. L'autre, est quand l'attente à fait une pause ( typiquement en 1 seconde), à un tel point que le process foreground vérifie le SCN courant du fichier redo pour déterminer si ces validations ont était effectué dans le disque. Si c'est arrivé, le process continue le traitement, sinon le process attend.

warning Il ne faut jamais modifier le paramètre _WAIT_FOR_SYNC à FALSE, même pas dans une base de développement ou une base de test, car les transactions validées ne sont plus garanties d'être restaurer suite à une défaillance instance. Certains personne l'utilise pour tricher sur les benchmarks.
Typiquement, L'attente log file sync est un événement sans incident. Il est bref et à peine perceptible par l'utilisateur final. Pourtant, une multitude de ces attentes peut contribuer à des temps de réponses longues et trace des statistiques dans les vues V$SYSTEM_EVENT et V$SESSION_EVENT. Utiliser cette requête pour trouver les sessions en cours qui passent la plupart de leurs traitements à attendre dans l'événement log file sync depuis l'ouverture de la session. Evaluer le TIME_WAITED avec USER_COMMIT et HOURS_CONNECTED. Pour découvrir qui exécute beaucoup de commit entre deux points spécifiques dans le temps, on peut calculer le delta en utilisant l'exemple suivant :
select a.sid,
       a.event,
       a.time_waited,
       a.time_waited / c.sum_time_waited * 100 pct_wait_time,
       d.value user_commits,
       round((sysdate - b.logon_time) * 24) hours_connected
from   v$session_event a, v$session b, v$sesstat d,
       (select sid, sum(time_waited) sum_time_waited
        from   v$session_event
        where  event not in (
                    'Null event',
                    'client message',
                    'KXFX: Execution Message Dequeue - Slave',
                    'PX Deq: Execution Msg',
                    'KXFQ: kxfqdeq - normal deqeue',
                    'PX Deq: Table Q Normal',
                    'Wait for credit - send blocked',
                    'PX Deq Credit: send blkd',
                    'Wait for credit - need buffer to send',
                    'PX Deq Credit: need buffer',
                    'Wait for credit - free buffer',
                    'PX Deq Credit: free buffer',
                    'parallel query dequeue wait',
                    'PX Deque wait',
                    'Parallel Query Idle Wait - Slaves',
                    'PX Idle Wait',
                    'slave wait',
                    'dispatcher timer',
                    'virtual circuit status',
                    'pipe get',
                    'rdbms ipc message',
                    'rdbms ipc reply',
                    'pmon timer',
                    'smon timer',
                    'PL/SQL lock timer',
                    'SQL*Net message from client',
                    'WMON goes to sleep')
        having sum(time_waited) > 0 group by sid) c
where  a.sid         = b.sid
and    a.sid         = c.sid
and    a.sid         = d.sid
and    d.statistic#  = (select statistic# 
                        from   v$statname 
                        where name = 'user commits')
and    a.time_waited > 10000
and    a.event       = 'log file sync'
order by pct_wait_time, hours_connected;

 SID EVENT         TIME_WAITED PCT_WAIT_TIME USER_COMMITS HOURS_CONNECTED
---- ------------- ----------- ------------- ------------ ---------------
 423 log file sync       13441    84.9352291        62852              15
 288 log file sync       13823    85.3535042        63007              15
 422 log file sync       13580    85.7648099        62863              15
 406 log file sync       13460    87.0239866        62865              15
 260 log file sync       13808    87.0398386        62903              15
info Dans un environnement RAC, le process background LMS doit enregistrer les attentes dans l'événement log file sync. Cala à cause du mécanisme write ahead logging. Quand un process foreground demande un bloc depuis une autre instance, toutes les entrées redo associé avec le bloc doit être flashé dans le disque avant le transfert du bloc. Dans ce cas, le process background LMS lance la synchronisation de log et attend dans l'événement log file sync.

III.1. fréquence très élevée des validations

Parmi les causes de l'attente log file sync est la fréquence très élevée des validations (commit). Il faut trouver si la session qui passe plus de temps dans l'événement log file sync appartient à un batch ou à un processe OLTP ou si c'est un middle-tier (comme Tuxedo, Weblogics, etc.)

Si la session appartient à un process batch, il doit être validé à chaque modification de la base à l'intérieur d'un loop. Découvrir le nom du module et demander au développeur de revoir dans leurs codes si les nombres de commit peut être diminués. C'est un problème d'applications, et la solution est simplement d'éliminer les validations non nécessaires et réduire la fréquence des validations.

Certains développeurs d'applications ont appris que s'ils valident rarement, les jobs devrait s'échouer suite au manque d'espace dans les segments d'annulations. La bonne chose à faire est de valider à la fin de chacune des transactions. Une transaction est une unité de travail. Une unité de travail devrait réussir ou échouer dans son entité. La place convenable pour une validation ou annulation est à la fin de chaque unité de travail. Ne pas ajouter des validations supplémentaires aux bénéfices des espaces d'annulations ou des deadlocks. Il traite le symptôme mais ne résout pas le problème. (Si vous utilisez AUM, alors allouer plus d'espace au tablespace undo et mettre le temps de rétention undo approprié.)

Introduire des validations supplémentaires peut créer d'autres problèmes, parmi eux, la fameuse ORA-01555: l'erreur snapshot too old car l'annulation (ou undo) des données peuvent être sur écrites. Une fréquence de commit trop élevé augmente aussi le temps système qui est associé avec le démarrage et la fin des transactions. Au début de chaque transaction, Oracle assigne un segment d'annulation (appelé segment d'annulation imposé) et mets à jours la table de transaction dans l'entête du segment d'annulation. La table de transaction doit être aussi mise à jours à la fin de chaque transaction, suivi par une validation de l'activité de nettoyage. Mettre à jours l'entête du segment d'annulation doit aussi être enregistré dans le log buffer car le bloc à été modifié. Pourtant, le fait de valider à la fin d'une unité de travail résoudra le problème. Le commit dans un loop à besoin d'être enlevé de telle façon que le commit d'un travail se fasse à la fin.

Si la session qui passe beaucoup de temps dans l'événement log file sync est une connexion persistance d'une couche middle-tier, alors c'est un cas difficile car il servit plusieurs utilisateurs frontaux. On doit tracer la session avec l'événement 10046 et observer le comportement de l'application. Chercher l'événement log file sync dans le fichier trace. Ils nous donneront une idée sur la fréquence des validations. Alternativement, on peut creuser les fichiers redo par le Logminer. Cela montrera le comportement des validations dans le système.

Dans une base OLTP, on observe normalement, un temps d'attente élevé du log file sync au niveau système (V$SYSTEM_EVENT) mais pas au niveau session. Le temps d'attente élevé au niveau système doit être mené par des petites transactions des sessions OLTP qui sont se connecte et se déconnecte activement dans la base. Si c'est notre scénario, le seule chose que nous pourrons faire est d'assurer un circuit stable d'E/S pour le process LGWR. Cela inclus l'utilisation les E/S/ asynchrones et mettre les fichiers redo dans des périphériques RAW ou un équivalent, comme Veritas Quick I/O, cela est servi par des contrôleurs E/S dédié ou mieux encore, utiliser des disques performants pour les fichiers redo.


III.2. E/S lent

Examiner la vue V$SYSTEM_EVENT comme il suit pour découvrir le temps d'attente moyen de LGWR (événement log file parallel write). Le temps d'attente moyenne de 10ms (1cs) ou inférieur est généralement acceptable.
select * 
from   v$system_event 
where  event in ('log file sync','log file parallel write'); 

EVENT                    TOTAL_WAITS TOTAL_TIMEOUTS TIME_WAITED AVERAGE_WAIT
------------------------ ----------- -------------- ----------- ------------
log file parallel write      6411138              0     3936931   .614076783
log file sync                6597655           9819     6534755    .99046631
Un débit trop élevé d'E/S dans un système peut améliorer la moyenne du temps d'attente des évènements log file sync et log file parallel write. Pourtant, ce n'est pas une excuse de ne pas régler l'application si elle est mal conçue et valide fréquemment. On doit tenter de bien chercher la couche de la base et l'E/S du sous-système, peut être-il est difficile de traiter avec un groupe d'application ou une application third-party. Toutefois, parce qu'est une application third-party ne donne pas au vendeur le droit lancer des codes bric-à-brac dans la base. A savoir qu'on ne peut pas résoudre ce genre de problème applicatif. Chaque modification effectuée par notre soin dans la base donnera l'impression à l'utilisateur que c'est un problème de la base.

Il y'a plusieurs choses qu'on peut fournir avec l'aide de l'administrateur système concernant l'attente log file sync en augmentant le débit d'E/S des fichiers redo. Cela inclus l'utilisation des connexions fibre optique (FC) au bases sous SAN (storage area network), Ethernet gigabit (Gig-E) ou des connexions en Bande Infini à la base sous NAS (network attached storage), SCSI utltrawide ou des connexions FC à au bases sous DAS (direct attached storage) ; reseaux privés ; switches à haut-vitesse ; contrôleurs d'E/S dédié ; E/S asynchrones ; Placer les fichiers redo dans des péréphiriques RAW et lier le LUN dans RAID 0 ou 0+1 à la place de RAID 5, et ainsi de suite.


III.3. Log Buffer trop grand

Suivant l'application, un log buffer surdimensionné (plus grand que 1M) peut étendre les attentes log file sync. Un log buffer large réduit le nombre d'écritures background et permet au processe LGWR d'être paresseux et provoque beaucoup d'entrées redo de s'accumuler dans le log buffer. Quand un processe valide, le temps d'écriture synchrone ne devrait pas être long car le processe LGWR à besoin de copier beaucoup d'entrées redo. La taille de notre log buffer ne devrait pas être petit, cela provoquerai les sessions à servir l'évènement log buffer space plus ou moins grand ce qui prolongera les attentes log file sync. D'une part, on veut un log buffer assez large pour faire face aux demandes d'espaces du log buffer durant la génération explosive des redo, surtout immédiatement après un log switch. D'autre part, on veut un log buffer assez petit pour augmenter les écritures background et réduire le temps d'attente du log file sync. Pour satisfaire les deux demandes, c'est le paramètre _LOG_IO_SIZE, qui est par défaut le 1/3 du LOG_BUFFER ou 1mb, peu importe si c'est inférieur. C'est l'un des seuils qui signale au process LGWR de commencer à écrire. En d'autres mots, on peut avoir un log buffer assez large, mais un _LOG_IO_SIZE assez petit devrait augmenter les écritures background, qui à la suite réduit le temps d'attente log file sync. Beaucoup d'activités de LGWR mat une lourde charge dans les latches redo copy et redo writing. Voir l'événement d'attente log file parallel write.

Par défaut, le paramètre _LOG_IO_SIZE est réduit à 1/6 de la taille du LOG_BUFFER dans Oracle 10g. Car la valeur par défaut du paramètre _LOG_PARALLELISM_MAX est à 2 quand le paramètre COMPATIBLE est fixé à 10.0 ou plus. La valeur par défaut de _LOG_IO_SIZE dans Oracle 10g se calcule en divisant la taille du LOG_BUFFER avec la taille de bloc du journal (LEBSZ) et la valeur de kcrfswth, comme ici :
orcl> oradebug setospid 14883Oracle pid: 5, Unix process pid: 14883, image: oracle@aoxn1000 (LGWR)
orcl> oradebug unlimitStatement processed.
orcl> oradebug call kcrfw_dump_interesting_dataFunction returned 90F42748
orcl> oradebug tracefile_name/orahome/admin/orcl/bdump/orcl_lgwr_14883.trc
orcl> !grep kcrfswth /orahome/admin/orcl/bdump/orcl_lgwr_14883.trc   kcrfswth = 1706
orcl> select value from v$parameter where name = 'log_buffer';VALUE---------------5242880
orcl> select max(LEBSZ) from x$kccle;MAX(LEBSZ)----------       512
orcl> select 5242880/512/1706 from dual; 5242880/512/1706----------------      6.00234467
info La valeur du paramètre PROCESSES assez large peut aussi augmenter les attentes log file sync. Durant chaque opération de synchronisation, le LGWR doit balayer la structures de données des processes pour découvrir les sessions qui attendent dans cet événement et ceux qui écrivent leurs redo dans le disque. Diminuer le nombre de processes peut aider à réduire les vastes attentes log file sync. Utiliser la vue V$RESOURCE_LIMIT comme guide. D'après Oracle, ce problème est résolu dans Oracle 9.2.

IV. log file parallel write

L'évènement d'attente log file parallel write à trois paramètres : fichiers, blocs et demandes. Dans 10g cette évènement fait partie des classes des attentes E/S systèmes. Il faut tenir compte des ces trois clés s'il y a un évènement d'attente log file parallel write.

  • L'évènement log file parallel write concerne seulement le process LGWR.
  • Un LGWR lent, peut influencer le temps de commit du processe foreground.
  • Des attentes significatives du log file parallel write est susceptible d'être un sujet de E/S.
L'événement d'attente log file parallel write concerne seulement le process LGWR. Quand il est temps d'écrire, Le process LGWR écrit le redo buffer dans les fichiers de journalisation en ligne en lançant des séries d'appels écriture système dans l'OS. Le process LGWR attend en faveur des écritures pour terminer l'événement d'attente log file parallel write. Le process LGWR cherche les blocs redo pour les écrire toutes les trois secondes, pendant le commit, pendant le rollback, quand le seuil _LOG_IO_SIZE est atteint, quand 1M d'entrée redo est dans le log buffer et quand c'est signalé par le process DBWR.

Quoique les sessions utilisateurs n'influencent pas l'événement d'attente log file parallel write, elles peuvent avoir un impact en ralentissant le process LGWR. Un process LGWR lent, peut exalter les attentes log file sync, à laquelle les sessions utilisateurs attend durant les commits ou les rollbacks. Les sessions utilisateurs n'obtiendront pas une reconnaissance complète d'un commit ou d'un rollback jusqu'à ce que le LGWR à terminer son écriture.

Les statistiques clés de la base à tenir en compte sont TIME_WAITED et AVERAGE_WAIT des évènements d'attentes log file parallel write et log file sync :
SQL> select event, time_waited, average_wait from   v$system_event
 where  event in ('log file parallel write','log file sync');

EVENT                       TIME_WAITED     AVERAGE_WAIT
-------------------------   -----------    -------------
log file parallel write            1736             ,58
log file sync                       161             ,44
Si l'attente de l'évènement log file parallel write est plus grand que 10ms, cela indique normalement un débit lent d'E/S. Activer les écritures asynchrones si les redo logs sont dans des devices raw et si l'OS supporte les E/S asynchrones. Malheureusement, on ne peut pas utiliser plus qu'un seul process LGWR. Dans ce cas, il est nécessaire de ne pas surcharger Le point de montage et le contrôleur ou se trouve les fichiers de journalisation. Déplacer les fichiers de journalisation dans des disques rapides peut aussi aider. Il est fortement conseillé d'éviter de mettre les redo logs dans les disques RAID5.

En plus des améliorations du débit d'E/S, on peut diminuer la quantité des entrées redo. Si possible, utilisez l'option NOLOGGING. Les indexes devrait être crées ou reconstruis avec l'option NOLOGGING. Les opérations CTAS doivent utiliser aussi cette option.

idea L'option NOLOGGING ne s'applique pas à des opérations DML normal comme les insertions, les mises à jours et les suppressions. Les objets créent avec l'option NOLOGGING ne sont pas restaurés à moins qu'une sauvegarde à été faite avant la corruption. Une base en mode FORCE LOGGING devrait enregistrer dans les journaux toutes les modifications (excepté pour les tablespaces temporaire), sans soucier de la fixation des tablespaces et des objets.
Une fréquence basse de validation aux détriments de l'usage des segments d'annulations fourni aussi quelques soulagements. Une fréquence élevée de validation provoque le process LGWR d'être hyperactif et quand il est couplé avec débit d'E/S assez lent devrait seulement exagérer les attentes du log file parallel write. L'application qui doit traiter un grand ensemble de données dans un loop et valide chaque modification, provoquera le log buffer d'être flashé fréquemment. Dans ce cas, il faut modifier l'application pour qu'il valide moins fréquemment. Il peut y avoir aussi plusieurs sessions courtes qui se connecte à la base, exécutant des opérations DML rapide, et se déconnecte. Dans ce cas, le modèle de l'application doit être revu. On peut trouver ailleurs celui qui valide le plus fréquemment avec la requête suivante :
SQL> select sid, value from   v$sesstat where  statistic# = (select statistic#
where  name = 'user commits')order by value;

       SID      VALUE
---------- ----------
       142          0
       170          0
       151          0
       152          0
       154          0
       160          0
       146          0
       162          0
       163          0
       164          0
       165          0
       166          0
       167          0
       168          0
       169          0
       161        134

16 ligne(s) sélectionnée(s).
Une autre évidence des validations excessive est le gaspillage élevé des redo.
SQL> select b.name, a.value, round(sysdate - c.startup_time) days_old 
from   v$sysstat a, v$statname b, v$instance c
where  a.statistic# = b.statistic# 
and    b.name      in ('redo wastage','redo size');

NAME            VALUE       DAYS_OLD
-------------   --------    --------

redo size       36833328           0
redo wastage      912024           0
Vérifier le job scheduler pour voir si une sauvegarde à chaud à été lancé durant les heures de pointe. Il est capable de créer une grande quantité d'entrées redo, qui à la suite augmente l'attente du log file parallel write. Une sauvegarde à chaud devrait être lancé en dehors des heures de pointe.

A la fin, Il faut faire attention de ne pas charger le LGWR avec de nombreux entrées redo en même temps. Cela peut arriver avec un grand log buffer car le seul 1/3 est aussi grand et garde plus d'entrées redo. Quand le seuil 1/3 est atteint, le process LGWR accompli l'écriture background s'il n'est pas encore activé. Et la quantité des entrées redo doit être trop pour le process LGWR de traiter en une seule fois, provoquant le prolongement des attentes log file parallel write. Ainsi, l'idée est de verser les écritures LGWR. Cela peut être fait en diminuant le seuil 1/3, qui est contrôler par le paramètre d'initialisation _LOG_IO_SIZE. Par défaut _LOG_IO_SIZE est 1/3 du LOG_BUFFER ou 1MB, peu importe si c'est moins, exprimé en blocs de log. Requêter X$KCCLE.LENSZ pour avoir la taille du bloc d'un journal. Typiquement, c'est 512 bytes. Par exemple, si LOG_BUFFER est 2097152 bytes (2MB), et la taille du bloc journal est 512 bytes, alors la valeur par défaut de _LOG_IO_SIZE est 1365 de blocs de journal utilisés. A cette taille, le process LGWR devient paresseux et écrit normalement seulement à la fin des transactions (écritures synchrones) ou quand il se réveille de sa pause de 3 secondes. On devrait mettre _LOG_IO_SIZE à 64K. De cette façon, on peut calmer d'avoir un grand log buffer pour accorder les points de transitions pour l'espace tampon après les checkpoints, mais les écritures devraient démarrer quand il y'a 64K d'entrées redo dans le tampon, en supposant qu'il ni y a aucune validation ou annulation d'un utilisateur, et le LGWR en sommeil n'a pas écoulé son temps durant cette période.

info Le LGWR écrit les opérations qui réclament les latches redo copy et redo writing. Ainsi, plus de processe LGWR actif devrait augmenter la charge de ces latches. Ne réduisez pas _LOG_IO_SIZE si ces latches s'endorment souvent. Pourtant, si la condition nous permet de modifier _LOG_IO_SIZE, nous devons surveiller son impact en requêtant la vue V$LATCH. Assurez-vous d'obtenir une marge pour appliquer la modification.
On peut utiliser la requête suivante pour trouver le nombre moyen de blocs redo log par écriture et le moyen de la taille d'E/S LGWR en bytes :
select round((a.value / b.value) + 0.5,0) as avg_redo_blks_per_write,
round((a.value / b.value) + 0.5,0) * c.lebsz as avg_io_size
from v$sysstat a, v$sysstat b, x$kccle c
where c.lenum = 1
and a.name = 'redo blocks written'
and b.name = 'redo writes';

AVG_REDO_BLKS_PER_WRITE AVG_IO_SIZE
----------------------- -----------
8 8192

V. log buffer space

Dans 10g l'évènement log buffer space fait partie des classes des attentes Configuration. Il faut prendre en compte les considérations suivantes :

  • Les sessions attends dans l'événement log buffer space n'arrivent plus à copier les entrées redo dans le log buffer suite à un manque d'espaces.
  • Le process LGWR à la responsabilité de copier les entrées redo et de laisser la place à une nouvelle entrée.
En plus des statistiques de l'événement d'attente log buffer space, Oracle conserve aussi des statistiques redo buffer allocation retries au niveau session et système respectivement dans les vues V$SESSTAT et V$SYSSTAT. Les statistiques redo buffer allocation retries contient le nombre de fois que le process à attendu d'avoir de l'espace dans le log buffer. Pourtant, l'événement d'attente log buffer space c'est un très bon indicateur, car il contient les statistiques TIME_WAITED. Si une session passe beaucoup de temps dans l'événement d'attente log buffer space, c'est à cause des raisons suivantes :

  • Le log buffer dans le SGA est trop petit.
  • Le process LGWR est trop lent.
Un log buffer assez petit (moins que 512K) dans une base où il y'a des traitements batch, oblige les sessions à utiliser plus d'espaces dans le log buffer. Ajuster la valeur du LOG_BUFFER si c'est nécessaire. Le log buffer, n'est pas un composant dynamique du SGA, il faut redémarrer la base pour que le changement prenne effet.

Lorsque le débit d'E/S est assez lent, le process LGWR ne suivra pas la génération des redo et causera des attentes dans l'événement log buffer space. Les nouvelles entrées ne pourront plus écrire dans les entrées qui ne sont pas encore transférés dans le disque. Il faut s'assurer que la moyenne du temps d'attente dans l'événement log file parallel write est acceptable. Sinon, vous pouvez améliorer le débit d'E/S en utilisant la méthode utilisée dans la section log file sync.

On pourrait aussi voir comment l'application a été conçue pour réduire les activités des journaux. Utilisez les opérations NOLOGGING quand c'est nécessaire, il faut tenir compte que les objets créés par NOLOGGING ne peuvent pas être restaurés à moins qu'une sauvegarde ait été faite sur-le-champ. Si vous avez l'intention d'utiliser les opérations NOLOGGING, vérifier si l'option FORCE LOGGING est activée. L'option FORCE LOGGING peut être activé sur un objet, un tablespace ou sur la base. De même, vous pouvez checher les requêtes qui rapportent et mettent à jours une ligne en entier quand seulement quelques colonnes ont été modifiées. Ce n'est pas facile. Vous pouvez trouver ce comportement en fouillant les DML dans la vue V$SQL ou utiliser le logminer.


VI. Log file sequential read


VI. Les latchs et les redos

Les latchs qui protègent le log buffer sont :

  • Redo allocation
  • Redo copy
  • Redo writing

VI-A. Le latch redo allocation

Ce latch contrôle l'attribution d'espaces aux entrées redo dans le redo log buffer. Il y'a un seul latch redo allocation pour renforcer la nature séquentielle des entrées dans le buffer. Seulement après l'allocation, le process utilisateur doit copier l'entrée dans le buffer. Le process doit copier seulement en fonction du latch redo allocation si l'entrée redo est plus petit que le seuil de la taille, sinon un latch redo copy est nécessaire.


VI-B. Le latch redo copy

Un système avec plusieurs CPU doit avoir plusieurs latchs redo copy pour le redo log buffer. Dans un système à un seul CPU ne devrait pas avoir de contention pour le latch redo copy car seulement un seul process peut être activé au même moment.


VI-C. Le latch redo writing



Valid XHTML 1.1!Valid CSS!

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
Contacter le responsable de la rubrique Oracle