Warum dauert es so lange, eine Datei URL von S3 mit CarrierWave und Fog zu erhalten?

8

Ich verwende CarrierWave (0.9.0), Fog (1.14.0) und S3 zum Speichern von Benutzeravataren. Es scheint lange dauern, um die Avatar-URL für einen bestimmten Benutzer zu bestimmen. Nachfolgende Anrufe haben eine stark reduzierte Zeit.

config / initializers / fog.rb

%Vor%

user.rb

%Vor%

Konsole

%Vor%

New Relic meldet, dass user.avatar_url manchmal bis zu 1 Sekunde dauert. Was könnte dazu führen, dass dies so langsam ist? Es gibt eine Diskussion über die langsame URL-Generierung für öffentliche Dateien , aber meine Avatare sind nicht öffentlich.

Update 1:

Explizit erfordert Fog und CarrierWave vor dem ersten Aufruf keinen Unterschied, da false zurückgegeben wird und anzeigt, dass sie bereits geladen sind.

%Vor%

Aktualisierung 2:

Hier ist der Uploader:

%Vor%

Aktualisierung 3:

user.avatar.url scheint keinen Unterschied zu machen:

%Vor%     
ben 30.07.2013, 15:07
quelle

2 Antworten

4

Ich denke, dass der Nebelbedarf noch in Frage steht (obwohl es jetzt weniger offensichtlich ist). Da Nebel so viele verschiedene Dinge enthält, haben wir vor langer Zeit die Entscheidung getroffen, viele der Abhängigkeiten aufzuschieben, bis sie benötigt wurden. Dies hat den Vorteil, Nebel zu beschleunigen, kann aber den Nachteil haben, dass es verlangsamt wird, wenn bestimmte Dinge zum ersten Mal passieren. Ich bin mir nicht sicher, wie ich diesen Teil vergessen habe, aber wenn ich ein kleines Benchmarking an meiner Maschine durchführe, kann ich sicherlich eine Verlangsamung feststellen, wenn man dies berücksichtigt.

Um dies zu umgehen, können Sie den entsprechenden benchmarking auf etwas wie:

ändern %Vor%

Es mag ein bisschen seltsam erscheinen, dass Sie diese Verbindung nicht verwenden, aber ich habe es so eingerichtet, dass das Laden von S3-Spezifizierungen verzögert wird, bis Sie das tun (damit Sie beispielsweise keine S3-Details laden müssen) um EC2 zu verwenden). Wenn Sie jedoch eine Verbindung zu einem früheren Zeitpunkt initialisieren, vermeiden Sie diesen Overhead. Hoffentlich bringt dich das wenigstens näher an deinen Platz.

    
geemus 31.07.2013, 15:06
quelle
2

Ich habe einige Zeit damit verbracht. Während ich die Ursache nicht herausgefunden habe, hier sind einige Ergebnisse. Du kannst damit beginnen, was ich getan habe und hoffentlich musst du dir darüber nicht zu viele Gedanken machen.

  • Basierend auf was du gesagt hast und meinen Experimenten. Diese Langsamkeit tritt nur auf, wenn Sie user.avatar_url zuerst aufrufen. Es ist schnell, wenn Sie nach dem ersten Aufruf user.avatar_url oder another_user.avatar_url aufrufen. Im Grunde ist nur eine Anfrage von diesem Problem betroffen, daher denke ich, dass dies kein großes Problem ist.
  • Was ist der Unterschied zwischen den ersten und nachfolgenden Anrufen? Ich schlage vor, dass Sie ruby-prof verwenden, um den Unterschied zu überprüfen. Ich bin kein Experte, aber aus dem Bericht werden Sie sehen, dass der erste Lauf mehr Zeug als der zweite Lauf lädt. ruby-prof stellt einige andere Berichte zur Verfügung, die für Sie hilfreich sein können, insbesondere den Baumbericht.

  • Ich dachte, dass CarrierWave / Fog möglicherweise auf S3 zugreifen muss, um sicherzustellen, dass die URL existiert. Dies wurde durch Verwendung eines falschen S3-Buckets ausgeschlossen.

Der obige Bericht wird durch den folgenden Code generiert.

%Vor%     
wanghq 10.08.2013 08:05
quelle