Über Performance, Skalierbarkeit und Technologien

von Hubert Schmid vom 2013-06-16

Ein paar hundert Millionen originäre Datensätze und ein paar Millionen Zugriffe pro Tag – Technologie-Evangelisten machen uns glauben, dafür seien neue Technologien wie NoSQL-Datenbanken, ereignisgesteuerte Laufzeitplattformen und Shared-Nothing-Architekturen notwendig. Doch ist dem wirklich so? Ist das die passende Strategie für Performance und Skalierbarkeit?

Leistung

Die Leistungsfähigkeit von Rechnern ist über die letzten Jahrzehnte kontinuierlich gestiegen. Entsprechend dem mooreschen Gesetz verdoppelte sie sich ungefähr alle 20 Monate – also allein um Faktor 8 in den letzten fünf Jahren. Allerdings gab es vor ungefähr zehn Jahren einen Bruch in dieser Entwicklung: Bis zu diesem Zeitpunkt war das Wachstum für Softwareentwickler direkt spürbar. Doch seitdem werden Consumer-Geräte entweder kleiner, günstiger oder stromsparender – die Leistungssteigerung beschränkt sich dagegen primär auf das Rechenzentrum.

Aus meiner Sicht führte diese Änderung dazu, dass Entwickler heute ein wesentlich geringeres Verständnis für das Leistungspotential von Rechnern haben, als es noch vor einigen Jahren der Fall war. Einhergehend schwindet das Gefühl für die Größenordnung an Daten und Operationen, die ein System verarbeiten kann, und damit eben auch die Möglichkeit, fundierte Entscheidungen treffen zu können.

Dabei ist es doch gerade in der Softwareentwicklung sehr einfach, die notwendigen Informationen experimentell zu ermitteln – ganz im Gegensatz zu typischen Ingenieursdisziplinen. So würde sich schnell herausstellen, dass die zu Beginn erwähnten Größenordnungen selbst für einen Rechner der Unterklasse kein Problem darstellen.

Beispiel

Die Firma MaxMind bietet Geo-IP-Datenbanken an. Dazu gehört auch eine in bestimmtem Rahmen frei nutzbare und abgesteckte Version in Form zweier CSV‑Dateien, die den IP‑Adressbereich mit zwei Millionen Intervallen abdeckt, um daran Geo-Informationen festzumachen.

Diese Datenbank verwende ich innerhalb einer Web-Anwendungen als Indiz für die Herkunft der Nutzer. Eine CSV-Datei ist für den direkten Zugriff ungeeignet, und das Einlesen der Datei beim Start der Anwendung dauert vergleichsweise lange – zumindest mit Python. Aus diesem Grund werden die CSV‑Dateien in ein binäres Format konvertiert, auf das sich sowohl einfach als auch effizient zugreifen lässt. Die Python-Implementierung für das Öffnen der Dateien und die Lookup-Funktion umfasst gerade mal 30 Zeilen und besitzt keine Abhängigkeiten zu externen Modulen.

Eine Laufzeitmessung zeigt: Die Implementierung bestimmt pro Sekunde die Geo-Informationen zu 12,3 Millionen IP‑Adressen – also weit mehr als die meisten aktuell benötigen. Dabei lief der Test wohlgemerkt mit Python, auf meinem Notebook und ohne Parallelisierung. Das Beispiel zeigt also, dass große Datenmengen mit minimalen Aufwand sehr schnell verarbeitet werden können, wenn man geeignet vorgeht.

Fazit

Aktuelle Rechner sind unglaublich leistungsfähig und die Integrationsdichte wird sich voraussichtlich weiterhin ungefähr alle 20 Monate verdoppeln. Dadurch stehen jeder fachlichen Funktion Tausende bis Millionen Prozessor-Zyklen für die Abarbeitung zur Verfügung. Vorhandene Performance-Engpässe sind daher meist auf ineffektive Ressourcen-Nutzung zurückzuführen, und lassen sich durch geeignete Analyse einfach aufdecken und beseitigen. Doch es ist schwierig, wenn die Lösung bereits feststeht, bevor das Problem verstanden ist.