6

Ich habe eine Seite mit einer großen Menge an Daten, und ich bin auf allen Seiten wie diese „russische Puppe“ Caching tun:Rails Fragment-Caching: würden 100K + Fragmente die Performance verschlechtern?

# articles.html.haml 
- cache "list of articles", expires_in: 15.minutes do 
    = render partial: "article", collection: @articles 

# _article.html.haml 
- cache article do 
    = article.body 
    = render partial: "comment", collection: article.comments 

# _comment.html.haml 
- cache comment do 
    = comment.body 

Diese Hunderttausende von Fragmenten schaffen würde.

1. Würde dies die Leistung mit so vielen Fragmentdateien im Verzeichnis/tmp/cache beeinträchtigen?

2. Löscht die Schiene automatisch alte Fragmente, wenn sie automatisch abgelaufen sind?

PS. Die Site befindet sich auf einem einzigen Ubuntu-Server mit 4 GB RAM. Es verwendet nicht memcached als Cache-Speicher, sondern nur die standardmäßige dateibasierte Implementierung, die mit Rails aus der Box kommt.

Antwort

1

Irgendwann müssen Sie sich die Frage stellen, ob ein Cache-Treffer immer noch weniger kostenintensiv ist als das Erzeugen des Fragments. Wenn die Antwort yes ist (und dies kann Benchmark sein), verbessert dies die Leistung im Vergleich zu einer nicht zwischengespeicherten Situation. Im Fall von Hunderttausenden von Cachefragmenten, die auf einer physischen (Platter-) Festplatte gespeichert sind, würde ich jedoch sehr auf einen I/O-Engpass achten. Wenn dies zu einem Problem wird, können Sie die Tiefe Ihrer Caching-Strategie einschränken, um die Anzahl der Dateien zu reduzieren. Aber bitte, Benchmark, bitte. Die Trefferquote ist hier eine sehr wichtige Statistik, da eine hohe Trefferquote die I/O in diesem speziellen Fall begrenzt.

Wenn Leistung Sie beunruhigt, sehen Sie auch, wie oft Fragmente abgelaufen sind. In Ihrer speziellen Situation wird die "Artikelliste" jedes Mal ungültig, wenn ein Kommentar veröffentlicht wird. Sie laufen derzeit alle 15 Minuten ab. Wenn Sie jedoch möchten, dass Ihre Ausgabe konsistent ist, sollte sie unmittelbar nach dem Platzieren oder Bearbeiten eines Kommentars oder Artikels abgelaufen sein. Wenn Sie auf Ihrer Artikelliste mehrere Kommentare pro Minute haben, können Sie hier sogar einzelne Kommentare zwischenspeichern. Wenn I/O zu einem Problem wird, können Sie immer etwas RAM hinzufügen und memcached verwenden (oder redis, für diese Angelegenheit).

Da Sie jedoch über mehrere Cache-Speicherebenen verfügen, können Sie hier mit nur wenigen Treffern zu Ihrem Dateisystem zusätzlich zu den Treffern auf das übergeordnete Fragment "Liste der Artikel" vollkommen zufrieden sein.

1

Wenn Sie nicht auf einem Windows-Server gehostet werden, werden 100K-Dateien, die über mehrere Ordner im Cache von Rail verteilt sind, keine Leistungseinbußen verursachen.