本文介紹NAS SMB/NFS協議文件系統性能相關的常見問題及解決方案。
NAS的性能與存儲容量之間的關系是什么?
NAS的性能與目錄大小之間的關系是什么?
在執行目錄遍歷操作時,以下情況可能導致響應速度變慢:
目錄正在被修改:例如,創建、刪除或重命名文件時,緩存可能頻繁失效。
目錄體量過大:對大目錄執行目錄遍歷操作時,由于緩存淘汰導致響應非常慢。
解決方案:
避免目錄體量過大,控制單目錄下文件數量小于1萬個。
執行目錄遍歷操作時,不要頻繁對目錄進行修改。
對于大目錄遍歷,若不需頻繁修改,可考慮使用NFS v3協議掛載并添加nordirplus參數,以提升效率,請您驗證后使用。
掛載參數對NAS性能有什么影響?
掛載參數對NAS性能有顯著的影響,以下是掛載參數對性能的具體影響:
rsize 和 wsize:
影響:這兩個參數定義了客戶端與服務器之間數據交換的塊大小。較大的塊大小可以減少網絡請求的次數,進而提高吞吐量,特別是在處理大文件時。
建議值:1048576(1 MB)。建議您盡可能使用最大值。較小的塊大小可能導致更多的網絡開銷,從而降低性能。
hard:
影響:啟用該選項后,如果文件存儲NAS不可用,客戶端會不斷重試請求,直到文件系統恢復。這確保了數據的完整性和一致性。
建議:啟用。該參數有助于避免數據丟失,但可能導致應用程序暫時掛起。因此,適用于對可用性要求較高的場景。
timeo:
影響:這個參數定義了客戶端在重試之前的等待響應時間。設置過短的超時可能會導致頻繁請求重試,從而降低性能,尤其是在網絡不穩定的情況下。
建議值:600(60秒)。以確保網絡有足夠的時間恢復,從而減少重試次數。
retrans:
影響:該參數定義了NFS客戶端在請求失敗后重試的次數。更高的重試次數可以增加成功請求的可能性,但也可能導致延遲。
建議值:2。平衡性能與數據可靠性。
noresvport:
影響:啟用該選項后,網絡重連時將使用新的TCP端口,從而確保在網絡故障恢復期間不會中斷連接。以提高網絡的可靠性。
建議:啟用。該參數保障網絡連接的穩定性。
不建議使用soft選項,有數據一致性風險。如果您要使用soft選項,相關風險需由您自行承擔。
避免設置不同于默認值的任何其他掛載選項。如果更改讀或寫緩沖區大小或禁用屬性緩存,可能會導致性能下降。
云服務器ECS實例的帶寬對NAS性能有何限制?
吞吐量最大不會超過ECS內網帶寬,如果內網帶寬太小,則吞吐量會受到流量控制。
讀寫吞吐超過閾值會有什么影響?
如果您或應用程序發出的請求吞吐量超過閾值時,NAS會自動對該請求限速,進而導致延遲增高。
通用型NAS可以通過Truncate命令提升吞吐閾值。具體操作,請參見如何提升通用型NAS文件系統的讀寫吞吐閾值? 。
極速型NAS可以通過擴容文件系統提升吞吐閾值。具體操作,請參見極速型NAS擴容。
關于通用型NAS文件系統和極速型NAS文件系統的吞吐閾值,請參見通用型NAS性能指標和極速型NAS性能指標。
如何提升通用型NAS文件系統的讀寫吞吐閾值?
通用型NAS文件系統的讀寫吞吐量隨文件系統的使用容量線性增長。文件系統讀寫吞吐與使用容量的關系,請參見通用型NAS產品規格。
通過在文件系統寫入空洞文件或使用Truncate命令生成一個文件來增加文件系統使用容量,從而提升文件系統的讀寫吞吐量。同時,空洞文件和Truncate命令生成的文件在阿里云NAS上占用實際容量,按實際大小計費。更多信息,請參見通用型NAS計費。
例如在容量型文件系統寫入1 TiB文件,其讀寫吞吐量可提升150 MB/s;在性能型文件系統寫入1 TiB文件,其讀寫吞吐量可提升600 MB/s。
Linux
支持使用Truncate命令生成文件提升讀寫吞吐。
sudo truncate --size=1TB /mnt/sparse_file.txt
其中,/mnt為文件系統在計算節點上的掛載路徑。
Windows
支持通過在文件系統寫入空洞文件提升讀寫吞吐。
fsutil file createnew Z:\sparse_file.txt 1099511627776
其中,Z:\為文件系統在計算節點上的掛載路徑。
如何解決Linux操作系統上訪問NAS性能不好?
方案一:通過nconnect參數提升單臺ECS訪問NAS的吞吐
nconnect
參數是NFS客戶端Linux掛載選項,通過在客戶端和服務器之間建立更多的TCP傳輸連接來提高吞吐性能。經過測試,使用nconnect
參數可以將單ECS訪問NAS的吞吐提升3倍~6倍,達到3 GB/s。適用場景
單ECS上多并發I/O讀寫(并發大于16)。
前提條件
Linux內核版本需5.3及以上版本。
操作步驟
在
mount
命令中增加nconnect
參數,建議nconnect=4
,命令示例如下。sudo mount -t nfs -o vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,nconnect=4
重要nconnect提高的是單個ECS訪問NAS的吞吐能力,并不會提高NAS文件系統自身的吞吐閾值。對于單并發,小數據塊,延遲敏感型業務,開啟nconnect會引起延遲增加,不建議開啟。
方案二:通過修改sunrpc.tcp_slot_table_entries提升單臺ECS訪問NAS的吞吐
Linux kernel中
sunrpc
決定了NFS單個鏈接內的通信slot數量。不同的Linux版本采用了不同的配置。slot配置過高可能引起延遲增加,配置過低會引起吞吐不足。當您需要大吞吐時,建議slot配置為128。需要較低延遲時,slot配置為16及以下。說明調整
sunrpc.tcp_slot_table_entries
的配置效果遠差于nconnect
。建議5.3及以上內核操作系統使用nconnect
參數進行調節。適用場景
單ECS上多并發I/O讀寫,且內核版本低于3.10。
操作步驟
為什么使用Nginx寫日志到文件系統耗時很長?
背景信息:
與Nginx日志相關的指令有兩條。log_format用來設置日志的格式,access_log用來指定日志文件的存放路徑、格式的名稱和緩存大小。
問題描述:
Nginx寫日志到文件系統耗時很長,寫入性能差。
問題原因:
access_log指令中的日志文件路徑包含變量,每次寫日志時都會重新打開文件,再寫入日志,然后關閉文件。NAS為了保證數據的可見性,會在關閉文件時將數據寫回服務端,性能消耗較大。
解決方案:
方案一:刪除access_log指令中的變量,使用固定路徑存儲日志文件。
方案二:使用open_log_file_cache指令設置經常被使用的日志文件描述符緩存,提高包含變量的日志文件存放路徑的性能。具體配置,請參見open_log_file_cache。
建議配置:
open_log_file_cache max=1000 inactive=1m valid=3m min_uses=2;
為什么SMB協議文件系統執行IO操作會延遲?
問題描述:
通過掛載點直接訪問SMB協議文件系統,在執行IO操作會有幾分鐘的等待時間。
問題原因:
安裝了NFS客戶端,實際業務不使用,產生等待時間。
啟用了WebClient服務,導致Internet文件服務器登錄SMB協議文件系統失敗。
注冊表配置項中包含了NFS權限
Nfsnp
,導致打開文件失敗。
解決方案:
首次訪問SMB文件系統時,請ping掛載點,查看計算節點和文件系統連通性,以及時延是否在正常范圍。
如果執行ping命令失敗,請檢查您的網絡設置,確保網絡連接正常。
如果延時較長,請ping掛載IP。當ping IP比ping DNS延時小很多,判斷可能是DNS問題,請檢查您的DNS服務器配置。
如果已安裝NFS客戶端,且用不到NFS服務,請刪除NFS客戶端。
禁用WebClient服務。
查看注冊表配置項HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\NetworkProvider\Order\ProviderOrder,如果注冊值包含
Nfsnp
,請刪除Nfsnp
,然后重啟實例。
您可以使用fio工具,查看性能指標是否異常。
fio.exe --name=./iotest1 --direct=1 --rwmixread=0 --rw=write --bs=4K --numjobs=1 --thread --iodepth=128 --runtime=300 --group_reporting --size=5G --verify=md5 --randrepeat=0 --norandommap --refill_buffers --filename=\\<mount point dns>\myshare\testfio1
建議您使用大數據塊進行IO讀寫操作,如果數據塊較小,會消耗更多的網絡資源。如果不能修改數據塊大小,可以通過構造BufferedOutputStream,將具有指定緩沖區大小的數據寫入。
為什么Windows server SMB協議IO操作會延遲?
問題原因:
Windows SMB客戶端默認不開啟
large mtu
選項,因此影響IO性能的提升。解決方案:
您可以通過修改注冊表配置項來開啟
large mtu
選項,注冊表路徑:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters在該路徑下,增加
DWORD
類型的鍵,命名為DisableLargeMtu,設置其值為0
,重啟后才能生效。
如何提升IIS訪問NAS的性能?
問題原因:
IIS采用NAS Share的方式訪問NAS,在訪問一個文件時,IIS后臺會多次訪問NAS。不同于訪問本地文件系統,每次訪問NAS至少要有一次網絡交互,雖然每次訪問的時長很短,但是多次訪問時長疊加可能會造成客戶端響應總時間較長。
解決方案:
請您使用SMB重定向器組件,進行優化。具體操作,請參見SMB2 Client Redirector Caches Explained。
其中,注冊表路徑為HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanWorkstation\Parameters。請將如下三個配置項調至600及以上。
FileInfoCacheLifetime
FileNotFoundCacheLifetime
DirectoryCacheLifetime
說明如果三個注冊表配置項都不存在:
請確認使用的是SMB文件系統。
確認Windows版本是否支持這三個注冊表項配置項。如果Windows版本支持而注冊表配置項不存在,請手動創建。具體操作,請參見Performance tuning for file servers。
建議把IIS訪問頻繁的JS/CSS等網頁程序相關的內容存放在本地。
如果當前IIS讀寫性能無法滿足您的業務需求,請提交工單處理。
為什么執行ls命令時,有卡頓或者無響應?
問題現象
在執行目錄遍歷的操作中出現卡頓或無響應。例如,執行ls命令、包含通配符
*
?
的操作、執行rm -rf
命令及getdents系統調用等。原因分析
執行目錄遍歷操作時,如果此目錄同時正在被修改(如創建、刪除、重命名文件),目錄遍歷會由于緩存頻繁失效而響應非常慢。
對大目錄執行目錄遍歷操作時,目錄遍歷會由于緩存淘汰而響應非常慢。
解決方案
避免目錄體量過大,控制單目錄下文件數量小于1萬個。
執行目錄遍歷操作時,不要頻繁對目錄進行修改。
執行目錄遍歷操作時,如果目標目錄體量較大(包含大于1萬個文件),且不需要頻繁修改目錄,您可以通過NFSv3掛載,并添加nordirplus參數,該措施能在一定程度上提速,請您驗證后使用。更多信息,請參見掛載參數。
如何提升Linux 5.4及以上版本內核的NFS順序讀取性能?
NFS read_ahead_kb
參數定義了Linux內核在順序讀取操作期間要提前讀取或預取的數據大小(以KB為單位)。
對于5.4.*
之前的Linux內核版本,read_ahead_kb
參數的值是通過NFS_MAX_READAHEAD
乘以rsize
(在掛載選項中設置的客戶端讀取數據大小)的值來設置的。從Linux內核版本5.4.*
開始,NFS客戶端使用默認的read_ahead_kb
值128 KB。因此建議使用推薦的掛載選項時,read_ahead_kb
參數的值增加到15 MB。
掛載文件系統后,可以使用以下命令重置read_ahead_kb
參數值。其中,nas-mount-point
請替換為掛載文件系統的本地路徑;read-ahead-kb
請替換為所需的讀取或預取的數據大小(以KB為單位)。
device_number=$(stat -c '%d' nas-mount-point)
((major = ($device_number & 0xFFF00) >> 8))
((minor = ($device_number & 0xFF) | (($device_number >> 12) & 0xFFF00)))
sudo bash -c "echo read-ahead-kb > /sys/class/bdi/$major:$minor/read_ahead_kb"
以下命令以掛載文件系統的本地路徑為/mnt
為例,將read_ahead_kb
的讀取或預取數據大小設置為15 MB。
device_number=$(stat -c '%d' /mnt)
((major = ($device_number & 0xFFF00) >> 8))
((minor = ($device_number & 0xFF) | (($device_number >> 12) & 0xFFF00)))
sudo bash -c "echo 15000 > /sys/class/bdi/$major:$minor/read_ahead_kb"