Lustre I/O性能特點與最佳實踐
文章轉自:http://blog.csdn.net/liuben/article/details/6455736
1 Lustre概述
Lustre
是面向集群的存儲架構,它是基于Linux平臺的開源集群(并行)文件系統,提供與POSIX兼容的文件系統接口。Lustre兩個最大特征是高擴展性和
高性能,能夠支持數萬客戶端系統、PB級存儲容量、數百GB的聚合I/O吞吐量。Lustre是Scale-Out存儲架構,借助強大的橫向擴展能力,通
過增加服務器即可方便擴展系統總存儲容量和性能。Lustre的集群和并行架構,非常適合眾多客戶端并發進行大文件讀寫的場合,但目前對于小文件應用非常
不適用,尤其是海量小文件應用LOSF(Lots Of Small
Files)。Lustre廣泛應用于各種環境,目前部署最多的為高性能計算HPC,世界超級計算機TOP 10中的70%,TOP
30中的50%,TOP 100中的40%均部署了Lustre。另外,Lustre在石油、天然氣、制造、富媒體、金融等行業領域也被大量部署應用。 2 Lustre Stripe Lustre的OST數量可以達到數千,但是出于復雜性、性能、實
際存儲需求等考慮,目前設計實現中將單個文件對象數限制為160個。對于EXT4后端文件系統,單個文件最大可達2TB,因此Lustre單個文件最大可
以達到320TB。那么,Lustre如何在可用OST集合中選擇合適的OST呢?目前有兩種選擇算法,即Round-Robin和隨機加權算法,這兩種
算法調度的依據是,任意兩個OST剩余存儲容量相差是否超過20%的閾值。一般在系統使用之初,直接使用Round-Robin算法以順序輪轉方式選擇
OST,這種算法非常高效。隨著文件數據量的增加,一旦達到20%的閾值,Lustre將啟用隨機加權算法選擇OST。Lustre維護著一個剩余空間的
優先列表,采用隨機算法在此列表中選擇OST,這種算法會產生開銷并影響性能。如果任意兩個OST剩余存儲容量相差重新降到20%閾值之內,則重新啟用
Round-Robin算法選擇OST。Lustre在創建文件時就按照分片模式并采用OST選擇算法,預先創建好文件所需的OST對象。分片模式可以使
用lfs
setstripe進行設置,或者由系統自動選擇缺省模式,文件目錄會自動繼承父目錄的分片模式,但可以進行修改。數據寫入后,文件分片模式就不能修改,
新加入的OST只會參與新創建的文件目錄OST選擇調度。Lustre目前還沒有實現OST存儲空間的自動均衡,需要手工進行數據遷移復制達到均衡的效
果。 Lustre缺省情況下,stripe_count = 1, stripe_size = 1MB,
stripe_offset =
-1,即每個文件僅包含一個OST對象,分片大小為1MB,起始OST由Lustre自動選擇。實際上這種分片模式就是不對文件進行分片存儲,顯然不能滿
足許多應用的存儲需求,實際應用時需要在分析數據特點、網絡環境、訪問行為的基礎上進行適當配置。分片不是越多越好,在滿足存儲需求的前提下,應該使得
OST對象數量盡可能少。應用lustre Stripe時,應該考慮如下因素: 3 Lustre I/O性能特征 (1)寫性能優于讀性能 Lustre系統中通常寫性能會優于讀性能。首先,對于寫操作,客戶端是以異步方式執行的,RPC調用分配以及寫入磁盤順序按到達順序執行,可以實現聚合
寫以提高效率。而對于讀,請求可能以不同的順序來自多個客戶端,需要大量的磁盤seek與read操作,顯著影響吞吐量。其次,目前Lustre沒有實現
OST read
cache,僅僅在客戶端實現了Readahead。這樣的設計也是有充分理由的,每個OST有可能會有大量客戶端并發訪問,如果進行數據預讀,內存消耗
將會非常大,而且這個是不可控制的。Writecache是在客戶端上實現的,內存占用不會太大并且是可控的。再者,對于TCP/IP網絡而言,讀會占用
更多的CPU資源。讀操作,Lustre需要從網絡接口緩存進行數據Copy而獲得所需數據,而寫操作可以通過sendfile或Zero
Copy避免額外的數據復制。</p> (2)大文件性能表現好 (3)小文件性能表現差 4 Lustre小文件優化 Lustre提供了強大的系統監控與控制接口用于進行性能分析與調優,對于小文件I/O,也可以通過調整一些系統參數進行優化。 5 Lustre I/O最佳實踐 6 Lustre深入閱讀
Lustre
采用對象存儲技術,將大文件分片并以類似RAID0的方式分散存儲在多個OST上,一個文件對應多個OST上的對象。Lustre系統中,每個文件對應
MDT上的一個元數據文件,inode以擴展屬性記錄了數據分片布局信息,包括stripe_count(對象數),
stripe_size(分片大小),
stripe_offset(起始OST)以及每個OST對象信息。當客戶數據端訪問文件時,首先從MDS請求文件元數據并獲得分片布局信息
(stripe
layout),然后直接與多個OST同時交互進行并發讀寫。Lustre這種數據分片策略,提高了多用戶訪問的并發度和聚合I/O帶寬,這是
Lustre獲得高性能的主要因素。再者,Stripe還能夠使得Lustre可以存儲超大文件,突破單一OST對文件大小的限制。當然,數據分片策略同
時也會帶來負面影響,比如增加系統負載和數據風險。
(1)提供高帶寬訪問。
Lustre文件分片并存儲于多個OSS,對于單一大文件來說,它可以提供遠大于單一OSS提供的聚合I/O帶寬。在HPC環境中,成百上千的客戶端會同
時并發讀寫同一個文件,當文件很大時,分散與多個OSS能夠獲得非常高的聚合帶寬。Lustre文件系統理論上可以提供2.5
TB/s的帶寬,經過驗證的帶寬達到240
GB/s。當然對于小于1GB的文件來說,分片數量不宜多于4個,更多分片不會帶來更高的性能提升,還會引入額外開銷。對于小文件,文件大小本身可能小于
分片大小,實際上是不作分片,對性能不會有提升。
(2)改善性能。如果聚合的客戶端帶寬超過單個OSS的帶寬,文件分片存儲策略可以充分利用聚合的OSS帶寬,極大提高性能,為應用程序提供高速的數據讀寫訪問。合理的分片數量可以估算,客戶端聚合I/O帶寬除以單個OSS I/O性能即可得到。
(3)提供超大容量文件。
Lustre后端文件系統采用改進的EXT3文件系統(接近于EXT4),單個文件最大為2TB。如果不進行分片,則單個Lustre文件最大只能為
2TB。Lustre目前分片最多可達到160個,因此文件最大可以達到320TB,這是容量是非常大的,基本上可以滿足所有單一文件存儲容量的需求。
(4)提高存儲空間利用率。
當Lustre剩余存儲空間有限時,每個OSS的剩余空間也就更加有限,這時再寫入一個的大文件至單一OSS很大可能會由于空間不足而失敗。采用分片策
略,寫入單個OSS的對象容量會成倍減小,如果OSS數量選擇合適,文件仍然可以寫入Lustre系統。這使得Lustre存儲空間利用更為充分,有效提
高了利用率。
(5)增加負載。Stripe會導致額外的鎖和網絡操作消耗,比如stat,
unlink,雖然這些操作可以并發執行,但仍會對性能產生影響。另外,分片多會造成服務器的開銷。設想這樣一個情形:Lustre中有100個
OSS,100個客戶端,100個文件,每個客戶端訪問一個文件。如果不分片,則每個客戶端僅與一個OSS相互,可以進行順序I/O讀寫。如果每個文件分
成100片,則每個客戶端都需要分別與100個OSS進行相交,并發訪問時,OSS上的磁盤I/O為隨機讀寫。這些都是額外的負載開銷,一定程度上影響性
能。
(6)增加風險。從概率的角度看,多個OSS發生故障的概率要高出單個OSS許多。文件分片存儲于多個
OSS上,一個分片不可用就會導致整個文件不可訪問,即使其他分片仍然是完好的。因此,分片大大增加了數據發生丟失的風險,需要采用適當的措施進行保護,
比如RAID5/6或者Failover。
Lustre的元數據與數據分離、數
據分片策略、數據緩存和網絡設計非常適合大文件順序I/O訪問,大文件應用下性能表現非常好。這些設計著眼于提高數據訪問的并行性,實現極大的聚合I/O
帶寬,這其中關鍵得益于數據分片設計(具體見上面的分析)。另外,后端改進的EXT3文件系統本身也非常適合大文件I/O。
然而,Lustre的設計卻非常不利于小文件I/O,尤其是LOSF(Lots of small
files)。Lustre在讀寫文件前需要與MDS交互,獲得相關屬性和對象位置信息。與本地文件系統相比,增加了一次額外的網絡傳輸和元數據訪問開
銷,這對于小文件I/O而言,開銷是相當大的。對于大量頻繁的小文件讀寫,Lustre客戶端Cache作用會失效,命中率大大降低。如果文件小于物理頁
大小,則還會產生額外的網絡通信量,小文件訪問越頻繁開銷越大,對Lustre總體I/O性能影響就越大。OST后端采用改進的EXT3文件系統,它對小
文件的讀寫性能本身就不好,其元數據訪問效率不高,磁盤尋址延遲和磁盤碎片問題嚴重。這也是大多數磁盤文件系統的缺點,Reiserfs是針對小文件設計
的文件系統,性能表現要好很多。Lustre的設計決定了它對小文件I/O性能表現差,實際I/O帶寬遠低于所提供的最大帶寬。在4個OSS的千兆網絡配
置下,單一客戶端小文件讀寫性能不到4MB/s。
實際上前面已經提到,Lustre并不適合小文件I/O應用,性能表現非常差。因此,建議不要將Lustre應用于LOSF場合。不過,Lustre操作手冊仍然給出了一些針對小文件的優化措施。
(1)通過應用聚合讀寫提高性能,比如對小文件進行Tar,或創建大文件或通過loopback
mount來存儲小文件。小文件系統調用開銷和額外的I/O開銷非常大,應用聚合優化可以顯著提高性能。另外,可以使用多節點、多進程/多線程盡可能通過
聚合來提高I/O帶寬。
(2)應用采用O_DIRECT方式進行直接I/O,讀寫記錄大小設置為4KB,與文件系統保持一致。對輸出文件禁用locking,避免客戶端之間的競爭。
(3)應用程序盡量保證寫連續數據,順序讀寫小文件要明顯優于隨機小文件I/O。
(4)OST采用SSD或更多的磁盤,提高IOPS來改善小文件性能。創建大容量OST,而非多個小容量OST,減少日志、連接等負載。
(5)OST采用RAID 1+0替代RAID 5/6,避免頻繁小文件I/O引起的數據校驗開銷。
(1)禁用所有客戶端LNET debug功能:缺省開啟多種調試信息,sysctl -w lnet.debug=0,減少系統開銷,但發生錯誤時將無LOG可詢。
(2)增加客戶端Dirty Cache大小:lctl set_param osc./*.max_dirty_mb=256,缺省為32MB,增大緩存將提升I/O性能,但數據丟失的風險也隨之增大。
(3)增加RPC并行數量:echo 32 > /proc/fs/lustre/osc/*-OST000*/max_rpcs_in_flight,缺省為8,提升至32將提高數據和元數據性能。不利之處是如果服務器壓力很大,可能反而會影響性能。
(4)控制Lustre striping:lfs setstripe -c 0/1/-1 /path/filename,如果OST對象數大于1,小文件性能會下降,因此將OST對象設置為1。
(5)客戶端考慮使用本地鎖:mount -t lustre -o localflock,如果確定多個進程從同一個客戶端進行寫文件,則可用localflock代替flock,減少發送到MDS的RPC數量。
(6)使用loopback
mount文件:創建大Lustre文件,與loop設備關聯并創建文件系統,然后將其作為文件系統進行mount。小文件作用其上,則原先大量的MDS
元數據操作將轉換為OSS讀寫操作,消除了元數據瓶頸,可以顯著提高小文件性能。這種方法應用于scratch空間可行,但對于生產數據應該謹慎使用,因
為Lustre目前工作在這種模式下還存在問題。操作方法如下:
dd if=/dev/zero of=/mnt/lustre/loopback/scratch bs=1048576 count=1024
losetup /dev/loop0 /mnt/lustre/loopback/scratch
mkfs -t ext4 /dev/loop0
mount /dev/loop0 /mnt/losf
Lustre具有鮮明的I/O特點,并具有非常高的擴展性和大文件I/O性能。如果進行適當的配置和操作,Lustre則會展現更高的性能。下面給出一些Lustre I/O最佳實踐,可根據實際應用情況擇優實踐。
(1)使用單進程讀取完整的共享小文件,需要時傳輸數據至其他進程。
(2)使用單進程訪問容量在(1MB, 1GB)之間的小文件,將文件OST對象數設為1。
(3)使用單進程訪問大于1GB的中等文件,文件OST對象數不超過4個。
(4)遠大于1GB的大文件OST對象數應設為>4,這種文件不要采用順序I/O或file-per-process的I/O訪問模式。
(5)限制單個目錄下的文件數量,包含大量小文件的目錄stripe_count設置為1。
(6)小文件存放在單一OST上,單進程文件創建和讀寫性能會得到提高。
(7)包含大量小文件的目錄存放在單一OST上,文件創建性能會提到極大提升。
(8)盡量避免頻繁地打開和關閉文件。
(9)僅在必要時使用ls -l,它會與所有相關的OST交互,操作代價很大,盡可能使用ls和lfs find代替。
(10)考慮使用I/O中間件來改善性能,如ADIOS、HDF5、MPI-IO。
[1] Luster: http://www.lustre.org
[2] Lustre 2.0 Operations Manual http://wiki.lustre.org/manual/LustreManual20_HTML/index.html
[3] Understanding Lustre Internals http://wiki.lustre.org/images/d/da/Understanding_Lustre_Filesystem_Internals.pdf
[4] Lustre Architecture ftp://ftp.uni-duisburg.de/Linux/filesys/Lustre/lustre.pdf
[5] Lustre White Paper http://www.raidinc.com/pdf/whitepapers/lustrefilesystem_wp.pdf
[6] Lustre Sources: https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_SMI-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=LUSTRE-