[RUBY] Problem der langsamen Verarbeitung bei Verwendung von Active Storage mit Cloud-Speicher (GCS, S3 usw.)

Überblick

Dies ist ein Untersuchungsprotokoll, als die Verarbeitung der auf Heroku ausgeführten Rails-Anwendung langsam war. Zusammenfassend war der Cloud-Speicherteil von GCP, der für die Bildspeicherung verwendet wurde, der Engpass.

Umgebung

Hintergrund

Ich baue und betreibe eine Hobby-Website mit Rails mit Herokus kostenlosem Plan. Von Anfang an war der Prozess nicht sehr schnell, aber ich habe SQL mit Redis zwischengespeichert, also dachte ich, es wäre so, wenn es kostenlos wäre.

Ich bemerkte jedoch, dass nur einige Seiten schneller waren als andere, und beschloss, die Ursache zu untersuchen.

Umfrage

Umfragemethode

Obwohl es sich um eine allgemeine Methode handelt, habe ich beschlossen, das Protokoll mit dem folgenden Befehl auszugeben und die Verarbeitungszeit zu überprüfen.

heroku logs --tail

Standardmäßig gibt Rails verschiedene Verarbeitungszeiten im DEBUG-Protokoll an, daher habe ich mich entschlossen, dies zuerst zu überprüfen.

Umfrageergebnisse protokollieren

Zuerst dachte ich, dass die SQL des nicht zwischengespeicherten Teils langsam war, Was SQL betrifft, hat der Cache funktioniert und ich konnte keine langsamen Abfragen finden.

Stattdessen gab es jedoch einige Protokolle, deren Verarbeitungszeit 100 ms oder mehr dauerte (siehe unten).

 GCS Storage (169.9ms) Checked if file exists at key: variants/xxxx

Die Site hat das Bild auf GCS hochgeladen, und ich konnte mir vorstellen, dass das Teil verwandt war. Sie können auch sehen, dass die entsprechende Funktion von Active Storage durch Schlüsselwörter wie Variante beeinflusst wird.

Variant

In Bezug auf diese Variante möchte ich, dass Sie die folgenden Referenzmaterialien sehen, aber in einfachen Worten ist es eine Funktion, die Größe usw. zu ändern, ohne das hochgeladene Bild so zu verwenden, wie es ist. Referenz

Wenn Sie diese Funktion verwenden, müssen Sie sich nicht darum kümmern, die Größenänderungsverarbeitung usw. zu implementieren. Dies ist eine sehr praktische Funktion, mit der das Bild in der Größe beim ersten Zugriff gespeichert und hinter den Kulissen wiederverwendet wird. Diesmal scheint es jedoch so, als ob die Funktion von Ki etwas Schlechtes tut.

Versuchen Sie es mit Google

Ich entschied, dass es schwierig sein würde, weitere Untersuchungen durchzuführen, und googelte, wenn vorerst andere ähnliche Symptome auftraten.

Als Ergebnis fand ich einige Dinge, die ähnliche Symptome zu sein schienen, wie S3 von AWS.

https://stackoverflow.com/questions/49415911/activestorage-checking-if-file-exists-is-slow https://github.com/rails/rails/issues/32548 https://github.com/rails/rails/pull/37901

Als ich es mit meinen schlechten Englischkenntnissen diagonal las, traf ich das folgende Urteil. (Ich entschuldige mich, wenn ich falsch liege.)

--Das Vorhandensein des konvertierten und gespeicherten Bildes wird überprüft und es dauert dort einige Zeit.

Lösungen

Mit Blick auf das Obige dachte ich, dass die neueste Version das Problem lösen würde, aber leider wurde 6.1 noch nicht veröffentlicht ...

Abschließend habe ich beschlossen, den Komprimierungsprozess nach Varianten zu stoppen und das Originalbild zu verwenden. In Bezug auf das Originalbild wird davon ausgegangen, dass dies kein Problem darstellt, da die Größe vor dem Hochladen manuell mit einem Bildwerkzeug usw. geändert und korrigiert wird.

Infolgedessen verschwand das ursprüngliche Protokoll, das mehr als 100 ms dauerte, und wurde in die folgende 1 ms-Verarbeitung geändert, und ich habe das Gefühl, dass die Geschwindigkeit schneller geworden ist.

GCS Storage (1.5ms) Generated URL for file at key: xxxx 

Zusammenfassung

Dies lag daran, dass die Verwendung des von Active Storage in Cloud Storage (GCS) verarbeiteten Bilds lange gedauert hat. Wir haben uns für einen heiklen Ansatz entschieden, indem wir die Funktion nicht ohne grundlegende Maßnahmen genutzt haben.

Rails 6.1, das in Kürze veröffentlicht wird, scheint eine Gegenmaßnahme zu haben, daher möchte ich die Funktion nach dem Update wieder verwenden.

Es handelt sich um Active Storage, der problemlos Cloud-Speicher wie S3 und GCS verwenden kann. Dank verschiedener Verstecke hinter den Kulissen stellte sich jedoch heraus, dass dies die Leistung an Orten beeinträchtigt, die nicht sichtbar sind.

Recommended Posts

Problem der langsamen Verarbeitung bei Verwendung von Active Storage mit Cloud-Speicher (GCS, S3 usw.)
[Android] [Java] Laden Sie Bilder auf GCS (Google Cloud Storage) mit Stream mit Glide herunter
Vorgehensweise zur Verwendung von S3 von LocalStack für Active Storage
Ein Fehler beim Anzeigen eines Bildes mit Active Storage
Achten Sie bei der Verwendung von MessageEncryptor mit Rails 5.2 / 6.0 auf den Zeitpunkt der Initialisierung