Das Wait Event Tuning hat sich in den letzten Jahren als

Werbung
Das Wait Event Tuning hat sich in den letzten Jahren als gegenüber dem
althergebrachten Ratio Tuning als klar überlegen, präziser und effizienter
herausgestellt.
Eine der Kernkompetenzen beim Einsatz von Wait Event Tuning ist die
Fähigkeit extended SQL-Trace Dateien auszuwerten, maschinell ein
Antwortzeitprofil zu erstellen und daraus die notwendigen
Optimierungsmassnahmen abzuleiten.
Der Beitrag erläutert die Prinzipien des Wait Event Tuning, den Aufbau
von extended SQL-Trace Dateien, die Ableitung performance-relevanter
Kenngrößen wie z.B. Antwortzeit, CPU-Verbrauch (Parse/Execute/Fetch),
Wartezeit, Klassifizierung der Latenzzeiten (Think Time) und die
Ableitung der notwendigen Massnahmen zur Performanceoptimierung.
Die maschinelle Auswertung von extended SQL-Trace Dateien mit der
Programmiersprache Perl wird besprochen und in einer Demonstration
gezeigt.
Wait Event Tuning
Antwortzeitprofilerstellung mit Extended
SQL-Trace
Norbert Debes
Diplom-Informatiker (Univ.)
Oracle Certified Professional DBA
[email protected]
Donald K. Burleson
●
Zitate aus dem Artikel "Busting the Oracle Myth
Busters"
–
–
–
–
–
"... there are virtually NO concrete rules for Oracle tuning
..."
"Even today, Oracle tuning remains very much an art
form ..."
"During the late 1990s, a small movement arose among
Oracle professionals who advocated the analysis of
10046 trace dumps [...] The dumps generate a huge hex
dump which reveals all Oracle wait events [...]"
"... Oracle10g Active Session History [ ... makes ... ] the
10046 dump largely obsolete."
"Everything depends on something else and Oracle
tuning will always remain more of an art form than a
science"
Definition
Wait Event Tuning ist ein Optimierungsverfahren für
die Leistungssteigerung von Anwendungen mit der
Zielsetzung aus einer präzisen Messung des
Anwendungsverhaltens ein Antwortzeitprofil zu
erstellen und aus diesem Profil Massnahmen für eine
höchstmögliche Leistungssteigerung abzuleiten,
umzusetzen und durch erneute Messung zu verifizieren.
Das Verfahren
Untersuchungsobjekt
auswählen
Messen
Antwortzeitprofil
berechnen
Performancediagnose
Verbesserungspotential
berechnen
Massnahmen
auswählen
Massnahmen
durchführen
Messung
●
extended SQL Trace
–
–
–
–
Datenbankoperationen (Stufe 1)
● PARSE, EXEC, FETCH, XCTEND
Warteereignisse (Stufe 8)
● WAIT
Werte von Platzhaltern (Stufen 4 und 12)
● BIND
Messdaten
● CPU-Verbrauch, Zeitdauer, Plattenzugriffe, Buffer
Cache Zugriffe, Latch Misses, etc.
Durchführung der Messung
●
●
●
●
●
●
ALTER SESSION SET EVENTS '10046 trace name
context forever, level 8';
DBMS_SYSTEM.SET_EV
DBMS_SUPPORT.START_TRACE_IN_SESSION
(dbmssupp.sql)
DBMS_MONITOR.SESSION_TRACE_ENABLE
(10g)
oradebug event
Empfehlung: LOGON/LOGOFF Trigger & ALTER
SESSION (alternativ: Session Level Statspack)
–
–
–
misst gesamte Sitzung und ist proaktiv einsetzbar
vermeidet Problem der fehlenden SQL-Anweisungstexte
bei nachträglichem Einschalten (Abhilfe: errorstack dump)
kann beim LOGOFF zusätzlich Werte aus V$ Views in die
Protokolldatei schreiben
Protokolldatei
PARSING IN CURSOR #6 len=129 dep=2 uid=0 oct=6 lid=0 tim=637105797174 ...
update seq$ set increment$=:2,minvalue=:3 ... where obj#=:1
END OF STMT
PARSE #6:c=10015,e=85,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=4,tim=637105797165
EXEC #6:c=0,e=359,p=0,cr=1,cu=2,mis=0,r=1,dep=2,og=4,tim=637105797706
STAT #6 id=1 cnt=1 pid=0 pos=1 obj=0 op='UPDATE '
STAT #6 id=2 cnt=1 pid=1 pos=1 obj=107 op='INDEX UNIQUE SCAN I_SEQ1 '
FETCH #4:c=10015,e=1830,p=0,cr=6,cu=3,mis=0,r=1,dep=1,og=4,tim=637105798114
WAIT #3: nam='db file sequential read' ela= 43401 p1=3 p2=13834 p3=1
WAIT #3: nam='db file sequential read' ela= 390 p1=3 p2=13842 p3=1
WAIT #3: nam='db file sequential read' ela= 11223 p1=3 p2=13850 p3=1
WAIT #3: nam='SQL*Net message to client' ela= 9 p1=1111838976 p2=1 p3=0
EXEC #3:c=20029,e=181918,p=3,cr=17,cu=9,mis=0,r=1,dep=0,og=4,tim=637105899398
*** 2005-08-15 00:24:56.503
WAIT #3: nam='SQL*Net message from client' ela= 12518228 p1=1111838976 p2=1
p3=0
PARSING IN CURSOR #5 len=85 dep=0 uid=79 oct=3 lid=79 tim=637118433031
hv=156408865 ad='7ae95d94'
SELECT produktid, hostname, produkttyp, produkt, standort FROM log_quellen
END OF STMT
PARSE #5:c=0,e=14995,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,tim=637118433018
WAIT #5: nam='SQL*Net message to client' ela= 7 p1=1111838976 p2=1 p3=0
WAIT #5: nam='SQL*Net message from client' ela= 1351 p1=1111838976 p2=1 p3=0
EXEC #5:c=0,e=99,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=637118434912
WAIT #5: nam='SQL*Net message to client' ela= 5 p1=1111838976 p2=1 p3=0
FETCH #5:c=0,e=171,p=0,cr=3,cu=0,mis=0,r=3,dep=0,og=4,tim=637118435125
WAIT #5: nam='SQL*Net message from client' ela= 4859437 p1=1111838976 p2=1
p3=0
XCTEND rlbk=0, rd_only=0
PARSING IN CURSOR, XCTEND
●
PARSING IN CURSOR
–
–
–
●
Text einer SQL-Anweisung
#n: Cursor Nummer
hv: Hash Value entspricht V$SQL.HASH_VALUE
XCTEND
–
–
–
COMMIT oder ROLLBACK
rlbk=[0,1]: 0=commit, 1=rollback
rd_only=[0,1]: 0=Transaktion bestand, 1: keine
Transaktion begonnen
PARSE, EXEC, FETCH
●
●
●
●
●
●
●
●
●
●
●
#n: Cursor Nummer
c: CPU-Verbrauch ab 9i in Mikrosekunden
e: Dauer (elapsed time) ab 9i in Mikrosekunden
p: Plattenzugriffe (physical reads)
cr: Consistent Reads
cu: Current Reads
mis: Cursor Misses
r: verarbeitete Zeilen (rows)
dep: Rekursionsebene (dep=0 summiert dep>0)
og: Optimizer Goal: 1=All_Rows, 2=First_Rows,
3=Rule, 4=Choose
tim: Zeitstempel ab 9i in Mikrosekunden
WAIT
●
●
●
●
●
●
#n: Cursor Nummer (Bezug zur verursachenden
SQL-Anweisung)
nam: Warteereignis (siehe Database Reference)
ela: Wartezeit ab 9i in Mikrosekunden
p1: Parameter 1 des Warteereignisses (siehe
Database Reference)
p2: Parameter 2 des Warteereignisses (siehe
Database Reference)
p3: Parameter 3 des Warteereignisses (siehe
Database Reference)
Antwortzeitprofil berechnen
●
●
Eingabedaten: Protokolldatei aus User Dump
Verzeichnis (user_dump_dest)
Vorsicht
–
–
●
Windows und Wiederverwendung der Protokolldateien
(SESSION ID:(<SID>.<Serial#>))
Shared Server (background_dump_dest)
Ausgabe: Ressourcennutzungsprofil
–
CPU-Verbrauch (EXEC, PARSE, FETCH; e=x)
Warteereignisse (WAIT; ela=y)
Antwortzeit R=∑ edep=0 + ∑ elawaits between calls
–
Statistiken
–
–
Antwortzeitprofil
$ ./esqltrc_profiler.pl mapsvr-17-580-lauf1.trc
Note: Oracle version 9.2 trace file. Timings are in microseconds (1/1000000 sec)
Response time: 2468.587 secs; max(tim)-min(tim): 2489.735
Total wait time time: 2317.096 secs
---------------------------Note: 'SQL*Net message from client' waits for more than 0.020 secs are considered
think time
Wait events and CPU usage:
Duration
Pct
Occurences
Average wait event/CPU usage/think time
-------- ------ ------------ ---------- ----------------------------------1938.709s 78.54%
149 13.011471s think time
377.659s 15.30%
80643 0.004683s SQL*Net message from client
148.062s
6.00%
257278 0.000575s total CPU
3.428s
0.14%
unknown
0.299s
0.01%
80793 0.000004s SQL*Net message to client
0.194s
0.01%
4422 0.000044s SQL*Net more data to client
0.118s
0.00%
120 0.000985s log file sync
0.095s
0.00%
10 0.009487s db file sequential read
0.015s
0.00%
216 0.000071s SQL*Net more data from client
0.006s
0.00%
40 0.000146s latch free
--------- ------- ----------------------------------------------------------2468.587s 100.00% Total response time
Total number of roundtrips (SQL*Net message from/to client): 80792
CPU usage breakdown
-----------------------parse CPU: 8.093750s
exec CPU: 8.859375s
fetch CPU: 131.109375s
Antwortzeitprofil (Fortsetzung)
Statistics:
----------COMMITs (read write): 120 -> transactions/sec 0.049
COMMITs (read only): 0
ROLLBACKs (read write): 0
ROLLBACKs (read only): 0
rows processed: 160073
cursor misses: 472
consistent gets: 314570
db block gets: 1294
physical reads: 8
buffer cache hit ratio: 100.00%
Physical read breakdown:
-----------------------single block: 10
multi-block: 0
Latch wait breakdown
-----------------------library cache pin
shared pool
library cache
waits:
waits:
waits:
1 sleeps:
7 sleeps:
32 sleeps:
Enqueue wait breakdown (enqueue name, lock mode)
-----------------------------------------------HW,X waits:
4
TX,S waits:
7
0
0
0
Think Time
●
●
●
●
●
●
Think Time bezeichnet bei interaktiven
Anwendungen, die Bedenkzeit, die der Benutzer
braucht, um die nächste Aktion auszulösen
nicht optimierbar
erkennbar an 'SQL*Net message from client'
kurze Dauer: normaler Roundtrip (LAN ca. 0,5ms 5ms)
lange Dauer: Anwendung tut andere Dinge
falls Think Time Hauptanteil der Antwortzeit
–
●
dann kein Datenbankperformanceproblem!
Vorsicht: bei überlasteten CPUs kommt Prozess
nicht zum Zug und 'SQL*Net message from client'
steigt
Extended SQL-Trace Profiler
Demonstration
cd /cygdrive/c/home/ndebes/it/perl/esqltrcprof
ls -l aspnet-21.5308-lauf1.trc
./esqltrc_profiler.pl -t 20 aspnet-21.5308lauf1.trc
TKPROF vs. Profiler
●
Zahlen für rekursive und nicht rekursive Wait
Events sowie CPU müssen summiert werden
Antwortzeit fehlt!
TKPROF vs.
Profiler
Extended Trace vs. Sampling
●
Shee ("Oracle Wait Interface") propagiert Sampling
alle 60s ohne Berücksichtigung von SQL*Net
message from client
–
–
●
Problem: Think Time kann nicht abgeleitet werden
ohne Think Time kann Frage, ob es Datenbankproblem
ist, nicht beantwortet werden
10g erstellt automatisch Messproben (Automatic
Session History, Automatic Workload Repository)
–
–
eine Messprobe pro Sekunde
Warteereignis, SQL-Anweisung, Objekt das Warten
verursacht
extended Trace vs. Sampling
extended Trace
proaktiv
–
– historische Daten für
nachträgliche Analyse
–
– vor 10g eigenes
Sampling-Tool
–
erforderlich (Jan van
Mourik:
–
http://www.rhdba.com)
– ab 10g automatisch,
–
aber ASH, AWR sind
kostenpflichtig (Diag.
Fazit:
Pack 2375€/CPU)!
– Sampling ist sinnvoll und v.a. wegen der historischen
Daten auf Sitzungsebene wertvoll
– extended Trace ist die detailreichste und präziseste
Messung
–
●
reaktiv
vollständige Messwerte
Algorithmus der
Anwendung erkennbar
unnötige PARSEs
mitsamt SQL erkennnbar
versionsübergreifend
einsetzbar (8i, 9i, 10g)
Mehraufwand verfälscht
Messung
Sampling
–
Performancediagnose erstellen
●
●
Komponenten mit höchstem Ressourcenverbrauch
sind das Problem und bergen das größte
Verbesserungspotential
Verursachende SQL-Anweisungen durch TKPROF
und/oder Lesen der Protokolldatei finden
–
●
●
TKPROF mit Sortieroption (z.B. fchcpu, fchela) gemäß
Profil aufrufen
Bind-Variablen in SQL-Anweisungen?
Algorithmus der Anwendung meist erkennbar
–
Bewertung des Algorithmus
Häufige Probleme und Symptome
●
zu viele Roundtrips
●
●
keine Bind-Variablen
●
●
●
●
●
●
●
fehlende Indizes, schlechte
Join-Reihenfolge
unnötig wiederholtes Parsen
z.B. in Schleifen
Sequences mit NOCACHE
zu häufiges COMMIT
eigene Zähler (keine
Sequence)
zeilenweises FETCH auf große
Datenmenge
●
●
●
●
●
●
hohe 'SQL*Net message from
client'
hohe WAITs mit Bezug auf den
Library Cache
hohe WAITs auf sequential bzw.
scattered read oder hoher CPUVerbrauch bei FETCH (Cache!)
erhöhte PARSE CPU
rekursives SQL bei jedem Zugriff
auf die Sequence (dep>0)
erhöhtes WAIT auf 'log file sync'
und erhöhte 'SQL*Net message
from client' wg. zus. Roundtrips
erhöhte WAITS auf 'enqueue' im
Mehrbenutzerbetrieb
viele FETCH Aufrufe mit r=1
Verbesserungspotential
berechnen
●
●
●
Verbesserungspotential von Codeänderungen oder
administrativen Eingriffen ist durch Messwerte (tim,
ela, e) berechenbar
evtl. Prototyp mit alter Implementierung und neuer
Implementierung kritischer Anweisungen
vergleichen (Empfehlung: Perl DBI als Client)
Beispiel:
–
–
–
bisher SELECT myseq.nextval, dann INSERT
Maßnahme: Trigger und INSERT ... RETURNING
Potential: Anzahl eingesparte Roundtrips mal
durchschnittliche Dauer eines Roundtrip (SQL*Net
message from+to client)
Massnahmen auswählen
●
●
●
●
●
Soll-Wert der Antwortzeit vom Kunden erfragen
mögliche Massnahmen abwägen
Verbesserung durch Massnahmen voraussagen
Massnahmen durchführen falls Soll-Wert erreichbar
falls Soll-Wert nicht erreichbar kein Zeitverlust
wegen unzureichender Maßnahmen
Massnahmen durchführen
●
●
●
erneute Messung nach Durchführung
Vergleich: Vorhersage - Messwerte
Ziel erreicht?
–
–
Ja: fertig
Nein: neue Iteration
Zusammenfassung
●
Optimierung mit Antwortzeitprofil ist die beste
Methode
–
–
–
–
–
●
klar strukturiert
vorhersagbare und nachprüfbare Ergebnisse
verhindert unzureichende Optimierungsmaßnahmen
Verfahren ohne Profiler durch Verwendung von TKPROF
und Tabellenkalkulation einsetzbar
setzt ineffektivem Ratio-Tuning ein Ende
Ausblick:
–
–
–
10g greift mit V$SESS_TIME_MODEL und
V$SYS_TIME_MODEL Antwortzeitprofile auf
10g Meßdaten erreichen trotz kostenpflichtigem ASH und
AWR nicht die Präzision und Aussagekraft eines
extended SQL Trace
kommt Oracle mit einem eigenen Profiler oder einem
verbesserten TKPROF?
Buchempfehlungen
Cary Millsap, Jeff Holt
Dan Tow
Shee, Deshpande,
Gopalakrishnan
Herunterladen