天天看點

[核心記憶體] [arm64] 記憶體相關的常用proc接口夥伴系統相關proc接口slab配置設定器相關zone水線相關proc接口ZONE保留記憶體相關proc接口記憶體回收相關proc接口手動釋放記憶體緩存proc接口記憶體規整相關proc接口

文章目錄

  • 夥伴系統相關proc接口
  • slab配置設定器相關
  • zone水線相關proc接口
  • ZONE保留記憶體相關proc接口
  • 記憶體回收相關proc接口
  • 手動釋放記憶體緩存proc接口
  • 記憶體規整相關proc接口

這些proc接口主要在arm64 linux4.9版本作業系統下驗證過.

夥伴系統相關proc接口

cat /proc/pagetypeinfo
           

slab配置設定器相關

/proc/slabinfo:檢視核心中所有slab cache的相關資料資訊

/ # cat /proc/slabinfo
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> >
zswap_entry            0      0    360   22    2 : tunables    0    0    0 : slabdata      0      0      0
sw_flow_stats          0      0    448   18    2 : tunables    0    0    0 : slabdata      0      0      0
		......
		......
		......

dma-kmalloc-64         0      0    368   22    2 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-32         0      0    336   24    2 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-16         0      0    320   25    2 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-8          0      0    312   26    2 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-192        0      0    496   16    2 : tunables    0    0    0 : slabdata      0      0      0
dma-kmalloc-96         0      0    400   20    2 : tunables    0    0    0 : slabdata      0      0      0
kmem_cache_node      213    216    448   18    2 : tunables    0    0    0 : slabdata     12     12      0
kmem_cache           216    224    576   28    4 : tunables    0    0    0 : slabdata      8      8      0

           

zone水線相關proc接口

/proc/sys/vm/min_free_kbytes:
檢視或手動設定min_free_kbytes值,控制zone區域min水線值


/proc/sys/vm/watermark_scale_factor:
該值可以控制zone區域low和highg水線值,會根據zone實際記憶體比例來調節兩個水線值,調節更加靈活
           

ZONE保留記憶體相關proc接口

/proc/sys/vm/lowmem_reserve_ratio:
顯示每個節點低zone區域為高zone區域預留記憶體的比例值

cat /proc/zoneinfo:
能夠檢視各個zone為同節點高端zone預留的記憶體(protection:字段)
           

記憶體回收相關proc接口

/proc/zoneinfo:

可以通過"/proc/zoneinfo"檢視這4種lru連結清單在node的各個zone上的分布
           
/proc/meminfo:

更豐富的資訊則包含在"/proc/meminfo"中,比如"Dirty"表示修改後還沒有write back的頁面,"Writeback"表示正在執行I/O操作進行回寫的頁面,還有就
是系統所有"active"和"inactive"的page cache和anonymous page的統計資料
           
/proc/sys/vm/swappiness:

如果/proc/sys/vm/swappiness的值為0,那麼核心在啟動記憶體回收時,将完全忽略anonymous pages,這将帶來一個好處,就是核心隻需要掃描page cache
對應的inactive list(LRU_ACTIVE_FILE)就可以了,根本不用掃描anonymous pages對應的 inactive list(LRU_ACTIVE_ANON),這樣能極大的節約内
存回收時花在掃描LRU連結清單上的時間。但是,swappiness設定為0隻适用于系統中page cache比較多的場景,如果系統中anonymous pages比page cache多很
多,隻回收page cache的話,可能無法滿足direct relaim或者kswapd的需求。這時本來系統中還有很多anonymous pages可供回收以釋放記憶體,由于
swappiness的限制,核心也許隻有選擇OOM killer了,是以使用者在設定swappiness參數的時候,需要對自己的應用場景和記憶體的使用情況有比較深入的了解,
要不然你可能會困惑:明明available的記憶體還很多啊,為啥老有程序被OOM kill呢。
           
/proc/sys/vm/min_unmapped_ratio:
該proc參數表示每個記憶體節點中最小映射頁占頁總數的百分比。在zone_reclaim_mode模式下,隻有當相關區域的記憶體使用達到這個百分比,才會發生區域内
存回收:
	1.在zone_reclaim_mode設定為4的時候,核心會比較所有的file-backed和匿名映射頁,包括swapcache占用的頁以及tmpfs檔案的總記憶體使用是否超過	
	  這個百分比。
    2.其他設定的情況下,隻比較基于一般檔案的未映射頁,不考慮其他相關頁。
比如在記憶體緊張時觸發快速記憶體回收過程中會進行如下判斷:
	if (node_pagecache_reclaimable(pgdat) > pgdat->min_unmapped_pages) {
		....//進行記憶體回收操作
	}
pgdat->min_unmapped_pages為pgdat節點頁總數乘上/proc/sys/vm/min_unmapped_ratio,若pgdat節點中可回收的page cache頁總數大于pgdat->min_unmapped_pages時,才會對pgdat進行快速記憶體回收,否則跳過快速記憶體回收.
           
/proc/sys/vm/laptop_mode
該參數隻會作用于直接記憶體回收流程
	1. echo 0 > /proc/sys/vm/laptop_mode:允許直接記憶體回收對匿名頁lru連結清單中的頁進行回寫操作,并且允許直接記憶體回收喚醒flush核心線程
	2. echo N > /proc/sys/vm/laptop_mode(N未非0正整數):直接記憶體回收不允許對lru連結清單中匿名頁進行回寫操作
           
/proc/sys/vm/zone_reclaim_mode
該proc參數隻作用于快速記憶體回收流程中。該參數用于控制當一個zone區域的内部記憶體耗盡時,是否能從本地節點内的zone進行快速記憶體回收操作。

zone_reclaim_mode是用來控制記憶體zone回收模式,在記憶體配置設定中,用來管理當一個記憶體區域内部的記憶體耗盡時,是從其内部進行記憶體回收來滿足配置設定還是直接從其它記憶體區域中配置設定記憶體。如在快速記憶體回收流程中:
	1. zone_reclaim_mode = 0 :關閉zone_reclaim模式,就是快速記憶體回收不能從zonelist中的本地zone進行記憶體回收操作,隻能從其他zone或NUMA節		
	                           點回收記憶體.
	2.zone_reclaim_mode = 1 :表示打開zone_reclaim模式,這樣快速記憶體回收隻會發生在本地節點内.
	3.zone_reclaim_mode = 2 :在本地回收記憶體時,可以将cache中的髒資料寫回硬碟,以回收記憶體
	4.zone_reclaim_mode = 4 :在打開zone_reclaim模式的基礎上,記憶體回收過程中允許用swap方式回收記憶體
對于NUMA環境,zone_reclaim_mode參數可能對應用和系統的的性能有較大的影響,預設情況下zone_reclaim模式是關閉。比如運作的應用是一個檔案伺服器或資料庫伺服器,程序對cache速度的依賴度要高于程序本身對記憶體速度的依賴,若打開zone_reclaim模式程序效率會極大降低。是以核心這時更願意讓程序從其他節點去申請使用記憶體,而不願意清理本地的cache。是以當系統中大部分程序的記憶體需求遠遠大于對緩存的需求時,這種場景下系統應盡量地避免記憶體通路跨節點進行,是以需要打開zone_reclaim模式。此時當zone記憶體緊張時,快速記憶體回收會優先回收本地節點的zone區域,能有效避免程序跨節點通路。

若打開zone_reclaim模式,且允許cache中髒資料的回寫操作。此時若某個zone記憶體不滿足水線門檻值,觸發快速記憶體回收,那麼髒資料回寫會導緻該節點上的很多程序的性能受到影響,降低節點程序性能。但是這樣會增加節點間的隔離性,某個節點上程序的性能不會因為另外一個節點上程序記憶體回收導緻性能下架。
           

手動釋放記憶體緩存proc接口

當記憶體緊張時,linux os中使用者可以利用/proc/sys/vm/drop_caches接口對系統緩存進行手動釋放,drop_caches接受以下三種值.

#To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
#To free reclaimable slab objects (includes dentries and inodes):
echo 2 > /proc/sys/vm/drop_caches
#To free slab objects and pagecache:
echo 3 > /proc/sys/vm/drop_caches
           

注意:drop_caches接口是手動釋放緩存,而不是回收緩存.釋放較回收而言是比較輕量級的操作. 當記憶體緊張時,linux可以通過記憶體回收将一些髒頁,正在回寫的頁或被使用者pte映射的頁做相關處理後,回收到夥伴系統.而drop_caches隻能對那些幹淨的,不處在回寫狀态的和未映射使用者pte的檔案緩存頁進行釋放操作,而所謂釋放操作也僅僅是将上述類型的檔案緩存頁從對應的檔案緩存區中移除,并将頁的引用計數設定為1.被drop_caches處理過的頁能夠立馬被釋放到夥伴系統中.(drop_caches記憶體釋放整個處理過程比較輕量級,不涉及髒頁回寫,回寫等待,遷移到夥伴系統等在記憶體回收流程中的複雜操作)

記憶體規整相關proc接口

echo 1 > /proc/sys/vm/compact_memory
&&
echo 1 > /sys/devices/system/node/nodexx/compact
           

繼續閱讀