Gestion de bases de données

Comment diagnostiquer une utilisation élevée du processeur par ORACLE.EXE sous Windows

S'APPLIQUE À : Oracle Database - Enterprise Edition

Oracle Database - Enterprise Edition - Version 9.2.0.5 et ultérieures
Les informations de ce document s'appliquent à toutes les plateformes.

OBJECTIF : processus Oracle, processeur

Cet article explique en détail comment obtenir plus d'information sur l'utilisation du processeur par le processus Oracle sous Windows.

Sous Windows, les processus Oracle sont représentés comme des "threads" du processus Oracle ; si une session utilise beaucoup de processeur, cela s'affiche donc simplement comme "Oracle utilise le processeur". Pour trouver la cause première, vous devrez peut-être descendre au niveau des threads à l'aide des informations fournies.

Pour des informations générales sur le diagnostic de l'utilisation du processeur, voir :

Document 352648.1 How to Diagnose High CPU usage problems

SOLUTION : Process Explorer

Sysinternals Process Explorer

est un exécutable autonome téléchargeable sur www.sysinternals.com, lien direct : http://technet.microsoft.com/en-US/sysinternals/bb896653.

Cet utilitaire offre une interface graphique qui vous permet de surveiller l'utilisation du processeur par les processus et, surtout pour Oracle, par chacun des threads. Une fois les détails du thread obtenus, vous pouvez vous en servir pour extraire de l'information depuis Oracle et déterminer ce que fait le processus concerné, afin de déboguer son activité.

Utilisation

  • Téléchargez et installez Process Explorer depuis www.sysinternals.com
  • Lancez Process Explorer sur le système dont vous voulez analyser l'utilisation du processeur par Oracle
  • Repérez l'exécutable qui vous intéresse (dans la plupart des cas, Oracle.exe). Ici, nous avons pris "sqldeveloper.exe" comme exemple :
  • Double-cliquez sur l'exécutable pour ouvrir ses propriétés. Si un avertissement signale des symboles manquants, vous pouvez l'ignorer :
  • Sélectionnez l'onglet "Threads" de la fenêtre des propriétés : la liste des threads du processus devrait s'afficher. Sélectionnez celui que vous voulez analyser (probablement celui qui utilise le plus de processeur) :

Muni de l'identifiant du thread, vous pouvez maintenant obtenir les informations Oracle dont vous avez besoin sur le processus au moyen de différentes requêtes SELECT :

SELECT p.spid "Thread ID",
  b.name "Background Process",
  s.username "User Name",
  s.osuser "OS User",
  s.status "STATUS",
  s.sid "Session ID",
  s.serial# "Serial No.",
  s.program "OS Program"
FROM v$process p,
  v$bgprocess b,
  v$session s
WHERE s.paddr  = p.addr
AND b.paddr(+) = p.addr
AND p.spid     = --TID decimal value-- ;

Thread ID                Backg User Name                      OS User                        STATUS   Session ID Serial No.
------------------------ ----- ------------------------------ ------------------------------ -------- ---------- ----------
OS Program
------------------------------------------------
16723                    VKRM  SYS                            scott                          ACTIVE          200      53883
sqlplus@myserver (TNS V1-V3) 


Vous pouvez aussi exécuter la requête suivante pour obtenir le texte de l'instruction SQL en cours :

SELECT s2.sql_text
FROM v$process p,
  v$session s1,
  v$sqlarea s2
WHERE p.addr          = s1.paddr
AND s1.SQL_HASH_VALUE = s2.HASH_VALUE
AND p.spid            = --TID decimal value--; 

SQL_TEXT
--------------------------------------------------------------------------------
SELECT s2.sql_text FROM v$process p,   v$session s1,   v$sqlarea s2 WHERE p.addr
          = s1.paddr AND s1.SQL_HASH_VALUE = s2.HASH_VALUE AND p.spid
 = 16723

Recueillir plus d'information

Maintenant que le processus est identifié et son activité examinée de près, plusieurs actions sont possibles :

  • Tracer la session : pour tracer la session, utilisez l'identifiant du thread pour vous attacher au processus avec oradebug :
•	connect / as sysdba
•	ALTER SESSION SET tracefile_identifier = '10046';
•	oradebug setospid XXXX
•	oradebug unlimit
•	oradebug event 10046 trace name context forever, level 12 
•	oradebug tracefile_name

Pour désactiver la trace :

 oradebug event 10046 trace name context off.
  • Recueillir des errorstacks pour le débogage : pour recueillir des errorstacks, utilisez l'identifiant du thread pour vous attacher au processus avec oradebug :
•	connect / as sysdba
•	ALTER SESSION SET tracefile_identifier = 'STACK';
•	oradebug setospid XXXX
•	oradebug unlimit
•	oradebug dump errorstack 1
•	oradebug dump errorstack 1
•	oradebug dump errorstack 1
•	oradebug tracefile_name
  • Terminer la session à l'aide du sid et du serial# obtenus à partir de l'identifiant du thread :
•	SELECT p.spid "Thread ID",
•	  s.sid "Session ID",
•	  s.serial# "Serial No."
•	FROM v$process p,
•	  v$session s
•	WHERE s.paddr  = p.addr
•	AND p.spid     = --TID decimal value-- ;
•	
•	Thread ID                Session ID Serial No.
•	------------------------ ---------- ----------
•	16723                           200      53883
•	
•	ALTER system kill session 'sid, serial#';

Les traces sont écrites dans la destination de trace habituelle de votre version. En 11g, vous pouvez trouver l'emplacement du fichier de trace ainsi :

SQL> SELECT value FROM v$diag_info WHERE name='Default Trace File';

VALUE
--------------------------------------------------------------------------------
/dbadmin/v11203/trace/v11203_ora_16723.trc

Pour en savoir plus sur les traces et les errorstacks, voir :

Document 376442.1 Recommended Method for Obtaining 10046 trace for Tuning
Document 1364257.1 How to Collect Errorstacks for use in Diagnosing Performance Issues

Ancienne solution : Qslice

REMARQUE : les informations qui suivent sont fournies à titre historique et de référence seulement. Les outils mentionnés ne sont peut-être plus offerts et les URL indiquées ne sont peut-être plus actives.

Quick Slice est un exécutable autonome, qslice.exe, inclus dans le NT 4.0 Resource Kit. Cet utilitaire vous permet de surveiller l'utilisation du processeur par les threads d'arrière-plan du processus Oracle.

QuickSlice indique le pourcentage de l'utilisation totale du processeur pour chaque processus d'un système. Cet outil ressemble à Pstat.exe, mais présente l'information sous forme graphique.

Téléchargez et installez "Qslice.exe: CPU Usage by Processes".

Vous pouvez le télécharger à partir du lien ci-dessous. Consultez le fichier README.txt pour la marche à suivre détaillée.

https://technet.microsoft.com/en-us/library/bb625087.aspx

Étapes :

-- Lancez Quick Slice sur le serveur.

-- Une fois Quick Slice démarré, un affichage graphique présente tous les processus du serveur.

-- Pour afficher les threads d'un processus, trouvez le processus et double-cliquez dessus.

Par exemple, pour voir tous les threads d'une base de données Oracle 8.0.x :
- trouvez le processus ORACLE.EXE
- double-cliquez dessus

-- Un autre affichage graphique apparaît et montre tous les threads ainsi que l'utilisation du processeur de chacun. La barre rouge représente le temps noyau (Kernel Time) consommé par ce thread ; la barre bleue, le temps utilisateur.

-- Repérez le TID dont le temps noyau et le temps utilisateur sont élevés.

-- Pour faire correspondre les numéros de TID à l'identifiant de processus des threads Oracle, vous devrez convertir le numéro de TID de l'hexadécimal au décimal à l'aide de la calculatrice scientifique.

Dans certaines versions, le nombre hexadécimal doit compter 4 caractères.
Par exemple, la valeur hexadécimale '39B' fournie par qslice doit devenir '39B0'.