Tenebrias

~ Ein Spiegel für den Winter meiner Seele ~

Detektivarbeit mit Statspack

Verfasst von Tenebrias am 14.02.2008 - 17:12

Edit: Narv. Morgen mal gucken, wie man diese überbreiten Sachen ohne Informationsverlust in das Blog bekommt. Hier fehlt ja die Hälfte. -.-

Seit zwei Tagen rattert eine unsere Datenbanken wie irre, macht die CPU ihrer Zone vollständig dicht. Bis jetzt scheint zwar alles glatt zu laufen, denn vom Kunden kam noch keinerlei Beschwerde über Wartezeiten, aber ich schaue mir das dennoch mal an. Im GridControl sehe ich faktisch: Nichts.

CPU

Mhm. Die Sessions sehen allesamt völlig normal aus, aber dennoch drehen wir mit der CPU an der Obergrenze. Also werde ich mal einen Blick in den Statspack-Report werfen.

Und der kommt nicht zurück. Mhm. Da muss doch etwas blockieren. Ok…

SQL> select sid, event, wait_time, seconds_in_wait, state from v$session_wait where sid = 88;
       SID EVENT                           WAIT_TIME SECONDS_IN_WAIT STATE  
---------- ------------------------------ ---------- --------------- --------------------------------------------------------- 
         88 db file scattered read                  0               0 WAITING
1 row selected.

Hum. Ein paarmal hintereinander zeigt mir: Der tut schon. Keine anderen Waits als db_file_scattered_read, der mir sagt: Da rutscht er mit Full-Table-Scans auf Tabellen rum.

Also eher IO als CPU. Aber warum wird der einfach nicht fertig?

Warten .. und dann ist der Lauf endlich fertig. Schauen wir mal

Load Profile
~~~~~~~~~~~~                            Per Second       Per Transaction
                                   ---------------       ---------------
                  Redo size:             43,273.30              5,539.68
              Logical reads:             15,801.36              2,022.83
              Block changes:                310.33                 39.73
             Physical reads:                 14.00                  1.79
            Physical writes:                  9.94                  1.27
                 User calls:              1,331.36                170.43
                     Parses:                526.48                 67.40
                Hard parses:                 97.84                 12.53
                      Sorts:                146.20                 18.72
                     Logons:                  0.14                  0.02
                   Executes:              1,871.40                239.57
               Transactions:                  7.81

Wir haben also 1871 Statements, die pro Sekunde ausgeführt werden, 526 Parses und 97 Hardparses. Das sieht schonmal nicht gut aus, aber letztlich sind das immer Werte zum Vergleichen. Eine Woche zurückgeschaut finde ich: 1918 Statements, 542 Parses und 95 Hardparses.

Faktischer Unterschied also Null.

Gucken wir also mal weiter.

  Instance Efficiency Percentages (Target 100%)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            Buffer Nowait %:  100.00       Redo NoWait %:    100.00
            Buffer  Hit   %:   99.91    In-memory Sort %:    100.00
            Library Hit   %:   95.03        Soft Parse %:     81.42
         Execute to Parse %:   71.87         Latch Hit %:     99.92
Parse CPU to Parse Elapsd %:   26.50     % Non-Parse CPU:     73.06

Sieht soweit gut aus und unterscheidet sich nur an einem Punkt wesentlich zur Woche vorher: Parse CPU to Parse Elapsd war da bei 54%. Das lasse ich für den Moment aber mal zur Seite und schaue weiter.

Top 5 Timed Events
~~~~~~~~~~~~~~~~~~                                                     % Total
Event                                               Waits    Time (s) Ela Time
-------------------------------------------- ------------ ----------- --------
log file sync                                     524,599      77,394    32.91
CPU time                                                       39,471    16.78
enqueue                                            89,730      39,021    16.59
log file parallel write                         1,168,951      20,537     8.73
latch free                                      1,826,071      19,317     8.21
          -------------------------------------------------------------

Das sieht doch schonmal Scheisse aus. 32% Waits auf log_file_sync – normalerweise sollte das auf einen zu großen log_buffer hindeuten, wäre er zu klein würden wir log_buffer_space-Waits bekommen. Mal schauen

 SQL> show parameter log_buffer

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
log_buffer                           integer                           2097152
SQL>

2 MB kann man nicht als Welt bezeichnen, allerdings hatten wir den erst am 31.01.2008 von 500K hochgedreht. Das war möglicherweise ein Stück zu viel.

Ich behalte das mal im Kopf und schaue weiter.

Die Wait-Events sehen entsprechend auch richtig schlecht aus. Die Waits für log_file_sync waren vor einer Woche bei 17, für db_file_parallel_write immerhin bei 97 und die buffer_busy_waits bei 19.

                                                                    Avg
                                                     Total Wait   wait    Waits
Event                               Waits   Timeouts   Time (s)   (ms)     /txn
---------------------------- ------------ ---------- ---------- ------ --------
log file sync                     524,599     40,688     77,394    148      0.8
enqueue                            89,730      7,729     39,021    435      0.1
log file parallel write         1,168,951          0     20,537     18      1.7
latch free                      1,826,071     59,743     19,317     11      2.7
buffer busy waits                  40,075     11,103     16,423    410      0.1
db file sequential read           334,602          0      9,963     30      0.5
db file parallel write             26,831          0      7,271    271      0.0

Na schön. Mal noch gucken, was die Platten generell so machen

------------------------------
                 Av      Av     Av                    Av        Buffer Av Buf
         Reads Reads/s Rd(ms) Blks/Rd       Writes Writes/s      Waits Wt(ms)
-------------- ------- ------ ------- ------------ -------- ---------- ------
LAM_INDEX
       306,564       4   30.6     1.4      533,907        6     19,935  180.5
UNDOTBS1
            89       0   23.7     1.0      217,187        3     18,923  674.7
QIP_INDEX
        14,995       0   30.1     1.5       46,062        1         49  920.2
LAM_DATA
        28,523       0   14.0    20.6       22,017        0      1,097  339.0
QIP_DATA
         2,632       0   26.3     8.3       23,207        0         60  601.7
PERFSTAT
         8,514       0   43.3    16.4        3,287        0          0    0.0
SYSTEM
         2,666       0   29.9     2.2          633        0         12  848.3

UGH?

Mal ganz davon abgesehen, dass die Zugriffsgeschwindigkeit beim lesen vor einer Woche nahezu doppelt so hoch war, sind die Avg Bufferwaits ja wohl die Hölle. 920 ms?

Vor einer Woche waren wir bei 39, was auch nicht toll, aber noch im Rahmen ist.

Was mach ich damit nun?

Spontan würde ich mit einem kleineren log_buffer und mehr buffercache ansetzen, auch wenn die HitRatio von 99,91 mehr als optimal ist.

Morgen muss ich das noch ein wenig genauer anschauen.

Eine Antwort schreiben

XHTML: Du kannst diese Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>