Performance-Test mit Oracle-Orion

Bei der Wiederherstellung einer Oracle 9i Datenbank auf ein neues System bei einem Kunden wurde ein extremer Performance-Verlust beobachtet.
Auch nach der Wiederherstellung war die Arbeit mit der Datenbank nicht auf dem Geschwindigkeitsniveau, wie sie auf dem Ursprungserver vorhanden war. Dennoch konnte keine merkliche CPU-Auslastung auf dem System festgestellt werden. Aus diesem Grund wurde ein Defekt des NAS-Laufwerk oder einer der abhängigen Komponenten vermutet und ein Performance-Test des Plattensubsystems mit Oracle-Orion eingeleitet.

Oracle Orion ist ideal für die Messung des Datendurchsatzes und der Antwortzeiten von Plattensubsystemen für Oracle-Datenbanken vor Oracle 11g. In Oracle 11g wurde Orion für die Messung in den Ressourcen-Manager von Oracle integriert und kann über den Enterprise-Manager oder über das Packages DBMS_RESOURCE_MANAGER gestartet werden

DBMS_RESOURCE_MANAGER.CALIBRATE_IO (

num_physical_disks      IN  PLS_INTEGER DEFAULT 1,
max_latency             IN  PLS_INTEGER DEFAULT 20,
max_iops                OUT PLS_INTEGER,
max_mbps                OUT PLS_INTEGER,
actual_latency          OUT PLS_INTEGER);

Für Datenbanken vor Oracle 11g wird Orion verwendet, welches bei Oracle hier zum Download bereit steht. Orion ist ein Kommandozeilenwerkzeug und besitzt eine Vielzahl an Parametern zur Steuerung des Performance-Test. Zum Starten von Orion muss im Vorfeld eine Lun-Datei erstellt werden, in der die Datenbankdateien oder RAW-Devices der Datenbank angegeben werden, auf die die Analyse durchgeführt wird.
In diesem speziellen Fall wurde die Datenbankdatei ERP_INDEX_01.DATA und eine LUN-Datei mit dem Namen performancetest.lun für den Test verwendet.

Inhalt LUN-Datei performancetest.lun

H:\ERP\ERP_INDEX_01.DATA

Starten von Orion

c:\WorkFolder\Orion>orion -run simple -testname performancetest -num_disks 1
ORION: ORacle IO Numbers -- Version 10.2.0.1.0
Test will take approximately 9 minutes
Larger caches may take longer

c:\WorkFolder\Orion>

Nach dem Test werden mehrere Textdateien in den Orion-Ordner geschrieben, wobei im ersten Schritt hauptsächlich die Datei perfomance_summary.txt von Interesse ist. Im konkreten Fall konnte ersehen werden, dass das Plattensubsystem einen Datendurchsatz von 9,76MB/s besaß, also quasi das Niveau eines USB-Sticks.


ORION VERSION 10.2.0.1.0

Commandline:
-run simple -testname performancetest -num_disks 1

This maps to this test:
Test: performancetest
Small IO size: 8 KB
Large IO size: 1024 KB
IO Types: Small Random IOs, Large Random IOs
Simulated Array Type: CONCAT
Write: 0%
Cache Size: Not Entered
Duration for each Data Point: 60 seconds
Small Columns:,      0
Large Columns:,      0,      1,      2
Total Data Points: 8

Name: H:\ERP\ERP_INDEX_01.DATA Size: 524292096
1 FILEs found.

Maximum Large MBPS=9.76 @ Small=0 and Large=2
Maximum Small IOPS=514 @ Small=5 and Large=0
Minimum Small Latency=9.71 @ Small=5 and Large=0

Zum Vergleich wurde dieser Test wiederholt, indem einfach ein Netzlaufwerk von diesem Server auf einen anderen beliebigen Rechner erstellt, die Datenbankdatei dorthin kopiert und die LUN-Datei angepasst wurde. Das Ergebnis fiel eindeutig aus, denn nun wurde ein Datendurchsatz von 85MB/s gemessen, welches ungefähr dem eines Gigabit-Netzwerk entspricht.


ORION VERSION 10.2.0.1.0

Commandline:
-run simple -testname performancetest -num_disks 1

This maps to this test:
Test: performancetest
Small IO size: 8 KB
Large IO size: 1024 KB
IO Types: Small Random IOs, Large Random IOs
Simulated Array Type: CONCAT
Write: 0%
Cache Size: Not Entered
Duration for each Data Point: 60 seconds
Small Columns:,      0
Large Columns:,      0,      1,      2
Total Data Points: 8

Name: Z:\oratest\ERP_INDEX_01.DATA Size: 524292096
1 FILEs found.

Maximum Large MBPS=85.08 @ Small=0 and Large=2
Maximum Small IOPS=4430 @ Small=5 and Large=0
Minimum Small Latency=0.74 @ Small=1 and Large=0
 

Nach weiterer Analyse wurde die Ursache in einem Defekt des Switchports lokalisiert. Nach Verwendung eines anderen Ports für das NAS-Laufwerk lief der Server sowie die Datenbank wieder in gewohnter Geschwindigkeit.


c:\WorkFolder\Orion>orion -help

ORION: ORacle IO Numbers -- Version 10.2.0.1.0
ORION runs IO performance tests that model Oracle RDBMS IO workloads.
It measures the performance of small (2-32K) IOs and large (128K+) IOs
at various load levels.  Each Orion data point is done at a specific
mix of small and large IO loads sustained for a duration.  Anywhere
from a single data point to a two-dimensional array of data points can
be tested by setting the right options.

An Orion test consists of data points at various small and large IO
load levels.  These points can be represented as a two-dimensional
matrix: Each column in the matrix represents a fixed small IO load.
Each row represents a fixed large IO load.  The first row is with no
large IO load and the first column is with no small IO load.  An Orion
test can be a single point, a row, a column or the whole matrix.

Parameters 'run', 'testname', and 'num_disks' are mandatory. Defaults
are indicated for all other parameters.  For additional information on
the user interface, see the Orion User Guide.

.lun should contain a carriage-return-separated list of LUNs
The output files for a test run are prefixed by _.

The output files are:
_summary.txt - Summary of the input parameters along with min. small
latency, max large MBPS and/or max. small IOPS.
_mbps.csv - Performance results of large IOs in MBPS
_iops.csv - Performance results of small IOs in IOPS
_lat.csv - Latency of small IOs
_tradeoff.csv - Shows large MBPS / small IOPS combinations that can
be achieved at certain small latencies
_trace.txt - Extended, unprocessed output

WARNING: IF YOU ARE PERFORMING WRITE TESTS, BE PREPARED TO LOSE ANY DATA STORED
ON THE LUNS.

Mandatory parameters:
run                     Type of workload to run (simple, normal, advanced)
simple - tests random 8K small IOs at various loads,
then random 1M large IOs at various loads.
normal - tests combinations of random 8K small
IOs and random 1M large IOs
advanced - run the workload specified by the user
using optional parameters
testname                Name of the test run
num_disks               Number of disks (physical spindles)

Optional parameters:
size_small              Size of small IOs (in KB) - default 8
size_large              Size of large IOs (in KB) - default 1024

type                    Type of large IOs (rand, seq) - default rand
rand - Random large IOs
seq -  Sequential streams of large IOs
num_streamIO            Number of concurrent IOs per stream (only if type is
seq) - default 4
simulate                Orion tests on a virtual volume formed by combining the
provided volumes in one of these ways (default concat):
concat - A serial concatenation of the volumes
raid0 - A RAID-0 mapping across the volumes

write                   Percentage of writes (SEE WARNING ABOVE) - default 0

cache_size              Size *IN MEGABYTES* of the array's cache.
Unless this option is set to 0, Orion does a number
of (unmeasured) random IO before each large sequential
data point.  This is done in order to fill up the array
cache with random data.  This way, the blocks from one
data point do not result in cache hits for the next
data point.  Read tests are preceded with junk reads
and write tests are preceded with junk writes.  If
specified, this 'cache warming' is done until
cache_size worth of IO has been read or written.
Default behavior: fill up cache for 2 minutes before
each data point.

duration                Duration of each data point (in seconds) - default 60

num_small               Number of outstanding small IOs (only if matrix is
point, col, or max) - no default
num_large               For random, number of outstanding large IOs.
For sequential, number of streams (only if matrix is
point, row, or max) - no default

matrix                  An Orion test consists of data points at various small
and large IO load levels.  These points can be
represented as a two-dimensional matrix: Each column
in the matrix represents a fixed small IO load.  Each
row represents a fixed large IO load.  The first row
is with no large IO load and the first column is with
no small IO load.  An Orion test can be a single point,
a row, a column or the whole matrix, depending on the
matrix option setting below (default basic):
basic - test the first row and the first column
detailed - test the entire matrix
point - test at load level num_small, num_large
col - varying large IO load with num_small small IOs
row - varying small IO load with num_large large IOs
max - test varying loads up to num_small, num_large

verbose                 Prints tracing information to standard output if set.
Default -- not set

Examples
For a preliminary set of data
-run simple -testname -num_disks
For a basic set of data
-run normal -testname -num_disks
To generate combinations of 32KB and 1MB reads to random locations:
-run advanced -testname -num_disks
-size_small 32 -size_large 1024 -type rand      -matrix detailed
To generate multiple sequential 1MB write streams, simulating 1MB RAID0 stripes
-run advanced -testname -num_disks
-simulate RAID0 -stripe 1024 -write 100 -type seq
-matrix col -num_small 0