• 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

    [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
  • 相关阅读:
    Dreamweaver CS4无法启动:xml parsing fatal error..Designer.xml错误解决方法
    strcpy() strcat() strcmp() gets() puts()
    使用友元,编译出错fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'msc1.cpp', line 1786) 的解决
    HashMap按key排序
    转Oracle数据类型及存储方式【E】
    JAVA_java.util.Date与java.sql.Date相互转换
    Oracle_复制表跟往表插数据
    java_Struts学习例子
    ORA01033: ORACLE initialization or shutdown in progressORACLE
    dorado勾选修改的时候总是选择第一条记录解决办法.
  • 原文地址:https://www.cnblogs.com/ggzhangxiaochao/p/13507539.html
Copyright © 2020-2023  润新知