Das Performance-Handbuch: System und Umgebung
Nun wollen wir uns dem ersten Teil - der Optimierung von System und Umgebung widmen. Die Aussagen werden dabei auch andere Teile dieses Dokuments streifen. Damit Sie sich nicht unnötig durch das Dokument suchen müssen, wird jeder Punkt jedoch so ausführlich wie hier notwendig betrachtet.
Vor- und Nachteile
BearbeitenDer wesentliche Vorteil einer Optimierung von System und Umgebung liegt in der Tatsache begründet, dass die Optimierung keine oder nur geringe Auswirkung auf die Implementierung und das Design Ihrer Anwendung hat. Leider ist dies nicht ganz so optimal, wie es erst einmal den Anschein hat. Eine andere Datenbank kann schon erhebliche Auswirkungen auf die Implementierung haben. Selbst ein Wechsel des Datenbanktreibertyps kann uns nicht zwingend davor schützen.
Der große Nachteil der folgenden Optimierungen besteht in der Tatsache, dass die Optimierungen spezifisch für das jeweilige System vorgenommen werden müssen. Haben Sie nur 1 GB Arbeitsspeicher können / sollten Sie den Umgebungsspeicher für Ihre Anwendung nicht auf 2 GB setzen. Für Ihre privaten Tools lassen sich jedoch hier kaum Einschränkungen machen, sofern diese nur auf Ihrem Rechner laufen.
Thread-Umsetzung
BearbeitenWenn Sie ein Mehrprozessorsystem Ihr Eigen nennen, müssen Sie noch einen weiteren wichtigen Punkt beachten: die Umsetzung der Threads in das Betriebssystem. Die Nutzung von Threads allein kann schon zur "subjektiven" Performancesteigerung führen. Sofern Sie ein System mit mehreren Prozessoren haben, ist die Umsetzung dieser Threads auf das Betriebssystem wichtig. Unterschieden werden dabei drei Typen.
Der Typ „Many to One“ bedeutet, dass alle Threads in einem einzigen Betriebssystem Thread umgesetzt werden. Dies bedeutet auch, dass Sie nur einen Ihrer Prozessoren nutzen können und sollte daher bei Mehrprozessorsystemen keine Verwendung finden.
Der zweite Typ „One to One“ legt für jeden Thread zwingend einen Betriebssystem Thread an. Obwohl dies auf den ersten Blick vorteilhaft scheint, müssen Sie beachten, dass das Erzeugen eines Threads kein performanter und schneller Vorgang ist. Viele kleine Threads können hier Ihre Anwendung letztlich mehr behindern als beschleunigen. Evtl. ist dies jedoch für die Implementierung als Vorgabe zu beachten, da der Programmierer nun wissen kann, dass weniger hier mehr ist.
Der dritte Typ „Many to Many“ ermöglicht schließlich, dass Ihre Laufzeitumgebung entscheidet, ob für einen Thread auch ein Betriebssystem Thread angelegt werden soll. Dieser Typ ist generell für Mehrprozessorsysteme zu empfehlen.
Hardware
BearbeitenDie Optimierung der Hardware ist ein probates Mittel, um die Performance zu erhöhen, da außer finanziellem Einsatz keine Anpassungen, insbesondere der Anwendung, notwendig sind - vorausgesetzt Sie und / oder Ihr Kunde hat diese finanzielle Ressourcen. Für interne Projekte ist dies eine der besten Optimierungsmöglichkeiten.
Festplatten
BearbeitenAuch bei den Datenträgern heißt es, je schneller desto besser. Aber wer weiß schon, was die einzelnen Modi der Festplatten bedeuten?
Bei den IDE-Festplatten ist inzwischen schon eine erhebliche Anzahl verschiedener Modi aufgetaucht. Vor der Einführung des PCI-Busses arbeiteten IDE-Festplatten immer im sogenannten „programmed input output mode“ [PIO]. Sofern Sie die Festplatten über einen Controller am PCI-Bus betreiben, können Sie jedoch den Direct Memory Access [DMA]– Zugriff nutzen, der eine höhere Datenrate ermöglicht. Außerdem gibt es noch den Ultra DMA Modus [UDMA, UDMA66, UltraDMA-66, UltraDMA 4, UltraDMA Mode 4, ...], der eine weitere Steigerung des Datendurchsatzes verspricht. Die Einstellung zur Nutzung der höheren Datendurchsätze finden Sie im BIOS Ihrer Hauptplatine. Auch die Anschlussmöglichkeiten von externen Datenträgern sind ggf. zu berücksichtigen.
Die folgende Tabelle zeigt dabei den Zusammenhang zwischen Modus und maximalem Datentransfer.
Modus | Datentransfer in MB/s |
---|---|
PIO 0 | 3,3 |
PIO 1 | 5,2 |
PIO 2 | 8,3 |
PIO 3 | 11,1 |
PIO 4 | 16,7 |
Ultra DMA 0 | 16,6 |
Ultra DMA 1 | 25,0 |
Single-Word DMA Mode 0 | 2,1 |
Single Word DMA Mode 1 | 4,2 |
Single-Word DMA Mode 2 | 8,33 |
Multi Word DMA Mode 0 | 4,2 |
Multi Word DMA Mode 1 | 13,3 |
Multi-Word DMA Mode 2 | 16,7 |
Ultra DMA 2 | 33,3 |
Ultra DMA 3 | 45,0 |
Ultra DMA 4 | 66,6 |
Ultra DMA 5 | 100,0 |
Ultra DMA 6 | 133,3 |
Firewire IEEE 1394a | max. 50,0 |
Firewire IEEE 1394b | 100,0 |
Firewire IEEE 1394-2008 | 381,5 |
USB 1.0 | 12,0 |
USB 1.1 | 12,0 |
USB 2.0 | 57,2 |
USB 3.0 | 596,0 |
SAN | abhängig vom Netzwerkdurchsatz |
Ab dem UltraDMA Mode 3 benötigen Sie jedoch spezielle Kabel, um die Geschwindigkeit zu erreichen. Außerdem sollten Sie die Längenbegrenzung je nach dem verwendeten Modus beachten, um Störungen zu vermeiden.
Prozessoren
BearbeitenJe schneller desto besser gilt hier natürlich immer. Im Hinblick auf die Threadumsetzung ist zudem auch die Anzahl der Kerne und Prozessoren entscheidend.
Grafikausgabe
BearbeitenEin bisschen Hintergrundwissen noch zur grafischen Ausgabe. Natürlich ist Grafikausgabe nicht direkt unabhängig vom Betriebssystem. Mit einer guten DirectX- und OpenGL-Grafikkarte kann man Benutzeroberflächen jedoch gut beschleunigen.
Gleitpunktdarstellung
BearbeitenSofern Ihre Hardware die direkte Unterstützung von Gleitkommadatentypen gem. IEEE 754 bietet, kann dies insbesondere bei umfangreichen Rechenoperationen ein Geschwindigkeitsvorteil sein.
Dateisystem
BearbeitenDas richtige Dateisystem kann eine Menge Speicherplatz auf der Festplatte sparen. So nimmt eine 1 Byte große Datei unter einem FAT 32 Dateisystem bei einer 8 GB Festplatte lockere 8 Kilobyte ein - ein Speicherverschwendung von etwa 8.195%. Nun werden Sie kaum einige hundert oder tausend Dateien mit 1 Byte Länge haben. Wenn Sie jedoch eine Datei von 8.197 Bytes haben, ist der Effekt ähnlich. Hier können Sie z.B. mit gepackten Dateien Festplattenplatz sparen. Die Wahl der richtigen Partitionsgrößen und des richtigen Dateisystems kann hier ebenso helfen.
Wer weiter Platz sparen will oder muss, kann auf einigen aktuellen Betriebssystemen auch eine On-the-fly Komprimierung nutzen, auch wenn dies zu Lasten der Zugriffsgeschwindigkeit geht.
Journaling Dateisysteme
BearbeitenJournaling Dateisysteme ermöglichen eine höhere Sicherheit in Bezug auf die Datenkonsistenz. Typische Vertreter sind z.B. ReiserFS oder auch Ext3. Hierzu werden die Daten sowie "Wiederherstellungsdaten" gesichert. Dies führt zu einem nicht unerheblichen Overhead, der die Performance deutlich reduzieren kann.
Generell sollten insbesondere temporäre Dateien nicht auf einem Journaling Dateisystem abgelegt werden.
Native Übersetzung
BearbeitenNative Compiler übersetzen den Quelltext von interpretierten Sprachen oder Sprachen mit Zwischencode wie Java und .net direkt in Maschinencode. Hierzu gehört auch das sog. Postcompiling, wobei der Zwischencode und nicht der Quelltext in Maschinencode übersetzt wird.
Dieses Verfahren eignet sich eher für Serveranwendungen, da eine plattformabhängige Anwendung erstellt wird, welche nur ggf. für bestimmte Server in den grds. schnelleren Maschinencode übersetzt werden kann. Der Vorteil der nativen Übersetzung liegt u.a. in der Geschwindigkeit. Native Anwendungen sind (sollten) schneller als Bytecode Interpreter und JIT Compiler. Der Start einer nativen Anwendung erfolgt immer schneller als der Start über eine JVM. Hier entfällt bereits das Übersetzten des Bytecodes in Maschinencode. Native Compiler können sich mit der Übersetzung beliebig viel Zeit lassen, da diese nur einmal anfällt. Dadurch ist es möglich, besonders schnellen Maschinencode zu erstellen.
Es gibt jedoch auch Nachteile. Der Maschinencode ist jeweils Betriebssystemabhängig und damit geht eine der wichtigsten Eigenschaften von interpretierten und Zwischencode-Sprachen, die Plattformunabhängigkeit, verloren. Außerdem ist das nachträgliche Einbinden von Klassen nicht mehr möglich. Hier gilt das Prinzip alles oder nichts. Dieses alles oder nichts sorgt auch vielfach für deutlich größere Programme.
Als meist bessere Wahl steht der HotSpot Compiler bereit, der nativen Compiler noch mit der Möglichkeit des Ändern des Maschinencode zur Laufzeit etwas entgegen setzen kann. Hier sind native Compiler klar unterlegen. Der Maschinencode wird immer aufgrund der jetzigen und wahrscheinlichen Systemkonfiguration zu Laufzeit übersetzt und kann Änderungen während der Laufzeit somit nicht berücksichtigen.
Speicher
BearbeitenDie wahrscheinlich einfachste Möglichkeit, eine Geschwindigkeitssteigerung zu erreichen, ist die Erhöhung des Speichers. Natürlich leidet die Performance in Bezug auf Speicherverbrauch darunter, aber dies ist meist nur bei Servern ein Problem. Bei vielen Programmiersprachen müssen Sie diesen Speicher dann jedoch auch noch für die eigentliche Laufzeitumgebung.
Grundsätzlich sollten Sie sich bei allen Programmiersprachen stets auch Gedanken um die Speicherbereinigung und das Aufräumen machen. Selbst Laufzeitumgebungen wie .net und Java erfordern dies - zwei Beispiel hier nur: Vergessen Sie nicht Verbindungen zur Datenbank auch abzubauen und denken Sie daran, dass Objekte so lange existieren wie auch nur eine einzige Referenz auf diese bekannt ist.
Speicher bedeutet hier nicht nur Hauptspeicher an sich, sondern kann auch Grafikspeicher oder den Prozessorcache beinhalten.
Obfuscator
BearbeitenDie eigentliche Aufgabe von Obfuscator Tools ist es, den Code vor unberechtigtem Einsehen und Dekompilierung zu schützen. Als nützlicher Nebeneffekt kann der erstellte Programmcode meist noch wesentlich verkleinert werden. Realisiert wird dieses, indem Methoden und Variablennamen durch kurze Zeichenketten ersetzt werden. So kann aus einem „gibAlter(Person p)
“ schnell ein „d(P a)
“ werden. Dabei erkennen diese Tools, ob es sich um eine externe Klasse oder um eine mit zu optimierende Klasse handelt.
Einige Obfuscatoren nehmen außerdem noch Codeänderungen zur Optimierung der Ausführungsgeschwindigkeit vor. Obfuscators eignen sich jedoch nur, wenn Sie ein fertiges Produkt ausliefern. Wollen Sie eine Klassenbibliothek anbieten, werden Sie mit Klassennamen wie A und B wohl keinen Erfolg haben.
Außerdem sollten Sie auch darauf achten, dass ein guter Obfuscator (optional) auch Code einbaut, um einen Angriff von außen - also decompilieren - zu erschweren. Dieser Code geht wieder zu Lasten der Programmgröße und Ausführungsgeschwindigkeit.
Profiler
BearbeitenDamit Sie eine Anwendung performanter gestalten können, ist es nötig zu wissen, wo sich der Flaschenhals befindet. Profiler sind Anwendungen, die es Ihnen erlauben, diese Stellen in Ihrer Anwendung zu finden.
Tipp: Sun Microsystems hat auch hier dem Entwickler von Java bereits an Werkzeug an die Hand gegeben.
Profilertools helfen jedoch nur, wenn Sie in der Lage sind, das Design bzw. den Quelltext zu ändern; zur Vollständigkeit sind diese jedoch hier mit aufgeführt.
Externe Daten
BearbeitenDer Zugriff auf Externe Daten kann durch die Datenablage optimiert werden. Im Bereich Hardware (Festplatten) haben wir bereits über die Systemumgebung gesprochen.
Grafiken
BearbeitenGrafiken werden in den verschiedensten Varianten verwendet, u.a. als Teil der BNO oder auch in Spielen. Es gibt zwei wesentliche Arten von Grafiken. Bitmapgrafik ist eine Darstellungsform, wobei hier für jeden darzustellenden Punkt die Informationen, wie Farbe, gesichert werden. Die andere Grafikart ist die Vektorgrafik. Diese kennt End- und Anfangspunkte bzw. Formeln, nach denen die Erstellung der Grafik geschieht sowie Farben oder auch Farbverläufe. Bitmapgrafiken werden hauptsächlich für die Verwaltung von Fotos verwendet. Vectorgrafiken haben den Vorteil, dass sie wesentlich genauer und beliebig vergrößerbar sind. Schriftarten sind z.B. meist eine Art Vektorgrafik. Außerdem ist nochmals zu unterscheiden zwischen statischen Grafiken und nicht statischen Grafiken, den Animationen.
Die richtige Wahl des Grafiktyps ist dabei schon eine erste Möglichkeit, den Speicherbedarf und somit ggf. auch die Netzwerklast zu minimieren.
Einige Eigenheiten sollten Ihnen bekannt sein. GIF-Grafiken können maximal 256 Farben (8 Bit) darstellen. Für (hochauflösende) Fotos sind sie daher ungeeignet. Allerdings können GIF-Grafiken einen transparenten Hintergrund haben und auch Animationen enthalten. JPEG-Grafiken können 24-Bit-(True-Color-)Bilder verwalten. Die Wahl des richtigen Datenformats kann hier die Größe dieser Dateien verringern. Prüfen Sie auch, ob Sie wirklich animierte GIF-Grafiken verwenden wollen. Sollten Sie hier Änderungen vornehmen, können Sie den Speicherverbrauch Ihrer Anwendung zu Laufzeit und auch die Netzwerklast stark vermindern. Besonders das PNG-Format ist zu empfehlen. Es verbindet die Vorteile von GIF (z.B. Transparenz) und JPEG (photogeeignet) und unterliegt dabei wie JPEG keinen einschränkenden Rechten.
Gerade für Icons und Infobildern bietet es sich an, das Datenformat Ihrer Grafiken zu prüfen. Hier können Sie noch einige Bytes herausholen. Stellen Sie sich auch die Frage, ob Sie wirklich animierte GIF-Grafiken benötigen, da sich hier ein besonders großer Performance-Gewinn erreichen lässt.
Eine weitere Möglichkeit ist, die Anzahl der benötigten Grafiken zu verringern. Gerade im Bereich der Spieleprogrammierung wird dies seit langem mit dem Einsatz von Tilesets realisiert.
Datenbanken
BearbeitenDer Bereich Datenbanken ist ein wichtiger Punkt, um die Performance Ihrer Anwendung entscheidend zu beeinflussen. Hierbei müssen wir zusätzlich noch zwischen Datenbank und Datenbanktreiber unterscheiden, wobei wir letzteres zuerst betrachten wollen.
Wichtig ist hierbei der Zugriff auf die Datenbank - der Datenbanktreiber. Unter Windows steht für nahezu jede Datenbank ein ODBC-Treiber zur Verfügung. Prüfen Sie jedoch stets, ob es keinen direkt ansprechbaren Treiber für Ihre Datenbank gibt, da ein ODBC-Zugriff zahlreiche Optimierungen benötigt.
Ein weiterer wichtiger Punkt ist, wie Sie die Datenbank abfragen. So haben viele Datenbanken die Möglichkeit, optimierte Abfragen erstellen zu können, den Ausführungsplan einer Abfrage darzustellen oder auch die Abfragen in der Datenbank zu halten (Storage Procedures).
Netzwerk
BearbeitenErhöhung der Bandbreite Ihres Netzwerkes ist dabei nur ein Weg, die Performance Ihres Netzwerkes zu erhöhen. Auch der gezielter Einsatz von Brücken bzw. besser noch Switches kann helfen.
Das LAN
BearbeitenLokale Netzwerke kann man als Netzwerke bezeichnen, die nicht über ein privates Grundstück hinausreichen und einen Durchmesser von nicht mehr als einigen Kilometern, eine Datenübertragungsrate von mind. einigen Mbps und einen einzelnen Eigentümer haben. Der wesentliche Vorteil (neben den Multi-Player-Spielen) ist vor allem die gemeinsame Nutzung von Ressourcen im Netzwerk sowie die Kommunikation untereinander. Dies ermöglicht auch Kosteneinsparungen (z.B. Einsatz eines SAN). So kann die Anschaffung eines Zweitdruckers schon kostspieliger sein, als die komplette Netzwerkausstattung für zwei Rechner.
Komponenten
BearbeitenDie einzelnen Komponenten kann man nach verschiedenen Kriterien unterteilen. Dies kann z.B. wie folgt aussehen.
Passive Komponenten
- EDV-Schränke
- Kabel
- Datendosen
Aktive Komponenten
- Repeater bzw. Verstärker
- HUB bzw. Switch
- Brücken
- Router
- Gateway
- Server
- Dateiserver
- Anwendungsserver
- Datenbank- bzw. SQL-Server
- Druckerserver
- Arbeitsstationen
LAN Leistungsmerkmale
BearbeitenUm die Leistung eines Netzwerkes zu beurteilen, sind die Bandbreite, die Zuverlässigkeit, das Verhalten bei Belastung, die Erweiterbarkeit, die Offenheit und die Anschlusstechnik ausschlaggebend.
Datenkabel Leistungsmerkmale
BearbeitenIn LANs kommen standardisierte Kupfer- oder Glasfaserkabel zum Einsatz, welche sich in Übertragungsrate, Material, Dicke, Gewicht, Abschirmung und natürlich auch Preis unterscheiden. Die Eigenschaften des Kabels sind dabei schon von außen erkennbar. Eine typische Aufschrift für ein solches Kupfer-Datenkabel könnte lauten:
BONEAGLE FTP CAT.5 100MHZ 26AWGx4P TYPE CM (UL) C (UL) CMG E164469 – ISO/IEC & EN 50173 3P VERIFIED
oder auch
TYPE CM 24AWG 75°C (UL) E188630 CSA LL81295 CMG ETL VERIFIED EIA/TIA-568A UTP CAT.5 EVERNEW G1J507
Was sich dabei so kryptisch liest, hat Ihnen einige wichtige Aussagen mitzuteilen, unter anderem über die Abschirmung der Kabel und deren Übertragungsrate.
UTP, unshielded twisted pair, sind Kabel, welche ohne Schirm um die paarweisen Kabelstränge noch um das Gesamtkabel auskommen. S/UTP, screened unshielded twisted pair, sind Kabel mit einer Gesamtabschirmung. Schließlich gibt es noch PIMF-Kabel, wo sowohl die paarweisen Adern als auch das Gesamtkabel abgeschirmt sind. EIA/TIA gibt schließlich den Kabeltyp an. CAT 5 bedeutet, dass dieses Kabel für Frequenzen bis 100 MHZ ausgelegt ist. CAT 3 würde dies auf 16 MHZ beschränken.
Achten Sie daher beim Kauf der Datenkabel auf die von Ihnen benötigten Entfernungen und Geschwindigkeiten.
Ethernet
BearbeitenBeim Ethernet werden die Teilnehmerstationen an den Bus (auch trunk oder ether genannt) angeschlossen. Das Ethernet benutzt das CSMA/CD (carrier sense multiple access with collision detection)-Verfahren. Grundsätzlich kann daher jede Arbeitsstation zu jedem Zeitpunkt Daten über den Bus senden (multiple access), sofern der Bus frei ist. Dazu hört jede Station den Bus stetig ab (carrier sense). Dies gilt auch, wenn eine Kollision aufgetreten ist. In diesem Fall haben mindestens zwei Arbeitsstationen den Bus als leer erkannt und Daten gesandt. Diese Kollision wird erkannt und durch eine Arbeitsstation wird ein JAM genanntes Signal ausgesendet. Dieses Signal veranlasst die beteiligten Arbeitsstationen, erst nach einer zufällig berechneten Zeit einen erneuten Sendeversuch durchzuführen. Bei kleineren Netzen befindet sich der Bus meist im Hub.
Diese Kollisionen können gerade bei umfangreicheren Netzwerken bei vielen Arbeitsstationen zu einem Performance-Einbruch in Ethernetzwerken führen. Bei geringer Auslastung des Netzwerkes werden jedoch hohe Übertragungsraten erreicht.
Performance-Erhalt im Ethernet
BearbeitenMit Hilfe von Brücken (Bridge) können Sie gezielt einzelne Netzwerksegmente voneinander trennen. Dadurch können Sie das Netzwerk entlasten. Der Switch ist eine besondere Form der Brücke und durch seine Hardwareunterstützung schneller als diese.
Switches bzw. Brücken prüfen die im Netzwerk versandten Pakete auf die MAC-Adresse (eindeutige [Ziel]adresse einer Netzwerkkarte) und sendet diese nur dann in dieses einzelnes Subnetz weiter, wenn sich in diesem die Zielarbeitsstation befindet. Die Anzahl der Kollisionen kann dadurch erheblich vermindert werden.
Router verbinden üblicherweise lokale Intranetze miteinander bzw. mit dem Internet. Im Gegensatz zu Brücken werden Router jedoch direkt angesprochen.
Token Ring
BearbeitenDie andere Art der Netzwerke ist das Token-Ring-Netzwerk. Dabei wird im Netz ein sogenannter Token von Arbeitsstation zu Arbeitsstation weitergereicht. Sofern eine Datenstation senden möchte, belegt sie den Token und sendet ihre Daten unter genauer Angabe der Zieladresse. Anschließend reicht sie den Token weiter. Im folgenden prüft jede erhaltende Arbeitsstation, ob das Datenpaket an sie adressiert ist. Sofern dies der Fall ist, werden die Daten kopiert und der Empfang am Token vermerkt. Sobald der Token wieder beim Sender angekommen ist, setzt dieser den Token wieder als frei in das Netzwerk. Token-Ring-Netzwerke erhalten ihren Datendurchsatz auch bei hoher Auslastung.