通用统计信息
crash> kmem -i PAGES TOTAL PERCENTAGE TOTAL MEM 197646761 754 GB ---- FREE 33983015 129.6 GB 17% of TOTAL MEM USED 163663746 624.3 GB 82% of TOTAL MEM SHARED 139137050 530.8 GB 70% of TOTAL MEM BUFFERS 163044 636.9 MB 0% of TOTAL MEM CACHED 138671703 529 GB 70% of TOTAL MEM SLAB 1979673 7.6 GB 1% of TOTAL MEM TOTAL HUGE 527360 2 GB ---- HUGE FREE 3072 12 MB 0% of TOTAL HUGE TOTAL SWAP 10485759 40 GB ---- SWAP USED 229952 898.2 MB 2% of TOTAL SWAP SWAP FREE 10255807 39.1 GB 97% of TOTAL SWAP COMMIT LIMIT 109045459 416 GB ---- COMMITTED 190946051 728.4 GB 175% of TOTAL LIMIT
更详细的内存统计
crash> kmem -V VM_ZONE_STAT: NR_FREE_PAGES: 33983015 NR_ZONE_INACTIVE_ANON: 102298116 NR_ZONE_ACTIVE_ANON: 54564210 NR_ZONE_INACTIVE_FILE: 569613 NR_ZONE_ACTIVE_FILE: 1835235 NR_ZONE_UNEVICTABLE: 83405 NR_ZONE_WRITE_PENDING: 843 NR_MLOCK: 83405 NR_PAGETABLE: 615900 NR_KERNEL_STACK_KB: 104512 ... VM_NODE_STAT: NR_INACTIVE_ANON: 102298116 NR_ACTIVE_ANON: 54564210 NR_INACTIVE_FILE: 569613 NR_ACTIVE_FILE: 1835235 NR_UNEVICTABLE: 83405 NR_SLAB_RECLAIMABLE: 1158659 NR_SLAB_UNRECLAIMABLE: 821014 NR_ISOLATED_ANON: 0 NR_ISOLATED_FILE: 0 WORKINGSET_REFAULT: 1611642 WORKINGSET_ACTIVATE: 595412 WORKINGSET_NODERECLAIM: 0 NR_ANON_MAPPED: 20486105 ... VM_NUMA_STAT: NUMA_HIT: 3114247459241 NUMA_MISS: 324426183 NUMA_FOREIGN: 324426183 ... VM_EVENT_STATES: PGPGIN: 1338982539116 PGPGOUT: 1957291385093 PSWPIN: 405180 PSWPOUT: 604083 PGALLOC_DMA: 0 PGALLOC_DMA32: 0 PGALLOC_NORMAL: 3507797098568 PGALLOC_MOVABLE: 0 ...
显示每个zone的内存使用统计
crash> kmem -z NODE: 0 ZONE: 0 ADDR: ffff88e03ffc1000 NAME: "DMA" SIZE: 4095 PRESENT: 3997 MIN/LOW/HIGH: 5/8/11 VM_STAT: NR_FREE_PAGES: 3840 NR_ZONE_INACTIVE_ANON: 0 NR_ZONE_ACTIVE_ANON: 0 NR_ZONE_INACTIVE_FILE: 0 NR_ZONE_ACTIVE_FILE: 0 ... NODE: 0 ZONE: 1 ADDR: ffff88e03ffc5000 NAME: "DMA32" SIZE: 1044480 PRESENT: 392960 MIN/LOW/HIGH: 334/586/838 VM_STAT: NR_FREE_PAGES: 252250 NR_ZONE_INACTIVE_ANON: 0 NR_ZONE_ACTIVE_ANON: 0 NR_ZONE_INACTIVE_FILE: 0 NR_ZONE_ACTIVE_FILE: 0 ... NODE: 0 ZONE: 2 ADDR: ffff88e03ffc9000 NAME: "Normal" SIZE: 99876864 MIN/LOW/HIGH: 130384/228688/326992 VM_STAT: NR_FREE_PAGES: 18034897 NR_ZONE_INACTIVE_ANON: 42387361 NR_ZONE_ACTIVE_ANON: 33542124 NR_ZONE_INACTIVE_FILE: 284979 ... NODE: 0 ZONE: 3 ADDR: ffff88e03ffcd000 NAME: "Movable" [unpopulated] NODE: 0 ZONE: 4 ADDR: ffff88e03ffd1000 NAME: "Device" [unpopulated] NODE: 1 ZONE: 0 ADDR: ffff89403fdbe000 NAME: "DMA" [unpopulated] NODE: 1 ZONE: 1 ADDR: ffff89403fdc2000 NAME: "DMA32" [unpopulated] NODE: 1 ZONE: 2 ADDR: ffff89403fdc6000 NAME: "Normal" SIZE: 100663296 MIN/LOW/HIGH: 131420/230505/329590 VM_STAT: NR_FREE_PAGES: 15692028 NR_ZONE_INACTIVE_ANON: 59910755 NR_ZONE_ACTIVE_ANON: 21022086 NR_ZONE_INACTIVE_FILE: 284634
标准巨型页的使用统计
crash> kmem -h HSTATE SIZE FREE TOTAL NAME ffffffff835bab60 1GB 0 0 hugepages-1048576kB ffffffff835c2010 2MB 6 1030 hugepages-2048kB
查看当前伙伴系统的空闲内存信息
crash> kmem -f NODE 0 ZONE NAME SIZE FREE MEM_MAP START_PADDR START_MAPNR 0 DMA 4095 3840 ffffea0000000040 1000 0 AREA SIZE FREE_AREA_STRUCT BLOCKS PAGES 0 4k ffff88e03ffc2000 0 0 0 4k ffff88e03ffc2010 0 0 0 4k ffff88e03ffc2020 0 0 0 4k ffff88e03ffc2030 0 0 0 4k ffff88e03ffc2040 0 0 1 8k ffff88e03ffc2058 0 0 1 8k ffff88e03ffc2068 0 0 1 8k ffff88e03ffc2078 0 0 1 8k ffff88e03ffc2088 0 0 1 8k ffff88e03ffc2098 0 0 ... ZONE NAME SIZE FREE MEM_MAP START_PADDR START_MAPNR 1 DMA32 1044480 252250 ffffea0000040000 1000000 4095 AREA SIZE FREE_AREA_STRUCT BLOCKS PAGES 0 4k ffff88e03ffc6000 0 0 0 4k ffff88e03ffc6010 6 6 0 4k ffff88e03ffc6020 0 0 0 4k ffff88e03ffc6030 0 0 0 4k ffff88e03ffc6040 0 0 1 8k ffff88e03ffc6058 0 0 1 8k ffff88e03ffc6068 6 12 1 8k ffff88e03ffc6078 0 0 1 8k ffff88e03ffc6088 0 0 1 8k ffff88e03ffc6098 0 0 2 16k ffff88e03ffc60b0 0 0 2 16k ffff88e03ffc60c0 8 32 2 16k ffff88e03ffc60d0 0 0 2 16k ffff88e03ffc60e0 0 0 ...
以Node1的ZONE1中ffff88e03ffc60c0这个free_area为例,表示每个页块4*4K=16K
,一共有8个空闲的页块,一共有32KB:
crash> whatis free_area struct free_area { struct list_head free_list[5]; unsigned long nr_free; } SIZE: 88 crash> *free_area ffff88e03ffc60c0 struct free_area { free_list = {{ next = 0xffffea000011f908, prev = 0xffffea000183be08 }, { next = 0xffff88e03ffc60d0, prev = 0xffff88e03ffc60d0 }, { next = 0xffff88e03ffc60e0, prev = 0xffff88e03ffc60e0 }, { next = 0xffff88e03ffc60f0, prev = 0xffff88e03ffc60f0 }, { next = 0x8, prev = 0xffff88e03ffc6108 }}, nr_free = 18446613095460397320 }
每个页块通过第一个page的lru挂到free_list,上面第一个free_list[0],可以通过list命令将每个页块的第一个page的地址打印出来:
crash> list -x -o page.lru -s page.flags -H ffff88e03ffc60c0 ffffea000011f900 flags = 0x8000000000000, ffffea000015e700 flags = 0x8000000000000, ffffea0000178100 flags = 0x8000000000000, ffffea0001551000 flags = 0x8000000000000, ffffea00017b5500 flags = 0x8000000000000, ffffea0000167e00 flags = 0x8000000000000, ffffea0001666900 flags = 0x8000000000000, ffffea000183be00 flags = 0x8000000000000,
此外,如果需要把每个空闲页块的第一个page的地址也一并打印出来,可以直接使用下面的命令:
crash> kmem -F ... AREA SIZE FREE_AREA_STRUCT 2 16k ffff88e03ffc60c0 ffffea000011f900 ffffea000015e700 ffffea0000178100 ffffea0001551000 ffffea00017b5500 ffffea0000167e00 ffffea0001666900 ffffea000183be00
可以看到,上面输出的page的地址跟list命令输出的是一样的