天天看點

核心态記憶體管理

Ø檢視記憶體的實體位址範圍

[root@node01 ~]# cat /proc/iomem 

00000000-00000fff : reserved

00001000-0009ebff : System RAM

0009ec00-0009ffff : reserved

000a0000-000bffff : PCI Bus 0000:00

...

000dc000-000fffff : reserved

  000f0000-000fffff : System ROM

00100000-7fedffff : System RAM

  2b000000-350fffff : Crash kernel

  72600000-72d9425e : Kernel code

  72d9425f-7336817f : Kernel data

  73562000-7386efff : Kernel bss

7fee0000-7fefefff : ACPI Tables

7feff000-7fefffff : ACPI Non-volatile Storage

7ff00000-7fffffff : System RAM

Ø檢視zone的資訊

 [root@node01 ~]# cat /proc/zoneinfo 

Node 0, zone      DMA

  pages free     1979

        min      96

        low      120

        high     144

        scanned  0

        spanned  4095

        present  3997

        managed  3976

    nr_free_pages 1979

    nr_alloc_batch 20

    nr_inactive_anon 654

   …

Node 0, zone    DMA32

Ø檢視夥伴系統的資訊

root@node01 ~]# cat /proc/buddyinfo

Node 0, zone      DMA     33     15     14     5    8    5   0   2   1   2   0

Node 0, zone    DMA32   3519   5656   2514  1031  248   41   3   0   0   0   0 

[root@node01 ~]# cat /proc/pagetypeinfo 

Free pages count per migrate type at order     0   1   2   3   4   5   6   7   8   9  10 

Node    0, zone    DMA, type    Unmovable      6   6   7   5   4   1   0   1   0   0   0 

Node    0, zone    DMA, type  Reclaimable      1   0   1   0   2   3   0   0   1   1   0 

Node    0, zone    DMA, type      Movable     23   9   6   0   2   1   0   1   0   1   0 

Node    0, zone    DMA, type      Reserve      0   0   0   0   0   0   0   0   0   0   0 

Node    0, zone    DMA, type          CMA      0   0   0   0   0   0   0   0   0   0   0 

Node    0, zone    DMA, type      Isolate      0   0   0   0   0   0   0   0   0   0   0 

Ø檢視slab的資訊    pagesperslab * num_slabs *4K ==占用記憶體大小

[root@node01 ~]# cat /proc/slabinfo 

slabinfo - version: 2.1

# name  <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>

xfs_dqtrx       0      0    528   62    8 : tunables    0    0    0 : slabdata      0      0      0

xfs_inode   14807  20434    960   34    8 : tunables    0    0    0 : slabdata    601    601      0

kmalloc-96   3948   3948     96   42    1 : tunables    0    0    0 : slabdata     94     94      0

kmalloc-64  16401  19840     64   64    1 : tunables    0    0    0 : slabdata    310    310      0

kmalloc-32  12482  15616     32  128    1 : tunables    0    0    0 : slabdata    122    122      0

kmalloc-16  32426  49664     16  256    1 : tunables    0    0    0 : slabdata    194    194      0

kmalloc-8    8704   8704      8  512    1 : tunables    0    0    0 : slabdata     17     17      0

[root@node01 ~]# cat /proc/vmallocinfo 

0xffffb751c0000000-0xffffb751c0002000    8192 hpet_enable+0x2d/0x317 phys=fed00000 ioremap

0xffffb751c0002000-0xffffb751c0203000 2101248 alloc_large_system_hash+0x188/0x25c pages=512 vmalloc N0=512

0xffffb751c0203000-0xffffb751c0304000 1052672 alloc_large_system_hash+0x188/0x25c pages=256 vmalloc N0=256

0xffffb751c0304000-0xffffb751c030d000   36864 alloc_large_system_hash+0x188/0x25c pages=8 vmalloc N0=8

0xffffb751c030d000-0xffffb751c0316000   36864 alloc_large_system_hash+0x188/0x25c pages=8 vmalloc N0=8

0xffffb751c0316000-0xffffb751c0318000    8192 acpi_os_map_memory+0xfd/0x155 phys=7feff000 ioremap

0xffffb751c031c000-0xffffb751c031e000    8192 usb_hcd_pci_probe+0x143/0x560 phys=fd5bf000 ioremap

0xffffb751c0336000-0xffffb751c0357000  135168 raw_init+0x41/0x141 pages=32 vmalloc N0=32

0xffffb751c0357000-0xffffb751c035c000   20480 agp_add_bridge+0x2da/0x480 pages=4 vmalloc N0=4

0xffffb751c03a8000-0xffffb751c03aa000    8192 vmballoon_work+0x1f9/0x6ff [vmw_balloon] vmap

使用者态記憶體映射

以32位X86系統為例,每個使用者态程序的位址空間為3G,在需要時,作業系統為位址空間映射實體記憶體,供程序使用,一般的過程是:

1、程序通過malloc()函數申請記憶體,使用者态的記憶體管理算法通過brk()/mmap()系統調用,會得到一段位址空間,經過記憶體管理算法對空間進行劃分,傳回一個虛拟位址;

2、程序通路虛拟位址,由于虛拟位址沒有映射的實體記憶體,會産生缺頁異常;

3、作業系統處理缺頁異常,通過夥伴系統算法配置設定實體頁,設定頁表項,将實體位址映射到虛拟位址上,傳回使用者态程序繼續運作;

4、使用者态程序此時就可以通路虛拟位址了。

缺頁異常的處理,對于使用者态程序來說是透明的,它并不感覺這一過程。并且,虛拟位址一旦映射,作業系統裡會儲存期頁表項,下次通路不會再次産生缺頁異常。

1、空閑記憶體很少,怎樣确定誰占用了大量記憶體?

cat /proc/meminfo,先大緻确定是哪些部分占用的記憶體多,然後再詳細查詢

MemTotal:        1863100 kB

MemFree:         1495220 kB

MemAvailable:    1522176 kB

Buffers:            2108 kB

Cached:           147860 kB   // 1)記憶體檔案系統及檔案緩存占用的記憶體   echo 3 > /xx/xx/vm/drop_cache

SwapCached:            0 kB

AnonPages:         72496 kB   // 2)AnonPages及Mapped是使用者态占用的記憶體

Mapped:            36128 kB

Slab:              68760 kB   // 3)slab配置設定器占用的記憶體,具體查詢/proc/slabinfo

KernelStack:        4480 kB   // 核心線程棧占用的記憶體

PageTables:         8332 kB   // 頁表項占用的記憶體

VmallocTotal:   34359738367 kB

VmallocUsed:      180368 kB   // 4)vmalloc空間的使用情況,并不完全是記憶體,具體查詢/proc/vmallocinfo

1、空閑記憶體剩餘還有很多,為什麼kmalloc失敗?

1)注意kmalloc申請的記憶體大小;可能情況是系統剩餘記憶體還很多,但是碎片化比較嚴重,已經沒有這麼大的連續記憶體了。

2)如果是32位的裝置,要注意kmalloc是隻能申請lowmem(DMA/NORMAL)的,有可能Free記憶體比較多,但是lowmem已經很少了

通過檢視/proc/buddyinfo來确認上述兩點

2、空閑記憶體剩餘還有很多,為什麼malloc失敗?