Amdahlsches Gesetz: Formel, Beispiele und Grenzen
6 Min. Lesezeit
Das Amdahlsche Gesetz (Amdahl’s Law) besagt, dass die Beschleunigung durch parallele Ausführung von dem Teil begrenzt wird, der sich nicht parallelisieren lässt. Verteilt sich ein Anteil p der Arbeit auf n Prozessoren, Server oder Threads, beträgt die Beschleunigung S = 1 / ((1 − p) + p/n), und wie groß n auch wird, sie übersteigt nie 1 / (1 − p). Bei 95 % paralleler Arbeit liegt die Obergrenze beim 20-Fachen, selbst auf tausend Maschinen.
Die Zahlen unten sind reine Arithmetik ohne Testlauf dahinter. Die zitierten Arbeiten wurden am 1. November 2026 geprüft.
| Paralleler Anteil p | n = 2 | n = 8 | n = 64 | n → ∞ |
|---|---|---|---|---|
| 0,50 | 1,33 | 1,78 | 1,97 | 2 |
| 0,90 | 1,82 | 4,71 | 8,77 | 10 |
| 0,95 | 1,90 | 5,93 | 15,42 | 20 |
| 0,99 | 1,98 | 7,48 | 39,26 | 100 |
Was besagt das Gesetz in einfachen Worten?
Ein Job kann nicht schneller fertig werden als sein serieller Teil, also verkürzen zusätzliche Worker nur den Rest. Ist der parallele Teil erst klein im Vergleich zum seriellen, ändern weitere Worker die Gesamtzeit kaum noch.
Nehmen Sie einen Job von 10 Sekunden, von denen 1 Sekunde seriell ist (ein Lock, ein einzelner Schreibvorgang) und sich 9 Sekunden gleichmäßig aufteilen, also p = 0,9. Acht Worker erledigen ihn in 1 + 9/8 = 2,125 Sekunden (4,71-mal schneller); vierundsechzig brauchen etwa 1,14 Sekunden. Unter 1 Sekunde kommt er nie, also ist 10 die Obergrenze.
Woher stammt das Gesetz?
Gene Amdahl trug das Argument 1967 auf der AFIPS Spring Joint Computer Conference vor, in einem Aufsatz, der den Ansatz mit einem einzelnen Prozessor verteidigte.
Den Volltext von Validity of the single processor approach to achieving large scale computing capabilities haben wir nicht gelesen. Mark Hill und Michael Marty fassen ihn in Amdahl’s Law in the Multicore Era (IEEE Computer, 2008) zusammen: ein Anteil unbegrenzt parallelisierbar ohne Scheduling-Overhead, der Rest vollständig sequenziell, und die Beschleunigung beschrieben, ohne eine Gleichung anzugeben („without presenting an equation“).
Was bedeutet es für Last- und Kapazitätstests?
Der Durchsatz wächst nicht mehr im gleichen Maß mit Servern, Threads oder Pods, sobald eine gemeinsame Komponente einen Teil jeder Anfrage nacheinander abarbeitet. Ein Lasttest zeigt das als Durchsatzkurve, die abflacht, während Sie weiter Kapazität hinzufügen.
Neil Gunthers unten zitierter Aufsatz von 2008 schreibt dasselbe Gesetz als N / (1 + σ(N − 1)), mit σ als seriellem Anteil, und misst Skalierbarkeit als Durchsatz bei N geteilt durch den Durchsatz bei 1. In einem Websystem ist der serielle Teil alles, was jede Anfrage der Reihe nach passieren muss: ein Lock oder eine Zeile, die jede Anfrage aktualisiert, ein einzelner Datenbank-Primary, der alle Schreibvorgänge annimmt, ein einzelner Queue-Consumer oder eine Drittanbieter-API mit Rate-Limit.
Wie finden Sie den seriellen Teil in einem Lasttest?
Fahren Sie denselben Test auf mehreren Laststufen und beobachten Sie, welche Ressource in die Sättigung geht, während der Durchsatz abflacht. Die Komponente, die an ihrer Grenze ist, wenn zusätzliche Kapazität nichts mehr bringt, ist der serielle Teil oder die Warteschlange davor.
Typische Anzeichen: Der Durchsatz stagniert, obwohl die App-Schicht noch freie CPU hat, Wartezeiten wachsen an einer gemeinsamen Stelle (Locks, Datenbankverbindungen, Queue-Tiefe), und die Antwortzeit steigt im Gleichschritt mit den Benutzern, also Little’s Law an einer Obergrenze. Ein Lauf mit konstanter Last kann das nicht zeigen, also steigern Sie die Last in Stufen. Die LoadFocus-Einstellung Ramp Up Steps fügt virtuelle Benutzer in gleich großen Gruppen hinzu. Die Kapazitätsanzeige gruppiert einen abgeschlossenen Lauf nach aktiven virtuellen Benutzern und listet in bezahlten Tarifen für Läufe mit nur einem Lastgenerator p95, Anfragen pro Sekunde und Fehlerrate pro Stufe. Eine Kapazitätsstufe nennt sie nur, wenn der Lauf mindestens drei Stufen durchlaufen hat und die oberste mindestens doppelt so hoch lag wie die unterste. Ein Skalierbarkeitsmodell passt sie nicht an, die Anpassung unten übernehmen also Sie.
Was ist Gustafsons Gesetz?
Es ist der Gegenpol: Wächst das Problem mit der Maschine, bleibt der serielle Anteil klein und die Beschleunigung wächst fast linear. Amdahl hält die Arbeit fest, Gustafson die Laufzeit.
John Gustafsons Notiz Reevaluating Amdahl’s law von 1988 berichtete Beschleunigungen von 1016 bis 1021 auf einem Hypercube mit 1024 Prozessoren in Sandia, für Anwendungen mit einem seriellen Anteil von 0,4 bis 0,8 Prozent, und argumentierte, dass Benutzer das Problem so weit vergrößern, bis es die verfügbare Zeit ausfüllt. Mit s’ als seriellem Anteil, gemessen am parallelen Lauf, ist die skalierte Beschleunigung N + (1 − N)s’; die Notiz schreibt diese Formel E. Barsis in Sandia zu.
Bei s’ = 0,05 und 64 Prozessoren ergibt das 60,85 gegenüber 15,42 nach Amdahl, weil die beiden 5-%-Werte auf verschiedenen Maschinen gemessen werden. In einem Websystem passt Gustafson, wenn jeder zusätzliche Server mit seinem eigenen Teil der Daten arbeitet; Amdahl passt, wenn jeder zusätzliche Benutzer weiterhin dieselbe gemeinsame Zeile berührt.
Was ergänzt das Universal Scalability Law?
Einen zweiten Term für Kohärenz, also die Kosten, gemeinsame Daten zwischen Workern konsistent zu halten, die mit der Zahl der Worker-Paare wachsen. Damit kann der Durchsatz ein Maximum erreichen und danach sinken, während Sie Kapazität hinzufügen.
Gunthers A General Theory of Computational Scalability Based on Rational Functions (arXiv, 2008) formuliert das Universal Scalability Law (USL) so:
C(N) = N / (1 + σ(N - 1) + κN(N - 1))
peak at N* = sqrt((1 - σ) / κ)
σ steht für Contention (Serialisierung oder Warteschlangen) und κ für Kohärenz (inkonsistente Kopien von Daten); mit κ = 0 ergibt sich Amdahls Formel. Zu Gunthers Beispielen für den ungünstigsten Fall gehört das Aktualisieren von Datenbankeinträgen, und Durchsatz jenseits von N* nennt er „retrograde“, also rückläufig. Mit den Beispielwerten σ = 0,05 und κ = 0,001 liegt das Maximum bei etwa 31 Workern: Der relative Durchsatz beträgt 9,03 bei 32 und 7,82 bei 64, wo der σ-Term allein 15,42 vorhersagt.
Wie passen Sie das USL an eine Lasttestreihe an?
Messen Sie den Durchsatz auf mehreren Nebenläufigkeitsstufen, teilen Sie jeden Wert durch den Durchsatz bei einem Benutzer und bestimmen Sie σ und κ mit der Methode der kleinsten Quadrate.
Umgestellt lautet die Formel N / C − 1 = σ(N − 1) + κN(N − 1) und ist damit linear in σ und κ. Die Werte unten sind aus σ = 0,05 und κ = 0,001 erzeugt; tragen Sie Ihre eigenen Anfragen pro Sekunde pro Stufe in x ein:
import numpy as np
n = np.array([1, 2, 4, 8, 16, 32]) # virtual users
x = np.array([50, 95, 172, 284, 402, 452]) # req/s per level
c = x / x[0] # relative capacity
A = np.column_stack([n - 1, n * (n - 1)])
(s, k), *_ = np.linalg.lstsq(A, n / c - 1, rcond=None)
print(f"sigma={s:.3f} kappa={k:.4f}")
print(f"peak near {np.sqrt((1 - s) / k):.0f} users")
Das Skript gibt sigma=0.050, kappa=0.0010 und ein Maximum bei etwa 31 Benutzern aus. Ändern Sie zwischen den Stufen nur die Nebenläufigkeit und nehmen Sie eine Stufe mit einem Benutzer auf, denn jeder Punkt wird durch sie geteilt.
Wo sind diese Modelle nicht mehr nützlich?
Sie verdichten eine Durchsatzkurve auf ein oder zwei Konstanten, können also weder den schuldigen Lock benennen noch einem System folgen, das sich unter Last verändert. Nutzen Sie sie, um eine gemessene Kurve zu lesen und ein kurzes Stück fortzusetzen: Eine Anpassung auf Stufen weit unterhalb des Knicks sagt wenig über das Maximum.
- Konstante Parameter. Ein Cache, der warm wird, ein Autoscaler oder ein Pool, der an seine Grenze stößt, verändert σ und κ mitten im Test.
- Nur Durchsatz. p95 und p99 können sich zuerst verschlechtern: Prüfen Sie auch die Tail-Latenz.
- Der Lastgenerator. Sättigt er zuerst, ist die flache Kurve seine eigene.
- Geschlossene Tests. Feste virtuelle Benutzer messen ein geschlossenes System; echte Benutzer treffen in ihrem eigenen Tempo ein.
FAQ
Können Sie das Amdahlsche Gesetz einfach erklären? Ein Job ist nur so schnell wie der Teil, der sich nicht aufteilen lässt. Muss ein Zehntel der Arbeit seriell laufen, macht keine Zahl zusätzlicher Worker den Job mehr als zehnmal schneller, weil dieses Zehntel gleich lange dauert.
Was ist Gustafsons Gesetz? Gustafsons Gesetz besagt, dass die Beschleunigung fast linear wächst, wenn das Problem mit der Zahl der Prozessoren wächst, nämlich als N + (1 − N)s’, mit s’ als seriellem Anteil des parallelen Laufs. John Gustafson veröffentlichte es 1988 (die Formel schrieb er seinem Sandia-Kollegen E. Barsis zu) als Gegenpol zu Amdahls Annahme einer festen Problemgröße.
Weiterlesen
- Little’s Law im Lasttest: Tests dimensionieren und prüfen
- Durchsatz vs. Latenz: wie sie unter Last zusammenhängen
- Offenes vs geschlossenes Lastmodell: welches passt wann?
- Tail-Latenz: was sie ist und wie man sie misst
- Warteschlangentheorie: was sie ist und warum Latenz steigt
Die technischen Aussagen in diesem Artikel wurden nicht unabhängig geprüft.