Gcsfuse

當我映射到已安裝儲存桶中的文件時,它是如何/何時下載的?

  • February 23, 2019

我正在使用一個映射大型資源文件的庫。我正在考慮將該資源文件儲存在 gcloud 儲存桶中並使用 GCSFuse 使該文件可用於映射,而不是建構我自己的解決方案來手動下載該文件。

出於性能原因,當我通過 gcsfuse 映射到儲存桶中的文件時,我想知道何時實際下載文件:如果在我映射時它是一次全部下載,那是理想的。如果在我通過 mmapped 指針訪問文件的不同部分時下載了塊,我想這會由於多次呼叫儲存桶而變慢,如果是這種情況,我可能會使用另一種方​​法。

這是一個特定於實現的細節,因此請務必閱讀文件。從 6ab0a79 開始的 README.md 有這樣的說法:

下載對象內容

在幕後,當一個新打開的文件第一次被修改時,gcsfuse 會從 GCS 下載整個支持對象的內容。內容儲存在本地臨時文件中,其位置由標誌–temp-dir 控制。稍後,當文件關閉或 fsync’d 時,gcsfuse 將本地文件的內容寫回 GCS 作為新的對像生成。

未修改的文件根據需要逐部分讀取。gcsfuse 使用啟發式方法來檢測文件何時被順序讀取,並且在這種情況下會向 GCS 發出更少、更大的讀取請求。

這樣做的結果是 gcsfuse 在讀取或寫入整個大文件時相對有效,但對於較大文件中的少量隨機寫入不會特別快,並且在較小程度上對於小型隨機讀取也是如此。將大文件複製到 GCS 時的性能與 gsutil 相當(有關測試說明,請參見問題 #22)。如上所述,由於在本地臨時文件中暫存數據會產生一些成本。

請注意,新文件和修改後的文件也完全暫存在本地臨時目錄中,直到由於關閉或 fsync 而將它們寫出到 GCS。因此,使用者在寫入大文件時必須確保有足夠的可用空間來處理分段內容。

請注意有關下載整個事物的寫入、完整對象寫入更有效以及語義化.md 中令人驚訝的行為的一點。跳過 fuse 文件系統層,使用 GCS SDK 直接讀取和寫入整個數據塊作為儲存 blob 會更有效。但這對這個應用程序使用儲存的方式來說是一個重大變化。

引用自:https://serverfault.com/questions/955309