linux內存分析


1、Linux查看內存使用情況方法

1、top命令

2、free命令

  free    用KB為單位展示數據

  free -m    用MB為單位展示數據

  free -h     用GB為單位展示數據

3、cat /proc/meminfo 命令

4、vmstat命令

  vmstat -s

2、dma相關情況

void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag);
該函數實際獲得兩個地址, 
1、函數的返回值是一個 void *,代表緩沖區的內核虛擬地址 
2、相關的總線地址(物理地址),保存在dma_handle中

A =dma_alloc_coherent(B,C,D,GFP_KERNEL);
含義:
A: 內存的虛擬起始地址,在內核要用此地址來操作所分配的內存
B: struct device指針,可以平台初始化里指定,主要是dma_mask之類,可參考framebuffer
C: 實際分配大小,傳入dma_map_size即可
D: 返回的內存物理地址,dma就可以用。
所以,A和D是一一對應的,只不過,A是虛擬地址,而D是物理地址。對
任意一個操作都將改變緩沖區內容。當然要注意操作環境。
注size最好以頁為單位分配。

在/proc目錄下,可以找到大部分內存分析

1)cat /proc/buddyinfo

Linux Buddy System是為了解決以Page為單位的內存分配導致外內存碎片問題:即系統缺少連續的Page頁導致需要連續Page頁的內存申請無法得到滿足。

原理很簡單,將不同個數的連續Pages組合成Block進行分配,Block按2的冪次方個Pages划分為11個Block鏈表,

分別對應1,2,4,8,16,32,64,128,256,512和1024個連續的Pages。

調用Buddy System進行內存分配時,根據申請的大小找最合適的Block。
如下所示為各個Zone上的Buddy System基本信息,后面11列為11個Block鏈表里可用的Block個數。

[root@CENTOS130 zc]# cat /proc/buddyinfo
Node 0, zone      DMA      1      0      1      1      0      0      0      0      0      0      0
Node 0, zone    DMA32     30     56     56     25      7      5      4      2      1      2    351
Node 0, zone   Normal     67     76    214    232    158     79     44     29     17     23   3402
[root@CENTOS130 zc]# cat /proc/zoneinfo
Node 0, zone DMA
  pages free     13
        min      16
  。。。省略。。。
  inactive_ratio:    1
Node 0, zone DMA32
  pages free     362054
        min      1571
   。。。省略。。。
  inactive_ratio:    3
Node 0, zone Normal
  pages free     3514295
        min      15307   。。。省略。。。
  inactive_ratio:    11
[oot@CENTOS130 zc]#
[oot@CENTOS130 zc]# cat /proc/pagetypeinfo
Page block order: 9
Pages per block:  512

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      1      0      1      1      0      0      0      0      0      0      0
Node    0, zone      DMA, type  Reclaimable      0      0      0      0      0      0      0      0      0      0      0
Node    0, zone      DMA, type      Movable      0      0      0      0      0      0      0      0      0      0      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
Node    0, zone    DMA32, type    Unmovable      4     16     24      7      3      1      1      1      0      1      0
Node    0, zone    DMA32, type  Reclaimable     14     19     10     11      3      3      1      0      1      0      0
Node    0, zone    DMA32, type      Movable     12     21     22      7      1      1      2      1      0      1    351
Node    0, zone    DMA32, type      Reserve      0      0      0      0      0      0      0      0      0      0      0
Node    0, zone    DMA32, type          CMA      0      0      0      0      0      0      0      0      0      0      0
Node    0, zone    DMA32, type      Isolate      0      0      0      0      0      0      0      0      0      0      0
Node    0, zone   Normal, type    Unmovable     19     23     87     64     66     52     33     26     16     22      5
Node    0, zone   Normal, type  Reclaimable     19      1     34     50     28     11      8      1      0      0      0
Node    0, zone   Normal, type      Movable     29     52     93    118     64     16      3      2      1      1   3397
Node    0, zone   Normal, type      Reserve      0      0      0      0      0      0      0      0      0      0      0
Node    0, zone   Normal, type          CMA      0      0      0      0      0      0      0      0      0      0      0
Node    0, zone   Normal, type      Isolate      0      0      0      0      0      0      0      0      0      0      0

Number of blocks type     Unmovable  Reclaimable      Movable      Reserve          CMA      Isolate
Node 0, zone      DMA            8            0            0            0            0            0
Node 0, zone    DMA32            6            2          880            0            0            0
Node 0, zone   Normal         3190           10         3968            0            0            0

2)numctl 

通過numactl -H查看NUMA硬件信息,可以看到2個node的大小和對應的CPU核,以及CPU訪問node的distances。

如下所示CPU訪問遠端node的distances是本地node的2倍多。

[root@localhost ~]# numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
node 0 size: 15870 MB
node 0 free: 13780 MB
node 1 cpus: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
node 1 size: 16384 MB
node 1 free: 15542 MB
node distances:
node   0   1 
  0:  10  21 
  1:  21  10

通過numastat查看NUMA的統計信息,包括內存分配的命中次數、未命中次數、本地分配次數和遠端分配次數等。

[root@localhost ~]# numastat 
                           node0           node1
numa_hit              2351854045      3021228076
numa_miss               22736854         2976885
numa_foreign             2976885        22736854
interleave_hit             14144           14100
local_node            2351844760      3021220020
other_node              22746139         2984941

3)cat /proc/zoneinfo

ZONE_DMA

地址段最低的一塊內存區域,用於ISA(Industry Standard Architecture)設備DMA訪問。在x86架構下,該Zone大小限制為16MB。

ZONE_DMA32

該Zone用於支持32-bits地址總線的DMA設備,只在64-bits系統里才有效。

ZONE_NORMAL

該Zone的內存被內核直接映射為線性地址並可以直接使用。在X86-32架構下,該Zone對應的地址范圍為16MB~896MB。在X86-64架構下,DMA和DMA32之外的內存全部在NORMAL的Zone里管理。

ZONE_HIGHMEM

該Zone只在32位系統才有,通過建立臨時頁表的方式映射超過896MB的內存空間。即在需要訪問的時候建立地址空間和內存的映射關系,在訪問結束后拆掉映射關系釋放地址空間,該地址空間可以用於其他HIGHMEM的內存映射。

通過/proc/zoneinfo可以查看Zone相關的信息。如下所示X86-64系統上兩個Node,Node0上有DMA、DMA32和Normal三個Zone,Node1上只有一個Normal Zone。

[root@localhost ~]# cat /proc/zoneinfo |grep -E "zone| free|managed"
Node 0, zone      DMA
  pages free     3700
        managed  3975
Node 0, zone    DMA32
  pages free     291250
        managed  326897
Node 0, zone   Normal
  pages free     3232166
        managed  3604347
Node 1, zone   Normal
  pages free     3980110
        managed  4128056

4)Linux查看slab信息的方法

[root@localhost ~]# cat /proc/slabinfo 
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab>。。。<num_slabs> <sharedavail>
fat_inode_cache       90     90    720   45    8 : tunables    0    0    0 : slabdata      2      2      0
fat_cache              0      0     40  102    1 : tunables    0    0    0 : slabdata      0      0      0
kvm_vcpu               0      0  16576    1    8 : tunables    0    0    0 : slabdata      0      0      0
kvm_mmu_page_header      0      0    168   48    2 : tunables    0    0    0 : slabdata      0      0      0
ext4_groupinfo_4k   4440   4440    136   30    1 : tunables    0    0    0 : slabdata    148    148      0
ext4_inode_cache   63816  65100   1032   31    8 : tunables    0    0    0 : slabdata   2100   2100      0
ext4_xattr          1012   1012     88   46    1 : tunables    0    0    0 : slabdata     22     22      0
ext4_free_data     16896  17600     64   64    1 : tunables    0    0    0 : slabdata    275    275      0

5)Linux提供了一些內存管理相關的內核參數

/proc/sys/vm目錄下可以查看或者通過sysctl -a |grep vm查看

[root@localhost vm]# sysctl -a |grep vm
vm.admin_reserve_kbytes = 8192
vm.block_dump = 0
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
vm.drop_caches = 1
vm.extfrag_threshold = 500
vm.hugepages_treat_as_movable = 0
vm.hugetlb_shm_group = 0
vm.laptop_mode = 0
vm.legacy_va_layout = 0
vm.lowmem_reserve_ratio = 256    256    32
vm.max_map_count = 65530
vm.memory_failure_early_kill = 0
vm.memory_failure_recovery = 1
vm.min_free_kbytes = 1024000
vm.min_slab_ratio = 1
vm.min_unmapped_ratio = 1
vm.mmap_min_addr = 4096
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
vm.nr_overcommit_hugepages = 0
vm.nr_pdflush_threads = 0
vm.numa_zonelist_order = default
vm.oom_dump_tasks = 1
vm.oom_kill_allocating_task = 0
vm.overcommit_kbytes = 0
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
vm.page-cluster = 3
vm.panic_on_oom = 0
vm.percpu_pagelist_fraction = 0
vm.stat_interval = 1
vm.swappiness = 60
vm.user_reserve_kbytes = 131072
vm.vfs_cache_pressure = 100
vm.zone_reclaim_mode = 0

6)其他

# 立即重新啟動計算機
echo "b" > /proc/sysrq-trigger

# 立即關閉計算機
echo "o" > /proc/sysrq-trigger

# 導出內存分配的信息 (可以用/var/log/message 查看)
echo "m" > /proc/sysrq-trigger

# 導出當前CPU寄存器信息和標志位的信息
echo "p" > /proc/sysrq-trigger

# 導出線程狀態信息
echo "t" > /proc/sysrq-trigger

# 故意讓系統崩潰
echo "c" > /proc/sysrq-trigger

# 立即重新掛載所有的文件系統 
echo "s" > /proc/sysrq-trigger

# 立即重新掛載所有的文件系統為只讀
echo "u" > /proc/sysrq-trigger

# 獲取Linux 內存頁(基頁)大小的命令:getconf PAGE_SIZE ,一般的輸出是4096,即 4KB。

[root@CENTOS130 ~]# echo "m" > /proc/sysrq-trigger
[  610.210479] SysRq : Show Memory
[  610.250633] Mem-Info:
[  610.280447] active_anon:15234 inactive_anon:2187 isolated_anon:0
[  610.280447]  active_file:10471 inactive_file:23802 isolated_file:0
[  610.280447]  unevictable:0 dirty:0 writeback:0 unstable:0
[  610.280447]  slab_reclaimable:5169 slab_unreclaimable:4559
[  610.280447]  mapped:5822 shmem:2256 pagetables:822 bounce:0
[  610.280447]  free:3882942 free_pcp:338 free_cma:0
[  610.719606] Node 0 DMA free:15900kB min:64kB low:80kB high:96kB active_anon:0kB inactive_anon:0kB 
  active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15996kB
  managed:15904kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:0kB slab_unreclaimable:4kB
  kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 611.265314] lowmem_reserve[]: 0 1447 15530 15530 [ 611.325023] Node 0 DMA32 free:1452276kB min:6284kB low:7852kB high:9424kB active_anon:6616kB inactive_anon:852kB
  active_file:3880kB inactive_file:10280kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:1727108kB
  managed:1482044kB mlocked:0kB dirty:0kB writeback:0kB mapped:2620kB shmem:904kB slab_reclaimable:2068kB
  slab_unreclaimable:1456kB kernel_stack:128kB pagetables:608kB unstable:0kB bounce:0kB free_pcp:668kB local_pcp:668kB
  free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 611.921272] lowmem_reserve[]: 0 0 14082 14082 [ 611.978602] Node 0 Normal free:14063592kB min:61228kB low:76532kB high:91840kB active_anon:54320kB inactive_anon:7896kB
  active_file:38004kB inactive_file:84928kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:14680064kB
  managed:14420972kB mlocked:0kB dirty:0kB writeback:0kB mapped:20668kB shmem:8120kB slab_reclaimable:18608kB slab_unreclaimable:16776kB
  kernel_stack:2000kB pagetables:2680kB unstable:0kB bounce:0kB free_pcp:684kB local_pcp:684kB free_cma:0kB
  writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 612.593199] lowmem_reserve[]: 0 0 0 0 [ 612.641353] Node 0 DMA: 1*4kB (U) 1*8kB (U) 1*16kB (U) 0*32kB 2*64kB (U) 1*128kB (U) 1*256kB (U) 0*512kB 1*1024kB (U) 1*2048kB (M) 3*4096kB (M) = 15900kB [ 612.822521] Node 0 DMA32: 145*4kB (UM) 106*8kB (UEM) 82*16kB (UEM) 36*32kB (UEM) 9*64kB (UEM) 7*128kB (UEM) 2*256kB (M) 3*512kB (UEM)
                  3*1024kB (UEM) 0*2048kB 352*4096kB (M) = 1452276kB [ 613.039233] Node 0 Normal: 84*4kB (UEM) 109*8kB (UEM) 73*16kB (UE) 111*32kB (UEM) 85*64kB (UEM) 61*128kB (UEM) 39*256kB (UM)
                  21*512kB (UM) 11*1024kB (UM) 18*2048kB (UM) 3412*4096kB (UM) = 14063592kB [ 613.271997] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=1048576kB [ 613.386660] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 613.497884] 36529 total pagecache pages [ 613.548337] 0 pages in swap cache [ 613.592950] Swap cache stats: add 0, delete 0, find 0/0 [ 613.660706] Free swap = 5780476kB [ 613.705424] Total swap = 5780476kB [ 613.750143] 4105792 pages RAM [ 613.789127] 0 pages HighMem/MovableOnly [ 613.839582] 126062 pages reserved

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM