2016-07-25 20 views
0

Ich habe eine E/A-intensive Java-Tomcat-Anwendung, wo ich htmlunit-Tests in einer moderneren Clusterumgebung ausführen möchte. Ich habe deshalb auch Docker berücksichtigt, der coole Features bieten kann, indem er Schwarm und so weiter anwendet.I/O intensive Java-Anwendung beschleunigt auf Docker auf begrenzten Ressourcen

Der Test wird für eine Oracle-Datenbank ausgeführt und erstellt Datenverkehr auch auf der lokalen E/A. Ich bin nur neugierig auf eine Frage:

Wenn ich die Tests mit einer einfachen Installation des Produkts mit begrenzten Ressourcen (load15 Faktor erhöht über 2 auf einem 1 CPU-System) läuft die Testlaufzeit ist ~ 35% langsamer als auf derselben Umgebung (begrenzte Ressourcen) unter Verwendung eines dockerisierten Ansatzes der Testausführung. Wenn genügend Ressourcen vorhanden sind, um den Ladefaktor unter 1 zu halten (auf einem 1-CPU-System), sind die Laufzeiten zwischen einfacher Installation und dockerisierter Installation nahezu identisch.

Ich bin auf der Suche nach Möglichkeiten, dies zu erklären. Geht es um Caching-Mechanismen eines Overlay-Dateisystems? Wohin, wenn man das untersucht?

+1

Die genaue Antwort würde eine vollständige Analyse des Systems erfordern, aber ein Beispiel, wie dies geschehen kann, ist, wenn Sie eine Menge von E/A-Arbeit parallel erstellen. Wenn Sie auf CPU-Limits stoßen, wird Ihre E/A mehr serialisiert und daher schneller. Oder allgemeiner ausgedrückt: Profile zur Leistungsminderung variieren je nachdem, welcher Engpass getroffen wird. – biziclop

Antwort

1

Diese Antwort ist sehr spezifisch für Ihre Anwendung, so dass Sie nur die verschiedenen Docker-Speicher-Setups testen können.

Testen Sie zunächst die App mit einer local data volume. Entweder ein local volume oder mounting a local directory as a volume. Der größte Teil des Overheads wird entfernt und sollte so nah wie möglich an den Host-E/A-Geschwindigkeiten liegen.

Wenn Ihre App mit voller Geschwindigkeit läuft, ist es wahrscheinlich die docker storage driver ist der Übeltäter, so können Sie die alternativen Optionen zum Docker-Dämon versuchen, um zu sehen, welche am besten funktioniert.

  • Verwenden Sie Devicemapper nicht im Loop-Modus, nie! --storage-driver==devicemapper \ --storage-opt dm.loop*
  • AUF --storage-driver==aufs
  • OverlayFS --storage-driver==overlay2 oder overlay auf pre 4.x-Kernel.
  • Direkte LVM --storage-driver==devicemapper \ --storage-opt dm.datadev=/dev/dockervg/datalv \ --storage-opt dm.metadatadev=/dev/dockervg/metadatalv
    Dies erfordert einige LVM-Setup.

Mit jedem Treiber testen.
Ihre Containerdaten werden bei jedem Tausch zerstört.
Verwenden Sie dann den besten Treiber.

Die Installation des lokalen Volumes wird wahrscheinlich am schnellsten sein, wenn Sie sich dafür entscheiden, dass Sie mit Daten umgehen, die außerhalb des Containers gespeichert werden.

+0

Danke für die Antwort. Es tut mir sehr leid, aber ich habe es verwechselt: Es ist der dockerisierte Ansatz, der bei der Testausführung 35% schneller ist als die einfache Installation mit begrenzten Ressourcen ... Ich will nur verstehen, warum. – ferdy

+0

@ferdy Oh, ich verstehe was du meinst ... aber das ist eine merkwürdige Situation. Auch dies ist sehr spezifisch für Ihre App und Ihr System-Setup, so dass Sie möglicherweise keine gute Antwort erhalten. Könnten Sie im Vergleich zu den anderen Einstellungen einige Details zu Ihren begrenzten Ressourcen hinzufügen? – Matt

+0

Sie erhalten möglicherweise mehr Hilfe, wenn Sie diese Frage auf die Unix-Stack-Site verschieben, oder möglicherweise einen Serverfehler, nachdem Sie das Systemdetail hinzugefügt haben. – Matt