增加 NFS 伺服器上的記憶體使用率
我正在生成最終通過 NFS v4.2 在 10Gb 網路上複製到伺服器的數據(100GB 文件)。這些文件儲存在許多 HDD 上,採用 XFS 格式(每個目標驅動器一個副本)。
當複制任務正在執行時:
- 客戶端記憶體使用量很大(可能超過 64GB,它需要盡可能多的記憶體)。
- 但是伺服器上幾乎沒有使用記憶體。
我想減少客戶端的記憶體使用量,因為它們會不斷產生數據並且會減慢它們的速度。相反,伺服器主要是未使用的。
我想由於伺服器上的 HDD 速度很慢,客戶端會緩衝盡可能多的數據以減少副本阻塞。我無法更改硬體設置。
有沒有辦法強制伺服器記憶體更多數據? 我寧願優先使用伺服器記憶體而不是客戶端記憶體。
NFS 配置:
10.0.3.1:/ /mnt/field nfs nfsvers=4.2,noatime,nodiratime,_netdev,noauto,x-systemd.automount,x-systemd.mount-timeout=10 0 0
/etc/exports
:/mnt 10.0.0.0/16(rw,async,fsid=0,no_subtree_check,crossmnt)
伺服器上的網卡配置:
MTU 9000 rinbuffer tx 512, rx 1024
客戶端網卡配置:
MTU 9000 rinbuffer tx 1024, rx 512
編輯: 根據要求,/proc/meminfo:
客戶端伺服器 - - - ————————-
此客戶端上的記憶體使用情況的監視器:
網路使用:
注意:客戶端使用大 tmpfs (100GB) 來計算。我認為這個 tmpfs 永遠不會從可用記憶體計數中減去。
編輯2:
網路和記憶體使用之間的相關性在另一個客戶端上更為明顯(我應該從那個開始)。此客戶端不使用任何 tmpfs。
我想減少客戶端的記憶體使用量,因為它們會不斷產生數據並且會減慢它們的速度。
你怎麼會知道這事?大多數客戶端記憶體都在頁面記憶體中,這是完全正常的,即使改進伺服器上的緩衝也不會阻止該數據客戶端的積極記憶體。
您是否嘗試過刷新頁面記憶體(作為測試)並查看您的應用程序在不使用頁面記憶體的情況下如何執行?
NFS 具有所謂的“接近打開”一致性,這意味著數據和元數據的內容只有在您沒有主動打開文件時才能真正保證穩定(也就是說,另一個客戶端可以在另一個客戶端上更改文件)系統,你不會更聰明)。
由於這種一致性限制,NFS 客戶端系統應用程序依賴頁面記憶體來確保數據可用於在必要時進行回讀。
/etc/exports
話雖如此,但在不知道將更多數據解除安裝到伺服器的一種方法中發生了什麼的情況下,可能是確保您使用sync
mount 選項在客戶端上安裝 NFS,並在伺服器上使用 mount 選項導出路徑async
。這將確保在客戶端將寫入送出到伺服器,而伺服器將始終在將數據送出到磁碟之前回复“完成”。
這將影響客戶端的吞吐量,因為您會由於驗證客戶端上的每個請求而導致延遲,但是伺服器將緩衝更多的數據,因為它不會等待數據首先降落在磁碟上。您可能還想
dirty_write_centisecs
在伺服器上旋轉和其他位,以允許它緩衝更多數據到寫回中。不過問題就在這裡——這可能會導致客戶端速度變慢,並在崩潰時降低伺服器的完整性。如果伺服器崩潰,您可能會失去數據。
此外,這不會影響 NFS 無法真正控制的客戶端上頁面記憶體的記憶體使用。
總而言之,我懷疑減少客戶端記憶體使用量(如果它是您在此處測量的頁面記憶體)將提高您的客戶端性能。