Ø檢視記憶體的實體位址範圍
[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失敗?