Logo Oracle Deutschland   DBA Community  -  Februar 2016
Sizing Oracle Database Appliance (ODA)
von Sebastian Solbach ORACLE Deutschland B.V. & Co.KG

Die aktuelle X5-2 Generation der Oracle Database Appliance (ODA) bietet durch die eingesetzte Hardware und Ihre besonderen Eigenschaften, wie die Lizenzierung auf Basis einzelner Kerne, eine ideale Plattform um selbst hochverfügbare Datenbanken schnell und einfach aufzusetzen und zu betreiben. Die genauen Spezifikationen sind dem aktuellen Datenblatt zu entnehmen. Herauszuheben ist neben schnelleren CPUs mit mehr Kernen dabei vor allem die Einführung von verschiedenen Storage Tiers: zwei Flash-Tiers (je 4 SSDs) und ein Festplatten-Tier (16 Disks je Storage Shelf).

Allerdings konzentrieren sich viele Konsolidierungsprojekte beim Sizing der ODA für Datenbanken auf die verfügbaren CPU, die vorhandenen Memory Ressourcen und Storage Kapazität. Letzteres ist insbesondere seit der Verwendung der 8TB Platten im Festplatten-Tier der ODA kaum noch ein Hindernis. Das führt zu den vorschnellen Beschlüssen, einfach Datenbanken auf die ODA zu konsolidieren, ohne dass neben der Datenbankgröße auf das I/O Profil der Datenbanken Wert gelegt wird.

Erschwerend kommt hinzu, dass durch die spezielle Verwendung der Solid State Disks (SSD) in der ODA, die zum einen speziell für Redologs und zum anderen für den Datenbank Flash Cache verwendet werden, I/O Profile von existierenden Datenbanken nicht so einfach mit der ODA verglichen werden können. Wie kann man nun einfach und mit wenig Aufwand einen schnellen Reality Check seiner Datenbanken durchführen, ob und wie gut diese zu einer ODA passen? Oder ob gegebenenfalls ein weiteres Storage Shelf oder gar mehrere ODAs für das Konsolidierungsprojekt verwendet werden sollten?

Grundannahmen

Bei diesem "schnellen" Realitätscheck lassen wir einige technische Verbesserungen bei der Migration auf eine ODA außen vor. So berücksichtigen wir zum Beispiel nicht, dass die CPUs schneller sind. Auch den Effekt, Datenbanken mehr Memory zuweisen zu können, betrachten wir nur am Rande. Dies gilt genauso für den Flash Cache, da dieser letztendlich auch nur eine Memory Erweiterung ist. Datendateien oder ganze Datenbanken in den Flash Bereich der ODA auszulagern ist zwar ebenfalls eine Möglichkeit, betrachten wir aber auch nur am Rande.

Wir gehen im ersten Schritt nun davon aus, einfach die bestehenden Datenbanken auf die ODA zu migrieren, ohne spezielle Optimierungen im Storage Layout vorzunehmen. Ebenfalls nehmen wir bei Konsolidierung mehrerer Datenbanken den sogenannten Worst Case an, d.h. wir gehen davon aus, dass die I/O Spitzen der Datenbank zur selben Zeit auftreten.

Welche Werte sind denn nur für das richtige Sizing auf die ODA wichtig? Und welche Kennzahl bilden die Basis beim Sizing/Konsolidierung auf die ODA?

  • CPU:
    Die ODA verfügt über 72 Kerne (36 pro Knoten). Den Datenbanken stehen dabei dank Hyperthreading 144 Threads zur Verfügung. Hier interessiert natürlich, wie viele CPUs die Datenbanken bisher benötigen, damit nur die passende Anzahl lizenziert muss.

  • Memory:
    Jeder ODA Knoten verfügt über 256 GB Memory, welches per Memory Erweiterung auf 768 Memory erhöht werden kann. Grundsätzlich sollte für die Datenbanken das verfügbare Memory komplett zugewiesen werden. Welchen "positiven" Effekt dies für den I/O hat, kann man allerdings nur grob abschätzen. Hilfreich ist es natürlich wenn die existierenden Datenbanken bereits genügend Memory zugewiesen bekommen haben.

  • IOPs (I/O pro Sekunde):
    Der wohl wichtigste Wert beim Realitätscheck sind die IOPs der 16x 8TB HDDs im Festplatten-Tier. Diese kommen grob auf 1500 IOPs bei der Verwendung eines Storage Shelfs. Falls die Storage Expansion zum Einsatz kommt liegt dieser Wert bei 3000 IOPs. Die Datenbanken sollten in einer ersten Näherung unter diesem Wert bleiben. Die IOPs der SSDs und der Flash Bereich sind ungleich höher und werden deswegen im ersten Schritt nicht in der Kalkulation berücksichtigt.

Basis: AWR Report oder Statspack

Eigentlich sind alle benötigten Werte für das Sizing in einem AWR Report oder - falls man kein Diagnostic Pack besitzt - in einem Statspack Report enthalten. Damit man aussagekräftige Werte erhält, sollte ein Zeitraum von maximal 30 Minuten zur Hochlastzeit betrachtet werden. Möchte man auf Nummer "Sicher" gehen, sollten mehrere AWR Reports von mehreren Tagen zu unterschiedlichen Zeiten ausgewertet werden.

CPU Verbrauch

Den CPU Verbrauch pro Sekunde im Zeitraum des AWRs ist bereits ganz am Anfang unter Report Summary zu finden.



Die DB CPU pro Sekunde liegt in diesem Beispiel bei 7,1. Diesen Wert sollte man auf ganze CPUs aufrunden. D.h. die Datenbankinstanz würde mit einem CPU_COUNT = 8 gut funktionieren. Hatte das "alte" System ebenfalls Hyperthreading aktiviert, so kann dies 1 zu 1 übernommen werden (ungeachtet der schneller CPU Performance wie oben schon erwähnt). Dies entspräche also aktuell einer Datenbank, die mit dem Template ODB-04 erzeugt wurde (
Details zu ODA Datenbank Templates). Verwendete die alte Datenbank kein Hyperthreading sollte der Wert größer sein. Da genügend CPUs vorhanden sind, empfiehlt sich dann das ODB-08 Template.

Memory

Im AWR Report gibt es einen Bereich mit Advisory Statistics. Aus diesen Advisories geht sehr gut hervor, wie viel physikalischer I/O eingespart werden kann, wenn das Memory der Datenbank erhöht wird. Dies ist nicht nur für die generelle Datenbankperformance auf einer ODA wichtig: Ihre jetzige Umgebung kann jetzt schon von einer Anpassung des Memories profitieren. Auf einer ODA ist dies aber ein ganz entscheidender Faktor! Erstens hat man, selbst in der Grundausstattung der ODA, 256 GB an Memory, zweitens kommt durch den Shared Flash Cache auf den SSDs nochmals ein größerer Memory Bereich hinzu. Beides kann dazu dienen die IOPs der Datenbanken zu verringern und damit die Platten zu entlasten.

Besonders wichtig im AWR Report sind dabei zwei Advisors: Das "Buffer Pool Advisory", das heißt die Größe des Datenbank Caches und das "SGA Target Advisory", welche natürlich indirekt auch Auswirkungen auf den Buffer Cache hat. Hier einmal zwei Beispiele, welchen Einfluss dies auf die I/O hat:



Auch wenn hier nur ein Auszug im Screenshot zu sehen ist, in beiden Fällen ist deutlich erkennbar, dass sich die errechneten Physical Reads (Estimated Phys Reads) bei größerem Buffer Cache verringern. Im ersten Falle ist der Faktor bei Verdopplung des DB Caches bei 0,79 während im 2. Fall eine größerer Cache die I/Os auf 17% (0,17) der aktuellen Last verringert.

Ein ähnliches Bild belegt auch der SGA Target Advisor der beiden Datenbank Instanzen, bei denen beides mal bei ca. 50% mehr Memory eine deutliche Verbesserung zu sehen ist.



Dies sollte man auf alle Fälle bei der Memory Verteilung auf der Zielplattform einer ODA mit berücksichtigen, da sich dadurch, wie wir später sehen werden einige I/Os im Vorfeld vermeiden lassen. Leider lassen sich die genaue Auswirkung aber nur ungefähr abschätzen. Hier wäre der Test auf der bestehenden (nicht ODA) Plattform mit mehr Memory definitiv aussagekräftiger.

Platten I/O

Kommen wir nun zum wichtigen Punkt, wie sich der I/O der Datenbank(en) auf die Festplatten der ODA verteilen wird. Dazu sollte man sich keinesfalls auf die I/O Statistiken von anderen Storage Herstellern verlassen, da die IOPS auf dem Storage (meist 512 Bytes) nicht den IOPs der Datenbank (mit Datenbank-Blockgröße) entsprechen und gegebenenfalls RAID Level mit berücksichtien. Auch hier enthält der AWR Report bessere Informationen. Diese finden sich in der Sektion "IO Stats", insbesondere den "IOStat by Function summary" bzw. "IOStat by Filetype summary". Schauen wir uns das I/O by Filetype bei einem Extrembeispiel mal genauer an:



Generell interessiert der I/O, der auf den langsameren HDDs landet. Der I/O auf die Log Files und damit den Redologs ist zwar generell von großer Bedeutung für die Datenbank Performance, für die ODA hat dies aber nur eine geringe Bedeutung, da dieser I/O von den schnellen SSDs in unter 1ms bestätigt wird. Gerade dies macht die ODA für OLTP Applikationen auch so interessant. Für die I/O Betrachtung muss also von den Total I/O einfach nur der Log File I/O abgezogen werden. Allerdings gibt es noch eine "Falle", die man gerne vergisst: Auf der ODA wird die Datensicherheit durch den ASM Spiegel Mechanismus erreicht, entweder mit Normal Redundancy (einfache Spiegelung) oder High Redundancy (doppelte Spiegelung). Dafür schreibt ASM für jeden Block einen Primär- und ein oder 2 Sekundär-Extents. Beim Lesen von ASM wird sowohl auf die Primär- als auch die Sekundär-Extents zugegriffen, womit beim Lesen der I/O aller 16 Platten zur Verfügung steht. Anders sieht es allerdings beim Schreiben aus, da ein "Write" erst dann bestätigt wird, wenn Primär- und Sekundär-Extent(s) geschrieben wurden. Damit muss man die Writes beim I/O Sizing verdoppeln oder verdreifachen, je nachdem, mit welcher Redundanz (Normal/High) die ODA installiert wurde.

Prinzipiell muss man also folgendes berechnen: I/O Read/s + I/O Write/s * Redundanz. Da bei den Read/s und Write/s die Log File Informationen nicht relevant sind, ergibt sich folgende Formel für die I/O pro Sekunde auf den HDDs der ODA:
TOTAL (I/O Read/s - Log File I/O Read/s) + (Total I/O Write/s - Log File I/O Write/s) * Redundanz 

Für das Beispiel von Oben:

(892,35 {TOTAL Read: Reqs per sec}   -   2,15 {Log File Reads: Reqs per sec}) + 
(811,03 {TOTAL Writes: Reqs per sec} - 485,44 {Log File Writes: Reqs per sec}) * Redundanz

= (892,35 - 2,15) + (811,03 - 485,44) * Redundanz

= 890,2 + 325,59 * Redundanz

Normal Redundancy: 890,2 + 325,59 * 2 = 1541,38
High Redundancy:   890,2 + 325,59 * 3 = 1866,97
Rechnet man nun keine Memory Effekte (s.o.) mit ein, so ist aus diesen Zahlen bei diesem Extrembeispiel zu erkennen, dass diese eine Datenbank alleine eine ODA mit einem Storage Shelf komplett auslasten würde, da dieses ca. 1500 IOPs liefert. Da auch Platz für zukünftiges Wachstum vorgehalten werden sollte, ist es empfehlenswert in diesem Fall ein zweites Storage Shelf zu beschaffen, unabhängig davon wie groß die Datenbank ist. Mit 3000 IOPs hat die ODA genügend Reserven auch andere Lastspitzen mit abzudecken.

Bitte berücksichtigen Sie auch, dass im Falle eines RACs beide Instanzen auf dasselbe Storage zugreifen. Ist das Sourcesystem bereits ein RAC sollte der I/O aller Instanzen in die Rechnung mit einfließen. D.h. die 1500 IOPs eines Storage Shelfs müssen für beide ODA Knoten ausreichend sein. Das obige Beispiel stammte von einer Single Instanz und konnte somit für die Lastermittlung im Sizing einzeln berücksichtigt werden.

Interessant wird es nun, wenn man den oben beschriebenen Effekt mit einrechnet, der Datenbank auf der ODA mehr Memory zu geben. Rechnen wir das durch mit dem Faktor 0,79 aus dem obigen Beispiel bei Verdoppelung des DB Caches:
Normal Redundancy: 890,2 * 325,59 * 2 = 1541,38 * 0,79 = 1217,80

High Redundancy:   890,2 * 325,59 * 3 = 1866,97 * 0,79 = 1474,90
Zwar hat ein größerer Cache auch Auswirkung auf die Write Performance, da weniger Blöcke vom Cache auf Platte geschrieben werden müssen, wenn man aber lieber ganz "konservativ" rechnet, sollte der Faktor nur auf die Reads angewendet werden.
Normal Redundancy: 890,2 * 0,79 + 325,59 * 2 = 1354,44

High Redundancy:   890,2 * 0,79 + 325,59 * 3 = 1680,03
In beiden Fällen (egal ob konservativ oder progressiv gerechnet wurde) sollte bei "Normal Redundancy" ein Storage Shelf ausreichend sein. Bei High Redundancy würde ich immer noch zum zweiten Storage Shelf tendieren.

Sollten die 256 GB Memory nicht ausreichen (oder gegebenenfalls auch die Memory Erweiterungen auf 768GB nicht), so hat man noch eine weitere Möglichkeit auf der ODA. Die ODA verwendet für OLTP Datenbanken defaultmäßig den Flash Bereich/das Flash-Tier (die weiteren SSDs) als Memory Erweiterung. Dies kann bei der "Vergrößerung" des Buffer Caches ebenfalls mit eingerechnet werden, wenn auch nur in der "konservativen" Rechenweise, da die SSDs langsamer sind als ein Memory zugriff. Einer Datenbank der odb-6 Kategorie (24 GB SGA) stehen 72 GB Flash für Daten zusätzlich zur Verfügung. Da es sich dabei um einen "Shared Flash Cache" handelt, haben beide RAC Instanzen auf diese 72 GB Zugriff.

Weitere Tuning Maßnahmen

Das Sizing bis zu diesem Punkt ging davon aus, dass keine besonderen Maßnahmen an der Datenbank vorgenommen werden. Sollten bestimmte Faktoren dafür sprechen, dass die IOPs ein Bottleneck darstellen könnten, so gibt es noch einige Ansatzpunkte für Verbesserungen. Sind die Datenbanken relativ klein, könnten diese komplett auf der Flash-Tier (bzw. Flash Diskgruppe) abgelegt werden. Dies wird sogar von dem Verwaltungsbefehl der ODA "oakcli" beim Anlegen einer Datenbank direkt unterstützt. Damit stellen IOPs der Platten keine Beschränkung mehr dar, allerdings sind die Datenbanken auf Flash maximal 700 GB groß. Deshalb ist zu überlegen, ob man nicht lieber einer Memory Erweiterung den Vorzug gibt, da Memory schneller ist als SSDs. Mit mehr Memory lässt sich auch Oracle Database InMemory richtig gut verwenden, denn das InMemory Format ist auf Flash noch nicht möglich.

Eine weitere Optimierung bietet das Verlagern von einzelnen Tablespaces in die Flash-Tier. Lassen sich diese wie TEMP Files oder der UNDO Tablespace leicht im AWR Report identifizieren, so ist das schnell geschehen. Für den Bereich der Performanceoptimierung ist der Ansatz, einzelne Objekte/Tablespaces auf den Flash-Tier der ODA zu legen durchaus ein valider Ansatz. Sollte dies sich aber nicht auf TEMP und UNDO beschränken, so ist Rücksprache mit den Applikationsentwicklern erforderlich um geeignete Objekte zu identifizieren und auch ein Information Life Cycle Management zu integrieren. Dies ist wichtig, um Daten, auf die später nicht mehr so häufig zugegriffen wird, auf den langsameren Festplatten-Tier (HDDs) auszulagern, um die Kapazität des Flash-Tiers optimal einzusetzen. Dafür eignet sich unter anderem die Advanced Data Optimization (ADO) Funktionalität der Oracle 12c Datenbank als Implementierungsmaßnahme.

Fazit

Beim Sizing für die ODA sollte neben CPU, Memory und Plattenplatz besonders auch dem I/O Element Aufmerksamkeit geschenkt werden. Es ist allerdings kein Hexenwerk, diese Informationen aus bestehenden AWR Reports oder Statspack herauszulesen und damit zu einer groben Abschätzung zur Eignung und Auslastung einer ODA zu kommen. Sicher ist dies nur ein erster Näherungswert, da sich verringerte IO Zeiten bei den Redologs, Database Flash Cache, schnellere CPUs und andere Hardwareverbesserungen ebenfalls auf die Belastung des Storages und die Gesamtperformance einer Datenbank-Plattform auswirken. Tools, wie die Consolidation Workbench im neuen Enterprise Manager 13c, liefern hier genauere Werte, da hier auch die AWRs über einen längeren Zeitraum genau ausgewertet werden.

Gewissheit schaffen letztendlich nur ein Performancetesttools wie Real Application Testing, um die reale Performance Ihrer Applikation auf der ODA X5-2 zu ermitteln. Mit Hilfe dieses Tipps sollten Sie aber zumindest einen ersten Eindruck davon bekommen

  • wie viel CPU Sie am Anfang freischalten sollten
  • wie Sie das verfügbare Memory unter den Datenbankinstanzen am besten aufteilen
  • wie viele Storage Shelfs oder ODAs Sie für Ihre Datenbanken benötigen.

Nützliche Links und Referenzen

  • Oracle Database Appliance Datasheet
  • Zurück zur Community-Seite