關於資料夾內檔案數量與開啟資料夾時間的一項實驗

您是否曾經有過「使用 NAS 時,當資料夾內有大量檔案時,開啟會花很長時間」的經驗呢?

「有哪些檔案、檔案屬性為何」等資訊也是儲存在 NAS 上的資料,當您在客戶端的檔案總管等打開 NAS 資料夾時,會從 NAS 取得資料夾內檔案清單及其基本屬性(如建立日期等)的中繼資料。當檔案數量增加時,檔案名稱等資訊及中繼資料的容量也會變大,因此取得完成所需的時間也會增加,導致檔案總管顯示完成的速度變慢。

這次有客戶詢問「當大量檔案儲存在同一個資料夾時,開啟資料夾需要多少時間?」因此我們思考了如何取得可作為指標的數字,並進行了實驗。

實驗環境

TS-h1290FX

CPU : AMD EPYC™ 7302P 16核心/32執行緒處理器,最高3.3 GHz

Memory : 64GB(因某些原因從預設的128GB減少)

Storage : Samsung MZQLB960HAJR-00007 x4

RAID配置 : RAID5

OS : QuTS hero h5.3.0.3066

備註:TS-h1290FX 兩台 HA 架構

與 Windows 客戶端 HP Z8 G4 以 10GbE SFP+ 連接。

※本次為 High Availability 實驗,TS-h1290FX 兩台組成叢集,但認為對讀取速度沒有影響。

實驗方法

在 NAS 資料夾內大量建立檔案,並以幾種方式測量讀取完成所需時間。

※雖然不是實際從檔案總管開啟操作,但應可看出趨勢。

用於大量檔案生成的腳本

#!/bin/sh

#FILESIZE in MB
FILESIZE=1

if [ "${1}" = "" ] ; then
        exit 1
else
        NumFiles=$1
fi

for i in `seq 1 ${NumFiles}`
do
        echo ${i}
        filename=`printf testfile.%08d ${i}`
        if [ -f "${filename}" ] ; then
                echo "skip ${filename}"
        else
                :
                dd if=/dev/zero of=${filename} bs=1M count=${FILESIZE}
        fi
done

每個檔案為 1MB,依指示數量建立檔案。

重點在「檔案數量」,「檔案大小」則不影響,因此這裡生成的是小檔案。

檔案清單讀取所需時間的測量方法

使用 find 的方法

time find ./ > /dev/null

將輸出丟棄至 /dev/null,純粹測量掃描檔案所需時間。

使用 ls -la 的方法

time ls -la > /dev/null

同樣將輸出丟棄至 /dev/null。

從 Windows 客戶端使用 dir 的方法

echo |time
dir > nul 2>&1
echo |time

從 time 指令的輸出結果差異測量經過時間。

在測量的數字中,這個結果應最接近從檔案總管開啟資料夾所需的時間。

不過,這個數字包含:

透過 SMB 協定取得 NAS 檔案清單時的網路處理時間

・由於客戶端 PC 與 NAS 之間的連接為 10GbE,網路頻寬可能成為瓶頸

・檔案總管顯示時,不包含必要的繪圖相關處理速度

・檔案總管顯示時,檔案清單應會緩衝至記憶體,不包含為容納檔案清單所需的記憶體分配時間

因此,如果客戶端 PC 記憶體不足,必須利用 swap 等方式準備空間來儲存檔案清單時,檔案總管顯示所需時間自然會大幅增加,但這裡的數字不考慮客戶端的情況,請理解。

測量結果

以下為測量結果。(「速度」指的是處理完成所需的「秒數」)

內部處理的 “find”、“ls -la” 在 1,000,000 檔案時,分別於 10 秒、不到 20 秒完成。“find” 只取得檔案名稱,而 “ls -la” 還取得權限等資訊,因此處理較重、所需時間較長。

“dir” 則在 1,000,000 檔案時需要不到 1 分鐘。每個檔案的中繼資料量與 “ls -la” 時差不多(也許還取得 ACL …),推測這個差異來自 SMB 協定的額外負擔。

網路方面,來回的 round trip 也會產生不少時間,因此若啟用 jumbo frame,或採用更高速的連接方式如 25G、100G,時間應會縮短。

僅供參考。

總結

當單一資料夾下檔案數量增加時,檔案總管的反應會變慢。針對這點,我們以 Windows 客戶端的 “dir” 指令進行簡單的定量觀察。

在 1,000,000 檔案時,取得所有檔案清單需不到 1 分鐘,因此建議單一資料夾的檔案數量以 100,000~200,000 為最大值來設計資料夾結構。

此外,這次是在 TS-h1290FX 這款全快閃型號下的確認結果,若是在 TS-464 等入門型號則可能有不同結果。不過即使如此,單一資料夾的檔案數量以 100,000 左右為參考應該比較合適。

希望對您有所幫助。

如果大家也在自己的環境測量並取得結果,歡迎在社群分享。

2個讚