linux性能優化2-內存相關知識

1.Linux內存體系結構
一個進程執行時,Linux內核給其分配一個部份內存區域。進程使用這個內存區域做爲工做區執行必要的操做。
1.1.物理內存和虛擬內存
系統的內存管理是很是複雜的,通常由內核來完成。高效的內存管理對於提高進程的性能相當重要。現代的計算機系統使用分頁(page)技術安全和靈活地管理系統內存。爲了提升效率,計算機系統上的內存由固定大小的chunk組成,被稱爲分頁(page)分頁的大小取決於處理器體系結構,i386和x86_64中的分頁大小是4KB。系統上的物理內存被分紅頁幀(page frame),一個頁幀包含數據的一個分頁。
1)頁幀分配
一個分頁是物理內存或虛擬內存中一組連續線性地址。Linux內核之內存頁爲單位處理內存。一個內存頁一般是4KB大小。當一個進程請求必定數量內存頁的時候,若是有有效的內存頁,Linux內核馬上將它們分配給進程。不然,須要從一些其餘的進程或分頁緩存中獲得。內核知道有多少內存頁是有效的,而且也知道它們在什麼位置。進程是不能直接對物理內存尋址的,取而代之的是,每一個進程都有一個虛擬地址空間。當爲一個進程分配內存時,頁幀的物理地址被映射到進程的虛擬地址。從進程的角度看,它有一個私有的地址空間,它只能看到已經對物理頁幀作了映射的一個虛擬地址。除此以外,這樣還有助於增強進程直接的安全限制和明確界限。
2)虛擬內存尋址佈局
在32位的架構上,單個進程能夠訪問的最大地址空間是4GB,這是因爲32位虛擬地址自己具備的限制。在一個標準的實現中,虛擬地址空間被劃分爲3GB用戶空間和1GB的內核空間。可是在64位的架構上好比x86_64和IA-64中,沒有這樣的限制,每一個進程均可以訪問巨大的地址空間。
1.2.爲何說32位系統只能支持最大4G的物理內存,而64位的系統能夠支持TB級別的內存?
一個進程虛擬地址空間的大小取決於處理器架構。在32位i386系統上,一個進程的虛擬地址空間大小是2的32次方B(4GB),因爲32位i386的系統上的尋址空間是4GB,因此32位系統只能支持最大4G的物理內存;64位x86系統上,理論上支持2的64次方B的尋址空間,因此64位的系統支持更大的物理內存,實際上支持多少內存要看主板能支持多少。
1.3.虛擬內存管理
一個操做系統的物理內存架構對於應用程序和用戶來講一般是隱藏的,由於操做系統能夠將任何物理內存映射到虛擬內存。系統不會給程序分配物理內存,可是它會向Linux內核請求必定大小的虛擬內存,並在虛擬內存中交換獲得的映射。虛擬內存沒必要映射到物理內存,若是你的程序被分配了大量的內存,則有一部分可能被映射到磁盤的swap文件上。應用程序一般不直接向磁盤中寫入數據,而是向高速緩存(cache)或緩衝區(buffer)寫入。當時間片到達時,或者一個文件的大小超出緩衝緩衝時,內核線程會將緩存/緩衝中的數據刷新到磁盤中。與Linux內核處理寫入磁盤系統緊密相關的是Linux內核管理磁盤緩存的方式。其餘操做系統僅分配某一部份內存做爲磁盤緩存,而Linux能夠更有效地處理內存資源。管理虛擬內存的默認配置是:分配全部有效的空閒內存空間做爲磁盤緩存。在一樣的狀況下,Linux也能夠很是有效地處理swap空間。正在使用的swap空間不必定是內存瓶頸,有時候能夠證實Linux如何有效地處理系統資源。
1.4.分頁維護
1)夥伴系統
Linux內核使用一種被稱爲夥伴系統(buddy system)的機制來維護空閒分頁。夥伴系統維護空閒分頁,並嘗試給分頁分區請求分配分頁。它試圖保持內存區域是連續的。若是不考慮分散的小分頁,這可能會致使內存碎片,並會致使更加難以在連續的區域中分配一個很大的分頁,它可能致使低效的內存使用和性能降低。
2)分頁回收
當一個進程請求映射必定數量分頁的時候,若是沒有有效的分頁,Linux內核將嘗試釋放必定數量的分頁(這是以前使用可是如今不在使用且基於某些緣由仍被標記的活躍分頁),而後將這些分頁分配給新請求內存的進程。這個過程被稱爲分頁回收(page reclaiming)。內核線程kswapd和內核函數try_to_free_page()負責分頁回收。kswapd在任務中一般處於可中斷的睡眠狀態,當區域中的空閒分頁低於一個閾值時它被稱爲夥伴系統。基於最近最少使用(Least Recently Used,LRU)原則,它試圖找到候選分頁並將其取出做爲活躍分頁。最近最少使用的分頁首先被釋放。活躍列表和非活躍列表用於維護候選分頁。kswapd掃描活躍列表,並檢查最近使用的分頁,將最近沒有使用的分頁放入非活躍列表能夠經過vmstat -a命令查看活躍和非活躍的內存有多少。
kswapd也遵循另外一個原則。分頁的使用主要有兩個目的:分頁緩存(page cache)和進程地址空間(porcess address space)。分頁緩存是分頁被映射到磁盤上的一個文件。分頁屬於一個進程地址空間,它被用於堆和棧。當kswapd回收分頁的時候,它寧肯縮小分頁緩存也不肯分頁 移出(page out或swap out)進程擁有的分頁。
3)swap
當分頁回收時,在非活躍列表中屬於進程地址空間的候選分頁能夠被分頁移出。交換這種狀況自己不是問題,在其餘操做系統中,交換無非是爲了保證主內存的分配,而Linux使用交換技術可以更加有效的使用空間。虛擬內存由物理內存和磁盤系統或swap分區組成。若是在Linux中虛擬內存管理器發現內存分頁已經被分配,可是大量時間尚未使用完,它會將這個內存分頁移動到swap空間。一些守護進程,好比getty,當系統啓動 時它就啓動,可是不多被使用。看來,更有效的方法是,釋放一個昂貴的主內存分頁並將其移動到swap區。這就是Linux中處理swap分區的方法,若是你發現swap分區被填充了50%,也不用驚慌。swap空間的使用率高並不必定代表內存存在瓶頸。
1.5.爲何阿里雲服務器沒有swap分區?
swap分區或虛擬內存文件,是在系統物理內存不夠用的時候,由系統內存管理程序將那些很長時間沒有操做內存數據,臨時保存到Swap分區虛擬內存文件中,以提升可用內存額度的一種機制。當那些程序要再次從新運行時,會再從Swap分區或虛擬內存文件中恢復以前保存的數據到內存中。 相關操做會致使額外的IO開銷,特別是,若是內存使用率已經很是高,而同時IO性能也不是很好的狀況下,該機制其實會起到相反的效果:不只系統性能提高較小(由於內存使用率已經很是高了),並且因爲頻繁的內存到SWAP的切換操做,會致使產生大量額外的IO操做,致使IO性能進一步下降,最終反而下降了系統整體性能。 同時,爲了保證服務器數據安全性和可靠性,阿里雲ECS雲磁盤使用了分佈式文件系統做爲雲服務器的存儲,對每一份數據都進行了強一致的多份拷貝。可是,該機制在保證用戶數據安全的同時,因爲3倍增漲的IO操做,會致使本地磁盤的存儲性能和IO性能要弱一些。
綜上,爲了不當系統資源不足時進一步下降ECS雲磁盤的IO性能,因此ECS Windows默認沒有啓用虛擬內存,Linux默認未配置SWAP分區。 緩存

相關文章
相關標籤/搜索