Google-Cloud-Platform

sftp-server over gcsfuse - 大型上傳成功,但小型上傳(<0.5MB)會出錯

  • March 18, 2019

我正在嘗試通過 GCS 設置 sftp 伺服器。

容器中的 gcsfuse 安裝範例是

gcsfuse -o nonempty --only-dir user1 $BUCKET /home/user1/ftp

當我使用 sftp 上傳兩個文件時:

sftp&gt; put 1024K.txt
Uploading 1024K.txt to /ftp/1024K.txt
1024K.txt                                             100% 1025KB 426.0KB/s   00:02    
sftp&gt; put 8K.txt
Uploading 8K.txt to /ftp/8K.txt
8K.txt                                                100% 8200   117.6KB/s   00:00    
Couldn't close file: Failure

但是兩個文件都可以正常傳輸:

sftp&gt; ls -l
-rw-r--r--    1 1003     1003      1049600 Mar 15 13:33 1024K.txt
-rw-r--r--    1 1003     1003         8200 Mar 15 13:33 8K.txt
  • 我在標準的 debian-stretch 實例上執行。
  • 實例具有儲存讀寫權限。
  • 我嘗試了一些 gcsfuse 選項但沒有成功: –type-cache-ttl 0 –stat-cache-ttl 0 –implicit-dirs
  • 我嘗試在客戶端和伺服器上進行 ssh 調試日誌記錄 - 沒有新資訊。

由於大文件上傳成功,我認為它與權限或 sftp 設置無關。什麼可能導緻小文件上傳失敗?

(編輯刪除了對 K8 和 GKE 的引用,因為該行為是可重現的)

這似乎是由於每次傳輸後沒有將寫入刷新到磁碟造成的。看這個例子:

sftp&gt; put 8K.txt
Uploading 8K.txt to /home/jasper_humphrey/user1/8K.txt
8K.txt                                        100% 8200   111.5KB/s   00:00    
Couldn't close file: Failure
sftp&gt; ls
8K.txt  
sftp&gt; put 8K.txt
Uploading 8K.txt to /home/jasper_humphrey/user1/8K.txt
8K.txt                                        100% 8200   125.9KB/s   00:00    
sftp&gt; ls
8K.txt  
sftp&gt; put 8K.txt
Uploading 8K.txt to /home/jasper_humphrey/user1/8K.txt
remote open("/home/jasper_humphrey/user1/8K.txt"): Failure

如果我在 sftp 客戶端上使用 -f 參數,那麼這會在每次傳輸後觸發 fsync,並且不會發生錯誤。從 sftp 手冊頁:

-f      Requests that files be flushed to disk immediately after transfer.  When
        uploading files, this feature is only enabled if the server implements the
        "fsync@openssh.com" extension.

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