成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux 內存管理的水位控制

系統 Linux
在講分區頁框分配器分配內存的時候,進入伙伴算法前用函數zone_watermark_fast(),來根據水位來判斷當前內存情況。內存夠的話采用伙伴算法分配,不夠的話通過 node_reclaim 回收內存。

[[401801]]

本文轉載自微信公眾號「人人都是極客」,作者布道師Peter 。轉載本文請聯系人人都是極客公眾號。

分區頁框分配器之水位

在講分區頁框分配器分配內存的時候,進入伙伴算法前用函數zone_watermark_fast(),來根據水位來判斷當前內存情況。內存夠的話采用伙伴算法分配,不夠的話通過 node_reclaim 回收內存。

水位的初始化

先看下水位的初始化:

  1. int __meminit init_per_zone_wmark_min(void) 
  2.         unsigned long lowmem_kbytes; 
  3.         int new_min_free_kbytes; 
  4.  
  5.         lowmem_kbytes = nr_free_buffer_pages() * (PAGE_SIZE >> 10);      ------ (1)   
  6.         new_min_free_kbytes = int_sqrt(lowmem_kbytes * 16); 
  7.  
  8.         if (new_min_free_kbytes > user_min_free_kbytes) { 
  9.                 min_free_kbytes = new_min_free_kbytes;                   ------ (2) 
  10.                 if (min_free_kbytes < 128) 
  11.                         min_free_kbytes = 128; 
  12.                 if (min_free_kbytes > 65536) 
  13.                         min_free_kbytes = 65536; 
  14.         } else { 
  15.                 pr_warn("min_free_kbytes is not updated to %d because user defined value %d is preferred\n"
  16.                                 new_min_free_kbytes, user_min_free_kbytes); 
  17.         } 
  18.         setup_per_zone_wmarks();                                         ------ (3) 
  19.         refresh_zone_stat_thresholds(); 
  20.         setup_per_zone_lowmem_reserve();                                 ------ (4) 
  21.  
  22. #ifdef CONFIG_NUMA 
  23.         setup_min_unmapped_ratio(); 
  24.         setup_min_slab_ratio(); 
  25. #endif 
  26.  
  27.         return 0; 
  28. core_initcall(init_per_zone_wmark_min) 

(1). nr_free_buffer_pages 是獲取ZONE_DMA和ZONE_NORMAL區中高于high水位的總頁數nr_free_buffer_pages = managed_pages - high_pages

(2). min_free_kbytes 是總的min大小,min_free_kbytes = 4 * sqrt(lowmem_kbytes)

(3). setup_per_zone_wmarks 根據總的min值,再加上各個zone在總內存中的占比,然后通過do_div就計算出他們各自的min值,進而計算出各個zone的水位大小。min,low,high的關系:low = min *125%,high = min * 150%。min,low,high之間的比例關系與 watermark_scale_factor 相關。可以通過 /proc/sys/vm/watermark_scale_factor 設置

(4). setup_per_zone_lowmem_reserve 設置每個zone的lowmem_reserve大小。lowmem_reserve值可以通過 /proc/sys/vm/lowmem_reserve_ratio 來修改。

為什么需要設置每個zone的保留內存呢,lowmem_reserve的作用是什么?

我們知道內核在分配內存時,會按照 HIGHMEM->NORMAL->DMA 的方向進行遍歷,如果當前Zone分配失敗,就會嘗試下一個低級的Zone。我們可以想像應用進程通過內存映射申請 HIGHMEM,如果此時HIGHMEM Zone無法滿足分配,則會嘗試從 NORMAL 進行分配。這就有一個問題,來自 HIGHMEM Zone 的請求可能會耗盡 NORMAL Zone 的內存,最終的結果就是 NORMAL Zone 無內存提供給內核的正常分配。

因此針對這個場景,可以通過保留內存 lowmem_reserve[NORMAL] 給 NORMAL Zone 自己使用。

同樣當從NORMAL Zone失敗后,會嘗試從zonelist中的DMA Zone申請,通過lowmem_reserve[DMA],限制來自HIGHMEM和NORMAL的分配請求。

  1. $ cat /proc/sys/vm/lowmem_reserve_ratio 
  2. 256     32      
  1. $ cat /proc/zoneinfo 
  2. Node 0, zone    DMA32 
  3.     ...... 
  4.     pages free     361678 
  5.         min      674 
  6.         low      2874 
  7.         high     3314 
  8.         spanned  523776 
  9.         present  496128 
  10.         managed  440432 
  11.         protection: (0, 3998, 3998) 
  12.     ...... 
  13. Node 0, zone   Normal 
  14.     pages free     706981 
  15.         min      1568 
  16.         low      6681 
  17.         high     7704 
  18.         spanned  8912896 
  19.         present  1048576 
  20.         managed  1023570 
  21.         protection: (0, 0, 0) 
  22.     ...... 
  23. Node 0, zone  Movable 
  24.   pages free     0 
  25.         min      0 
  26.         low      0 
  27.         high     0 
  28.         spanned  0 
  29.         present  0 
  30.         managed  0 
  31.         protection: (0, 0, 0) 
  • spanned:表示當前zone所包含的所有的pages
  • present:表示當前zone在去掉第一階段kernel reserve的內存之后剩下的pages
  • managed:表示當前zone去掉初始化完成以后所有的kernel reserve的內存剩下的pages

結合上面arm64平臺的數值舉個例子,假設這2個Zones分別包含440432, 1023570個pages(實際是/proc/zoneinfo里字段managed的值)。如下圖所示,使用每個區域的 managed pages 和 lowmem_reserve_ratio 計算每個區域的lowmem_reserve值,可以看出結果和protection值一樣。

水位的判斷

從這張圖可以看出:

 

  • 如果空閑頁數目min值,則該zone非常缺頁,頁面回收壓力很大,應用程序寫內存操作就會被阻塞,直接在應用程序的進程上下文中進行回收,即direct reclaim。
  • 如果空閑頁數目小于low值,kswapd線程將被喚醒。默認情況下,low值為min值的125%,可以通過修改watermark_scale_factor來改變比例值
  • 如果空閑頁面的值大于high值,kswapd線程將睡眠。默認情況下,high值為min值的150%,可以通過修改watermark_scale_factor來改變比例值

 

責任編輯:武曉燕 來源: 人人都是極客
相關推薦

2013-10-11 17:32:18

Linux運維內存管理

2009-12-25 15:24:16

內存管理

2020-07-28 08:10:33

Linux內存虛擬

2021-03-17 21:34:44

Linux內存管理

2023-10-18 13:31:00

Linux內存

2009-10-20 16:35:26

Linux內存管理

2022-08-08 08:31:00

Linux內存管理

2017-05-18 16:30:29

Linux內存管理

2009-08-17 08:32:56

Linux操作系統內存管理Linux

2023-07-06 00:45:05

Linux保護模式

2009-12-25 17:15:03

Linux內存

2020-04-08 09:20:25

Linux內存系統

2020-06-28 09:30:37

Linux內存操作系統

2018-08-09 16:32:49

內存管理框架

2022-02-11 07:45:10

Linuxsmem系統

2024-05-06 08:09:10

Linux內存管理

2013-09-29 15:11:46

Linux運維內存管理

2013-10-12 13:01:51

Linux運維內存管理

2025-03-26 00:00:05

2025-01-02 11:06:22

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美区精品 | 成人精品鲁一区一区二区 | 久草精品视频 | 综合久久久 | 热99视频| 天堂综合网| 国产视频第一页 | 亚洲永久 | 精品亚洲一区二区 | 一区二区成人 | 国产精品视频一 | 日韩精品视频在线观看一区二区三区 | 久久久精品一区 | 最新国产在线 | 天天天操天天天干 | 国产成人精品在线播放 | 国产成人一区二区三区 | 国产免费观看视频 | 毛片网络| 久久国产成人 | 视频一区二区在线观看 | 中文字幕一区二区三区在线乱码 | 久久久久久久久久性 | 成人免费在线视频 | 在线第一页 | 精品欧美一区二区三区久久久 | 亚洲精品天堂 | 91精品国产日韩91久久久久久 | 天天曰天天曰 | 少妇一级淫片aaaaaaaaa | 99爱在线观看 | 久久香蕉精品视频 | 国产精品美女视频 | 亚洲一区二区 | 91精品国产综合久久精品 | 国产最新视频在线 | 岛国av免费观看 | 黄色大片免费网站 | 偷拍亚洲色图 | av网站免费 | 一区二区三区视频在线观看 |