Frage

Ich habe gerade einen einfachen Code-Stück für den Perf-Test Redis + gewert, um zu sehen, wie Async Perforance hilft, und ich war überrascht, schlechte Leistung zu finden.Hier ist mein Code.Wenn Sie die ersten beiden Zeilen zum Affe-Patch loswerden, sehen Sie diesen Code, dann sehen Sie die Timing "Normal Execution".

auf einem Ubuntu 12.04 lts vm, sehe ich ein Timing von

ohne Affe-Patch - 54 Sekunden Mit dem Affenpatch - 61 Sekunden

Falls mit meinem Code / Ansatz etwas nicht stimmt?Gibt es hier ein Perf-Problem? generasacodicetagpre.

War es hilfreich?

Lösung

dies wird erwartet.

Sie führen diesen Benchmark auf einem VM aus, auf dem die Kosten für Systemaufrufe höher sind als auf physische Hardware. Wenn GEVENT aktiviert ist, neigt es dazu, mehr Systemaufrufe zu generieren (um das Epoll-Gerät umzugehen), so dass Sie mit weniger Leistung enden.

Sie können diesen Punkt leicht überprüfen, indem Sie den Strafen im Skript verwenden.

ohne gewert, erzeugt die innere Schleife: generasacodicetagpre.

Mit GEVENT haben Sie Vorstellungen von: generasacodicetagpre.

Wenn der RECVFROM-Anruf blockiert (EAGAIN), wird GEVENT auf die Ereignisschleife zurückgekehrt, sodass zusätzliche Anrufe auf File-Deskriptorenereignisse (Epoll_Wait) warten.

Bitte beachten Sie, dass diese Art von Benchmark ein schlimmster Fall für jedes Ereignis-Loop-System ist, da Sie nur einen File-Deskriptor haben, sodass die Wartevorgänge nicht auf mehreren Deskriptoren firmiziert werden können. Darüber hinaus kann Async I / OS hier nichts verbessern, da alles synchron ist.

Es ist auch ein schlimmster Fall für Redis, weil:

    .
  • Es erzeugt viele Rundrissen an den Server

  • es systematisch verbindet / trennbar (1000-fach), da der Pool in der UXDomainockocket-Funktion deklariert ist.

    eigentlich testet Ihr Benchmark nicht, dass GEVENT, REEDIS oder Redis-PY nicht testet: Es übt die Fähigkeit eines VM aus, ein Ping-Pong-Spiel zwischen 2 Prozessen aufrechtzuerhalten.

    Wenn Sie die Leistung erhöhen möchten, müssen Sie:

      .
    • Verwenden Sie Pipelining, um die Anzahl der Rundrissen zu verringern

    • Machen Sie den Pool auf der ganzen Benchmark anhaltend Sehen Sie sich beispielsweise mit dem folgenden Skript an: generasacodicetagpre.

      Mit diesem Skript bekomme ich ungefähr 3x bessere Leistung und fast kein Overhead mit GEVENT.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top