|
10 Min. Lesezeit
|

Health Samurai Lab: Game of Pools

Diesen Artikel zusammenfassen mit:
ChatGPTPerplexityClaudeGrok

Wie die meisten Webanwendungen besteht Aidbox aus einer eingehenden Web-Anfrage-Warteschlange, einem Pool von Web-Workern, die Anfragen verarbeiten, sowie einem Pool von Datenbankverbindungen. Diese beiden Pools – Web-Worker und Datenbankverbindungen (DB) – spielen eine zentrale Rolle für die Aidbox-Performance. Gemeinsam bestimmen sie, wie effizient die Serverressourcen genutzt werden.

Aidbox ermöglicht es Ihnen, die Größen dieser Pools über die Einstellungen BOX_WEB_THREAD und BOX_DB_POOL_MAXIMUM_POOL_SIZE zu konfigurieren. Dies wirft die Frage auf: Welche optimalen Parameter sollte ich für meine konkrete Installation angeben? Der gesunde Menschenverstand legt nahe, dass die Anzahl der Web-Threads mit den verfügbaren CPU-Kernen auf Ihrem Server skalieren sollte, während der Datenbankverbindungspool groß genug sein sollte, um alle aktiven Web-Worker plus eine kleine Reserve für Hintergrundaufgaben zu bedienen. Auf dieser Grundlage lautete die Empfehlung von Health Samurai: BOX_WEB_THREAD = 2 × CPU_COUNT und BOX_DB_POOL_MAXIMUM_POOL_SIZE = 2 × BOX_WEB_THREAD. Diese Empfehlung ist grundsätzlich logisch und stimmt mit dem Verständnis der Funktionsweise des Web-Stacks überein. Sie wurde durch unsere Erfahrung im Betrieb von Aidbox bestätigt. Allerdings war sie bis jetzt nicht durch systematische Lasttests unter anhaltender Last validiert worden.

Testumgebung

Um die Aidbox-Performance isoliert zu messen, haben wir alle Tests lokal auf einem dedizierten Server durchgeführt, mit einer lokalen Datenbank und einem lokalen Netzwerk mit schnellen NVMe-Festplatten, um Netzwerk- und I/O-Overhead zu minimieren. Für die Ausführung der Tests haben wir das Werkzeug K6 verwendet.

Die Tests führten CRUD-Operationen über neun verschiedene Ressourcentypen durch. Als Ergebnis haben wir Durchsatz und Latenz gemessen.

Die vollständige Testumgebung, die Skripte und die Ergebnisse sind im Repository verfügbar.

Testszenarien

Nun einige Worte dazu, wie wir Aidbox getestet haben. Da wir verschiedene CPU-Limit-Konfigurationen (2, 4, 6, 8) testen wollten, wäre es unpraktisch gewesen, die Pool-Größen für jedes CPU-Limit im Voraus festzulegen. Stattdessen verwenden wir Multiplikatoren:

CPU_LIMITS = [2, 4, 6, 8]
WEB_THREAD_MULTIPLIERS = [1, 1.5, 2, 2.5, 3]
DB_POOL_MULTIPLIERS = [1.5, 2, 2.5, 3]

Was bedeutet das? Während des Tests haben wir alle möglichen Kombinationen dieser Parameter durchlaufen. Zum Beispiel ergibt sich für 6 CPU-Kerne mit einem Web-Multiplikator von 2 und einem Datenbank-Multiplikator von 2,5 folgende Konfiguration:

services:
  aidbox:
    deploy:
      resources:
        limits:
          cpus: '6'                            # 6 CPU limit
    environment:
      BOX_INSTANCE_NAME: cpu_6__web_12__db_30
      BOX_WEB_THREAD: '12'                     # 6 * 2 (web multiplier)
      BOX_DB_POOL_MAXIMUM_POOL_SIZE: '30'      # 6 * 2 * 2.5 (web and db multiplier)

Insgesamt haben wir 80 Tests aller möglichen Konfigurationen durchgeführt. Vor jedem Test führten wir einen Warm-up durch, gefolgt von einem 5-minütigen Stresstest auf CRUD-Operationen.

Eine sehr wichtige Beobachtung aus den Tests ist, dass die Größe des Datenbankpools größer sein muss als die Anzahl der Web-Worker, da Aidbox im Betrieb mehrere Verbindungen für Hintergrundaufgaben belegt, was bei der Verarbeitung einer Anfrage zu Fehlern beim Versuch führen kann, eine Datenbankverbindung zu erhalten.

Testergebnisse

Nach fast acht Stunden Tests können wir uns die Ergebnisse ansehen. Nachfolgend finden Sie die detaillierten Performance-Analysediagramme für jede CPU-Konfiguration:

2-CPU-Konfiguration

Chart 1

Chart 2

4-CPU-Konfiguration

Chart 1

Chart 2

6-CPU-Konfiguration

Chart 1

Chart 2

8-CPU-Konfiguration

Chart 1

Chart 2

Wichtige Beobachtungen aus den Diagrammen

Die Diagramme zeigen deutlich:

  • Durchsatz (RPS): Der maximale Durchsatz wird mit einem Web-Thread-Multiplikator von 1,5x und einem DB-Pool-Multiplikator von 2–2,5x erreicht.
  • P99-Latenz: Die minimale Latenz wird mit einem Web-Thread-Multiplikator von 1x und einem DB-Pool-Multiplikator von 1,5–2x beobachtet.
  • Skalierung: Nahezu lineare Performance-Skalierung mit zunehmender Anzahl von CPU-Kernen.
  • Kompromisse: Klare umgekehrte Beziehung zwischen Durchsatz und Latenz bei zunehmender Größe der WEB-Threads.

Zusammenfassung

Die Testergebnisse bestätigen unsere bisherigen Empfehlungen und das allgemeine Verständnis davon, wie sich Aidbox unter Last verhält. Wir haben lediglich eine praktische Bestätigung in Zahlen erhalten.

Zusammenfassend lautet die allgemeine Empfehlung für BOX_DB_POOL_MAXIMUM_POOL_SIZE: 2 × BOX_WEB_THREAD. Eine Erhöhung der Datenbankpool-Größe bringt keinen Performance-Gewinn und führt in einigen Fällen zu einer Verschlechterung. Diese Verschlechterung ist nicht signifikant und liegt innerhalb der Messfehlertoleranz, war jedoch dennoch nachvollziehbar. In unseren detaillierten Dashboards haben wir bei einer erhöhten DB-Pool-Größe häufigere GC-Aktivitäten beobachtet, was auf zusätzlichen Overhead für die Verwaltung eines großen Datenbankverbindungspools hinweisen kann.

Die allgemeine Empfehlung für BOX_WEB_THREAD lautet 1,5 × CPU_COUNT. Dies bietet die beste Balance zwischen Durchsatz und Latenz und ist für die meisten Projekte optimal.

Für Projekte wie EHR, PHR, Patientenportale und ähnliche, bei denen viele kurze und schnelle OLTP-Operationen anfallen und bei denen Systemreaktionsfähigkeit sowie minimale Latenz für eine bessere Endbenutzererfahrung wichtiger sind, empfiehlt es sich, BOX_WEB_THREAD auf 1 × CPU_COUNT zu setzen.

Für CDR-Systeme, bei denen viele lange und komplexe Such- und Analyseabfragen anfallen, viele Massenimporte durchgeführt werden und der Großteil der Arbeit auf die Datenbank entfällt, empfiehlt es sich, BOX_WEB_THREAD auf 2 × CPU_COUNT zu setzen.

Nachfolgend finden Sie eine Übersichtstabelle mit empfohlenen Parametern:

CPU-AnzahlAnwendungsfallWEB-ThreadsDB-Pool-Größe
2Ausgewogen (Empfohlen)36
2Niedrige Latenz24
2Hoher Durchsatz48
4Ausgewogen (Empfohlen)612
4Niedrige Latenz48
4Hoher Durchsatz816
6Ausgewogen (Empfohlen)918
6Niedrige Latenz612
6Hoher Durchsatz1224
8Ausgewogen (Empfohlen)1224
8Niedrige Latenz816
8Hoher Durchsatz1632

Dies sind allgemeine empfohlene Parameter, die auf synthetischen Tests basieren und verschiedene Aspekte des Gesamtbetriebs des Systems nicht berücksichtigen, wie etwa Importe, Datenbankwartung usw. In jedem Fall ist es besser, ähnliche Tests in Ihrer eigenen Umgebung durchzuführen, um optimale Parameter speziell für Ihr System zu ermitteln. Sie können diese Zahlen als Ausgangspunkt für die Feinabstimmung Ihres Systems verwenden. Falls Sie Hilfe bei der Optimierung von Aidbox für Ihre Workload oder Infrastruktur benötigen, nehmen Sie Kontakt mit uns auf.

Eine interessante Beobachtung, die wir heute gemacht haben, ist die nahezu lineare Performance-Skalierung mit zunehmender Anzahl von CPU-Kernen. Nun, das werden wir im nächsten Blogbeitrag testen.

Marat Surmashev, VP of Engineering

Siehe auch: FHIR produktionsbereit machen.

Diesen Artikel teilen
Comments
Comments
Sign in
Loading comments...
Subscribe to our blog

Get the latest articles on FHIR, interoperability, and healthcare IT.