1. 程式人生 > >linux性能優化2-內存相關知識

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

如何 pac 物理內存 1.5 頁緩存 64位 linux性能 多少 1.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分區。

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