底層存儲
通常情況下,文件讀寫比較慢。但依賴五星云站的底層存儲設計,在對文件進行順序讀寫時,速度幾乎達到或接近于內(nèi)存的隨機讀寫。
當OS發(fā)現(xiàn)系統(tǒng)的物理內(nèi)存有大量剩余時,為了提高IO的性能,就會使用多余的內(nèi)存當做文件緩存。
OS在讀磁盤時會將當前區(qū)域的內(nèi)容全部讀到Cache中,以便下次讀時能命中Cache,寫磁盤時直接寫到Cache中就寫返回,由OS的pdflush以某些策略將Cache的數(shù)據(jù)Flush回磁盤。
但是系統(tǒng)上文件非常多,即使是多余的Page Cache也是非常寶貴的資源,OS不可能將Page Cache隨機分配給任何文件,Linux底層就提供了mmap將一個程序指定的文件映射進虛擬內(nèi)存(Virtual Memory),對文件的讀寫就變成了對內(nèi)存的讀寫,能充分利用Page Cache。不過,文件IO僅僅用到了Page Cache還是不夠的,如果對文件進行隨機讀寫,會使虛擬內(nèi)存產(chǎn)生很多缺頁(Page Fault)中斷。
每個用戶空間的進程都有自己的虛擬內(nèi)存,每個進程都認為自己所有的物理內(nèi)存,但虛擬內(nèi)存只是邏輯上的內(nèi)存,要想訪問內(nèi)存的數(shù)據(jù),還得通過內(nèi)存管理單元(MMU)查找頁表,將虛擬內(nèi)存映射成物理內(nèi)存。如果映射的文件非常大,程序訪問局部映射不到物理內(nèi)存的虛擬內(nèi)存時,產(chǎn)生缺頁中斷,OS需要讀寫磁盤文件的真實數(shù)據(jù)再加載到內(nèi)存。如同我們的應用程序沒有Cache住某塊數(shù)據(jù),直接訪問數(shù)據(jù)庫要數(shù)據(jù)再把結果寫到Cache一樣,這個過程相對而言是非常慢的。
但是順序IO時,讀和寫的區(qū)域都是被OS智能Cache過的熱點區(qū)域,不會產(chǎn)生大量缺頁中斷,文件的IO幾乎等同于內(nèi)存的IO,