Translation

The oldest posts, are written in Italian. If you are interested and you want read the post in English, please use Google Translator. You can find it on the right side. If the translation is wrong, please email me: I'll try to translate for you.

venerdì, gennaio 15, 2016

Definizioni

E' fondamentale, ai fini di proseguire la nostra chiacchierata sulle prestazioni, fornire e/o chiarire alcune definizioni.

  • Performance: il tempo impiegato per eseguire un "compito"
  • Un "compito" è un'unità di lavoro

Esistono due strumenti che misurano le performance

  • "Response Time" (tempo di rispota): la durata di esecuizione di un compito
  • Throughput: il numero delle esecuzioni dei compiti, completati in uno specifico intervallo di tempo


Ma continuiamo con le definizioni


  • Load (carico di lavoro) è la competizione per una risorsa indotta dall'eseczione concorrente di un compito.


Una delle misure del carico di lavoro è l' "utilizzo".

  • Capacity (capacità): è la totalità di un risorsa
  • Utilization (utilizzo): l'uso di una risorsa, rispetto alla sua capacità, in un certo intervallo di tempo
  • Requirements (richiesta): l'esigenza di utlizzo di una risorsa


Matematicamente esprimiamo questa relazione come:

  • U = R / C


All'aumentare dell'uso di una risorsa, aumenta anche il tempo di risposta che l'utente sperimenterà quado usufruisce di quella risorsa


  • Bottleneck (collo di bottiglia) è la limitazione della capacità di una risorsa.
  • Efficienza è la misura inversa dello spreco. Detta in termini leggermente più complessi, possiamo definirla come l'inverso di quella parte di tempo che può essere tolta dall'esecuzione di un compito senza aggiungere capacità e senza sacrificare richieste.


  • Il Responce time consiste di due componeti
- Service time: il tempo impiegato impiegato consumando una certa risorsa
- Queueing time: il tempo impiegato in tattesa di una certa risorsa

ovvero

R = S + Q


  • "Skew" (inclinato) è una lista non uniforme di valori.


Concludo con la "Legge di Amdahl"
L'incremento delle prestazioni è proporzionale alla in cui un programma usa la cosa che stiamo migliorando



Riferimenti
* Thinking Clearly About Performance

giovedì, gennaio 14, 2016

Time Analysis (2 di 2) (ITA)


Time Analysis (2 di 2)

Quando un processo Oracle non counsuma CPU, aspetta (non smetterò mai di stressare su questa cosa. E' un concetto banale, ma spesso sfugge ai più). E noi conosciamo questa attesa come "wait time".

Qualche volta un processo che aspetta, non è a causa di un problema di performance, così noi chiamiamo questo "Idle Wait Time". Tipicamente ne sono affetti i processi di background. Quando invece un utente è in attesa che qualche operazione interna o esterna all'RDBMS si completi, ad esempio un lock o una lettura da disco, allora questa attesa viene chiamata "Non-Idle Wait Time".

Quando indaghiamo sulle prestazioni di un database, ovviamente ci concentriamo sugli eventi di attesa di tipo Non-Idle 

Per conoscere la numerosità e la loro classificazione, possiamo lanciare la seguente select 

(SYS)> col WAIT_CLASS for a20
(SYS)> select wait_class, count(*) from v$event_name group by wait_class;

WAIT_CLASS             COUNT(*)
-------------------- ----------
Concurrency                  38
User I/O                     56
System I/O                   35
Administrative               57
Other                      1186
Scheduler                     9
Configuration                26
Cluster                      64
Application                  17
Queueing                      9
Idle                        121
Network                      28
Commit                        4



Il "DB Time" è una statistica che somma il consumo dei processi di CPU e del Non-Idle wait time. Quando ottimizziamo un sistema tipicamente ci concentriamo per ridurre il tempo. Questo "tempo" è essenzialmente il "DB Time".

Il la statistica "DB Time" la troviamo nelle viste V$[SYS|SES]_TIME_MODEL

Riferimenti

Time Analysis (1 di 2) (ITA)

Time Analysis (2 di 2)

Il tempo è un fattore importante perché le persone percepiscono le "performance" in termini di tempo e throughput. Per questo motivo, se la nostra analisi sulle prestazioni è di tipo quantitativo e basata sul "time model", possiamo sviluppare, almeno in parte, un collegamento tra ciò che l'utente osserva e la nostra analisi sulle performance.

Ma andiamo con ordine.

Quando una sessione lavora, delle due l'una: o consuma CPU oppure aspetta per consumarla. Per questo motivo ci sono due principali componenti che compongono il "database time": il tempo di CPU utilizzato (anche detto "CPU time") ed il tempo di attesa di tipo "non Idle" ("non-idle wait time").

Ho già parlato del tempo di attesa. Per maggiori informazioni leggi i precedenti post "Wait Event: Introduzione".

I dettagli di "CPU time" sono collezionati direttamente dal sistema operativo ed esportati attraverso le viste del dizionario dati V$[SYS|SES]_TIME_MODEL, mentre i "wait time" sono basati su "misure" (in inglese "instrumentetion"). In pratica gli sviluppatori Oracle hanno inserito del codice aggiuntivo per collezionare quanto tempo impiega uno step di "non-CPU".

E' a partire dalla versione 10g che abbiamo a disposizione questo nuovo approccio alle analisi prestazionali. Non che prima non fosse possibile, ma da questa release, Oracle ha messo a disposizione un vero e proprio framework construito direttamente nel kernel dell'RDBMS.

Dalla versione 10g l'approccio all'analisi prestazionale è possibile da due punti di vista: da un lato è basato sul tempo dall'altro sul campionamento. In successivi post vedremo quali differenze ci sono tra i due metodi. Ma soprattutto vedremo come in realtà il limite del secondo (il campionamento) collassa sul primo (il tempo).

Riferimenti

mercoledì, gennaio 13, 2016

bdf: output (ITA/ENG)

*** Prima/Before


Filesystem          kbytes    used   avail %used Mounted on
/dev/vg00/lvol3    1048576  921448  126968   88% /
/dev/vg00/lvol1     511672   58176  402328   13% /stand
/dev/vg00/lvol8    4194304 2762472 1423976   66% /var
/dev/vg00/lvol7    3145728 1854104 1281584   59% /usr
/dev/vg00/lvol14    745472  242984  471103   34% /usr/ecc
/dev/vg00/lvol10    524288  372058  142735   72% /users
/dev/vg46_oracle/lvol_u5
                   10485760 8632784 1838568   82% /u5
/dev/vg46_oracle/lvol_u3
                   6291456 5100904 1181264   81% /u3
/dev/vg46_oracle/lvol_u1
                   16138240 15446500  682275   96% /u1
/dev/vg00/lvol6    1048576   35776 1012800    3% /tmp
/dev/vg00/lvol9    3145728   33631 2925204    1% /sdump
/dev/vg00/lvol11   1048576   97898  891612   10% /perf_data
/dev/vg00/lvol5    4194304 3064512 1121000   73% /opt
/dev/vg00/lvol16   2097152 1048060  983587   52% /nsr.NetWorker.local
/dev/vg00/lvol4    2097152 1028928 1061280   49% /home
/dev/vg00/lvol12    524288  472488   48579   91% /fs_patrol
/dev/vg46_oracle/lvol_dbtuner
                   3129344  279490 2671797    9% /dbtuner
/dev/vg00/lvol13    204800  104707   93918   53% /ctmagent
/dev/vx/dsk/rootdg/stagingvol
                    512000    5898  474541    1% /staging_area
/dev/vx/dsk/dg_cnsdwh/vol_u01
                   6291456 5234274  991110   84% /u01
/dev/vx/dsk/dg_cnsdwh/vol_u2cnsdwh
                   19922944 18940800  966856   95% /u2cnsdwh
/dev/vx/dsk/dg_cnsdwh/vol_arch_cnsdwh
                   1048576   18964  965267    2% /arch_cnsdwh
/dev/vx/dsk/dg_cnsdwh/vol_export_cnsdwh
                   7340032 6327173  949616   87% /export_cnsdwh
/dev/vx/dsk/dg_cnsdwh/vol_app_cnsdwh
                    512000    3104  477095    1% /app_cnsdwh
/dev/vx/dsk/dg_frtdp_fs/u2frtdp
                    409600  203627  193148   51% /u2frtdp
/dev/vx/dsk/dg_frtdp_fs/u2frtdp_exp
                   35651584 16370192 19132576   46% /u2frtdp_exp
/dev/vx/dsk/dg_frtdp_fs/u2frtdp_arch
                   106954752 22431256 83863368   21% /u2frtdp_arch
/dev/vx/dsk/dg_frtdp_fs/frtd
                   41943040 28735816 12978992   69% /frtd
/dev/vx/dsk/dg_frtdp_fs/frtd_save
                   2097152 1350771  699854   66% /frtd_save




*** Dopo/After

Filesystem                                             mbytes    used (mb)   avail (mb)      %used Mounted on
==============================                       ========    =========   ==========   ======== =================
/dev/vg00/lvol3                                          1024      899.719      124.125        88% /
/dev/vg00/lvol1                                        499.68      56.8125      392.898        13% /stand
/dev/vg00/lvol8                                          4096      2698.48      1389.87        66% /var
/dev/vg00/lvol7                                          3072       1810.7       1251.5        59% /usr
/dev/vg00/lvol14                                          728      213.344      482.511        31% /usr/ecc
/dev/vg00/lvol10                                          512      364.597      138.209        73% /users
/dev/vg46_oracle/lvol_u5                             10485760      8632784      1838568        82% /u5
/dev/vg46_oracle/lvol_u3                              6291456      5100904      1181264        81% /u3
/dev/vg46_oracle/lvol_u1                             16138240     15447823       681025        96% /u1
/dev/vg00/lvol6                                          1024      35.0625      988.938         3% /tmp
/dev/vg00/lvol9                                          3072      32.8428      2856.64         1% /sdump
/dev/vg00/lvol11                                         1024      113.595      853.848        12% /perf_data
/dev/vg00/lvol5                                          4096      2992.69      1094.73        73% /opt
/dev/vg00/lvol16                                         2048      1025.58      958.575        52% /nsr.NetWorker.local
/dev/vg00/lvol4                                          2048      1002.22      1038.98        49% /home
/dev/vg00/lvol12                                          512      461.414      47.4404        91% /fs_patrol
/dev/vg46_oracle/lvol_dbtuner                         3129344       279490      2671797         9% /dbtuner
/dev/vg00/lvol13                                          200      102.253      91.7168        53% /ctmagent
/dev/vx/dsk/rootdg/stagingvol                          512000         1310       478842         0% /staging_area
/dev/vx/dsk/dg_cnsdwh/vol_u01                         6291456      5234274       991110        84% /u01
/dev/vx/dsk/dg_cnsdwh/vol_u2cnsdwh                   19922944     18940800       966856        95% /u2cnsdwh
/dev/vx/dsk/dg_cnsdwh/vol_arch_cnsdwh                 1048576        18964       965267         2% /arch_cnsdwh
/dev/vx/dsk/dg_cnsdwh/vol_export_cnsdwh               7340032      6327173       949616        87% /export_cnsdwh
/dev/vx/dsk/dg_cnsdwh/vol_app_cnsdwh                   512000         3104       477095         1% /app_cnsdwh
/dev/vx/dsk/dg_frtdp_fs/u2frtdp                        409600       203627       193148        51% /u2frtdp
/dev/vx/dsk/dg_frtdp_fs/u2frtdp_exp                  35651584     16370192     19132576        46% /u2frtdp_exp
/dev/vx/dsk/dg_frtdp_fs/u2frtdp_arch                106954752     60979408     45616280        57% /u2frtdp_arch
/dev/vx/dsk/dg_frtdp_fs/frtd                         41943040     28517524     13190654        68% /frtd
/dev/vx/dsk/dg_frtdp_fs/frtd_save                     2097152      1350771       699854        66% /frtd_save



*** Codice (può essere messo all'interno del ".profile" dell'utente oracle come funzione e lanciarla in sostituzione del bdf originale)
*** Code (you can put it inside".profile" of oracle user like a function and run it instead of original before command)

bdf |awk ' BEGIN {{printf "%-50s %10s %12s %12s %10s %-20s\n", "Filesystem", "mbytes", "used (mb)", "avail (mb)", "%used", "Mounted on"  }
                          {printf "%-50s %10s %12s %12s %10s %-20s\n", "==============================", "========", "=========", "==========" , "========", "================="  }}
                { if ( ($1 !~ /^[0-9]/) && (NR > 1)  && (length($2)!=0))
                    {printf "%-50s %10s %12s %12s %10s %-20s\n", $1, $2/1024, $3/1024, $4/1024, $5, $6 }
                  else if ( ($1 !~ /^[0-9]/) && (NR > 1) )
                     {printf "%-51s", $1}
                  else if ( NR > 1 )
                    {printf "%10s %12s %12s %10s %-20s\n", $1, $2, $3, $4, $5 }
}'