天天看點

【Linux 核心 記憶體管理】分區夥伴配置設定器 ⑥ ( zone 結構體中水線控制相關成員 | 在 Ubuntu 中檢視記憶體區域水位線 )

文章目錄

  • ​​一、zone 結構體中水線控制相關成員 ( managed_pages | spanned_pages | present_pages )​​
  • ​​二、在 Ubuntu 中檢視記憶體區域水位線​​

上一篇部落格 【Linux 核心 記憶體管理】分區夥伴配置設定器 ⑤ ( 區域水線 | 區域水線資料結構 zone_watermarks 枚舉 | 記憶體區域 zone 中的區域水線 watermark 成員 ) 中講解了 區域水線概念 , 本篇部落格中開始分析 根據水線 進行 水位控制 的機制 ;

​WMARK_HIGH​

​​ 高水位 , ​

​WMARK_LOW​

​​ 低水位 , ​

​WMARK_MIN​

​​ 最低水位 , 個水位線 , 将 " 記憶體區域 " 分割成 部分 ;

enum zone_watermarks {
  WMARK_MIN,
  WMARK_LOW,
  WMARK_HIGH,
  NR_WMARK
};

#define min_wmark_pages(z) (z->watermark[WMARK_MIN])
#define low_wmark_pages(z) (z->watermark[WMARK_LOW])
#define high_wmark_pages(z) (z->watermark[WMARK_HIGH])      

源碼路徑 : linux-4.12\include\linux\mmzone.h#255

【Linux 核心 記憶體管理】分區夥伴配置設定器 ⑥ ( zone 結構體中水線控制相關成員 | 在 Ubuntu 中檢視記憶體區域水位線 )

一、zone 結構體中水線控制相關成員 ( managed_pages | spanned_pages | present_pages )

在 linux 核心源碼中 描述 " 記憶體區域 " 的結構體 ​

​struct zone​

​ 中 , 有幾個重要的參數 , 用于 控制 區域水線水位 :

​managed_pages​

​ 成員 表示 夥伴配置設定器 管理的 實體頁個數 ; 使用 如下 公式進行計算 :

​spanned_pages​

​ 成員 表示 記憶體區域 的 所有可用實體頁 個數 , 包括 記憶體空洞 ; 使用 如下 公式進行計算 :

​present_pages​

​ 成員 表示 目前 記憶體區域 的 實體頁個數 , 不包括 記憶體空洞 ; 是通過 夥伴配置設定器 管理的 實體頁 ; 使用 如下 公式進行計算 :

​present_pages​

​​、 ​

​spanned_pages​

​​、 ​

​managed_pages​

​ 三者之間有如下關系 :

​spanned_pages​

​ ( 記憶體區域所有可用實體頁數 有空洞 ) >

​present_pages​

​ ( 目前區域實體頁數 無空洞 ) >

​managed_pages​

​ ( 夥伴配置設定器管理的實體頁數 )

參考 【Linux 核心 記憶體管理】實體記憶體組織結構 ④ ( 記憶體區域 zone 簡介 | zone 結構體源碼分析 | zone 結構體源碼 ) 部落格 ;

​struct zone​

​ 結構體相關源碼 :

struct zone {
  /* Read-mostly fields */

  /* zone watermarks, access with *_wmark_pages(zone) macros */
  unsigned long watermark[NR_WMARK];
  ...
  
  unsigned long   managed_pages;
  unsigned long   spanned_pages;
  unsigned long   present_pages;
  ...
}      

源碼路徑 : linux-4.12\include\linux\mmzone.h#427

【Linux 核心 記憶體管理】分區夥伴配置設定器 ⑥ ( zone 結構體中水線控制相關成員 | 在 Ubuntu 中檢視記憶體區域水位線 )

二、在 Ubuntu 中檢視記憶體區域水位線

在 Ubuntu 的 指令行 中 , 執行

cat /proc/zoneinfo      

指令 , 檢視 " 記憶體區域 " 資訊 ;

輸出内容中 , 其中 Normal 區域的資訊如下 :

Node 0, zone   Normal
  pages free     5754
        min      4615
        low      5768
        high     6921
        spanned  262144
        present  262144
        managed  236760
        protection: (0, 0, 0, 0, 0)      

DMA32 區域的資訊如下 :

Node 0, zone    DMA32
  pages free     43834
        min      12202
        low      15252
        high     18302
        spanned  1044480
        present  782288
        managed  759709
        protection: (0, 0, 924, 924, 924)      

DMA 區域的資訊如下 :

Node 0, zone      DMA
  per-node stats
      nr_inactive_anon 10820
      nr_active_anon 320858
      nr_inactive_file 231022
      nr_active_file 234555
      nr_unevictable 16
      nr_slab_reclaimable 44884
      nr_slab_unreclaimable 18674
      nr_isolated_anon 0
      nr_isolated_file 0      

輸出完整内容 :

han@ubuntu:~$ cat /proc/zoneinfo
Node 0, zone      DMA
  per-node stats
      nr_inactive_anon 10820
      nr_active_anon 320858
      nr_inactive_file 231022
      nr_active_file 234555
      nr_unevictable 16
      nr_slab_reclaimable 44884
      nr_slab_unreclaimable 18674
      nr_isolated_anon 0
      nr_isolated_file 0
      workingset_nodes 0
      workingset_refault 0
      workingset_activate 0
      workingset_restore 0
      workingset_nodereclaim 0
      nr_anon_pages 320578
      nr_mapped    153680
      nr_file_pages 476705
      nr_dirty     26878
      nr_writeback 0
      nr_writeback_temp 0
      nr_shmem     11129
      nr_shmem_hugepages 0
      nr_shmem_pmdmapped 0
      nr_file_hugepages 0
      nr_file_pmdmapped 0
      nr_anon_transparent_hugepages 0
      nr_unstable  0
      nr_vmscan_write 0
      nr_vmscan_immediate_reclaim 0
      nr_dirtied   287542
      nr_written   244390
      nr_kernel_misc_reclaimable 0
  pages free     3968
        min      77
        low      96
        high     115
        spanned  4095
        present  3997
        managed  3976
        protection: (0, 2445, 3369, 3369, 3369)
      nr_free_pages 3968
      nr_zone_inactive_anon 0
      nr_zone_active_anon 0
      nr_zone_inactive_file 0
      nr_zone_active_file 0
      nr_zone_unevictable 0
      nr_zone_write_pending 0
      nr_mlock     0
      nr_page_table_pages 0
      nr_kernel_stack 0
      nr_bounce    0
      nr_zspages   0
      nr_free_cma  0
      numa_hit     1
      numa_miss    0
      numa_foreign 0
      numa_interleave 0
      numa_local   1
      numa_other   0
  pagesets
    cpu: 0
              count: 0
              high:  0
              batch: 1
  vm stats threshold: 6
    cpu: 1
              count: 0
              high:  0
              batch: 1
  vm stats threshold: 6
    cpu: 2
              count: 0
              high:  0
              batch: 1
  vm stats threshold: 6
    cpu: 3
              count: 0
              high:  0
              batch: 1
  vm stats threshold: 6
  node_unreclaimable:  0
  start_pfn:           1
Node 0, zone    DMA32
  pages free     43834
        min      12202
        low      15252
        high     18302
        spanned  1044480
        present  782288
        managed  759709
        protection: (0, 0, 924, 924, 924)
      nr_free_pages 43834
      nr_zone_inactive_anon 8454
      nr_zone_active_anon 245858
      nr_zone_inactive_file 181846
      nr_zone_active_file 177532
      nr_zone_unevictable 4
      nr_zone_write_pending 26534
      nr_mlock     4
      nr_page_table_pages 5641
      nr_kernel_stack 8472
      nr_bounce    0
      nr_zspages   0
      nr_free_cma  0
      numa_hit     4159869
      numa_miss    0
      numa_foreign 0
      numa_interleave 192366
      numa_local   4159869
      numa_other   0
  pagesets
    cpu: 0
              count: 50
              high:  378
              batch: 63
  vm stats threshold: 36
    cpu: 1
              count: 335
              high:  378
              batch: 63
  vm stats threshold: 36
    cpu: 2
              count: 300
              high:  378
              batch: 63
  vm stats threshold: 36
    cpu: 3
              count: 121
              high:  378
              batch: 63
  vm stats threshold: 36
  node_unreclaimable:  0
  start_pfn:           4096
Node 0, zone   Normal
  pages free     5754
        min      4615
        low      5768
        high     6921
        spanned  262144
        present  262144
        managed  236760
        protection: (0, 0, 0, 0, 0)
      nr_free_pages 5754
      nr_zone_inactive_anon 2366
      nr_zone_active_anon 75000
      nr_zone_inactive_file 49176
      nr_zone_active_file 57023
      nr_zone_unevictable 12
      nr_zone_write_pending 344
      nr_mlock     12
      nr_page_table_pages 5556
      nr_kernel_stack 7096
      nr_bounce    0
      nr_zspages   0
      nr_free_cma  0
      numa_hit     839519
      numa_miss    0
      numa_foreign 0
      numa_interleave 223408
      numa_local   839519
      numa_other   0
  pagesets
    cpu: 0
              count: 253
              high:  378
              batch: 63
  vm stats threshold: 24
    cpu: 1
              count: 202
              high:  378
              batch: 63
  vm stats threshold: 24
    cpu: 2
              count: 325
              high:  378
              batch: 63
  vm stats threshold: 24
    cpu: 3
              count: 291
              high:  378
              batch: 63
  vm stats threshold: 24
  node_unreclaimable:  0
  start_pfn:           1048576
Node 0, zone  Movable
  pages free     0
        min      0
        low      0
        high     0
        spanned  0
        present  0
        managed  0
        protection: (0, 0, 0, 0, 0)
Node 0, zone   Device
  pages free     0
        min      0
        low      0
        high     0
        spanned  0
        present  0
        managed  0
        protection: (0, 0, 0, 0, 0)
han@ubuntu:~$      
【Linux 核心 記憶體管理】分區夥伴配置設定器 ⑥ ( zone 結構體中水線控制相關成員 | 在 Ubuntu 中檢視記憶體區域水位線 )

繼續閱讀