crash命令 —— kmem

简介: crash命令 —— kmem

参考:

https://crash-utility.github.io/help_pages/kmem.html

常用方法:

  • 查看page flags的定义
kmem -g
  • 将指定的数字翻译为page的flags
kmem -g 0x201
  • 查看指定page的信息
kmem -p <page *>
  • 查看所有page的信息
    kmem -p
  • 查看page中某些成员的值
    kmem -m flags,lru,lru.next
  • 查看memory node的信息,比如node中每个zone的mem_map以及起始物理地址
kmem -n
  • 查看每个zone内存的使用统计信息
kmem -z
  • 查看slab的信息
kmem -s 或者 kmem -S
- 如果`-s`后面跟的是一个地址,那么会显示这个地址所属的slub以及object信息
  • 查看内存的使用统计信息,类似cat /proc/meminfo
    kmem -i
  • 查看vmalloc分配的内存的区域的信息
    kmem -v
  • 查看内核中的三张内存使用统计信息的表的内容vm_zone_stat/vm_node_stat/vm_numa_stat
    kmem -V
  • 查看巨型页信息
    kmem -h
  • 如果kmem后面使用的地址都是物理地址
    kmem -P
  • 查看指定的物理地址对应的page的信息
    kmem -p <物理地址>
  • 查看某个物理地址对应的slab以及page的信息
    kmem <物理地址>
  • 获取per-cpu变量在每个cpu上的基地址
crash> kmem -o
PER-CPU OFFSET VALUES:
CPU 0: ffff9f99e8e00000
CPU 1: ffff9f99e8e80000
CPU 2: ffff9f99e8f00000
CPU 3: ffff9f99e8f80000
CPU 4: ffff9f99e9000000
CPU 5: ffff9f99e9080000
CPU 6: ffff9f99e9100000
CPU 7: ffff9f99e9180000

怎么用呢? 比如kmem_cache结构体的第一个成员是struct kmem_cache_cpu __percpu *cpu_slab是一个percpu变量,如果用struct来查看这个一个kmem_cache变量的信息,会得到如下内容:

crash> struct kmem_cache ffff9f96c0042d00 -x
struct kmem_cache {
  cpu_slab = 0x3a1a0,
  flags = 0x40000000,
  min_partial = 0x6,
  size = 0x1000,
  object_size = 0x1000,

可以看到cpu_slab的值是0x3a1a0,这并不是一个合法的内核地址。实际上这里记录的是一个偏移量,需要加上一个cpu的基地址,就可以得到这个percpu变量在那个cpu上的实际虚拟地址,比如想知道cpu_slab在cpu7上的虚拟地址:ffff9f99e9180000 + 0x3a1a0 = ffff9f99e91ba1a0,可以用kmem -S验证一下:

crash> kmem -S kmalloc-4k
CACHE             OBJSIZE  ALLOCATED     TOTAL  SLABS  SSIZE  NAME
ffff9f96c0042d00     4096       1772      1872    234    32k  kmalloc-4k
CPU 0 KMEM_CACHE_CPU:
ffff9f99e8e3a1a0
CPU 0 SLAB:
SLAB              MEMORY            NODE  TOTAL  ALLOCATED  FREE
fffff41dc4e46200  ffff9f96f9188000     0      8          2     6
...
CPU 7 KMEM_CACHE_CPU:
ffff9f99e91ba1a0  <<<======================
CPU 7 SLAB:
SLAB              MEMORY            NODE  TOTAL  ALLOCATED  FREE
fffff41dc49b0200  ffff9f96e6c08000     0      8          3     5
FREE / [ALLOCATED]
  [ffff9f96e6c08000]
  [ffff9f96e6c09000]
ffff9f96e6c0a000  (cpu 7 cache)

要获取percpu的内核虚拟地址,crash提供了专门的命令ptov,参考:ptov,此外如果percpu变量是一个全局的,比如cpu_quarantine,那么可以用p cpu_quarantine来查看在每个cpu上的地址。

相关文章
|
2月前
|
Linux
crash命令 —— runq
crash命令 —— runq
|
2月前
crash命令 —— sym
crash命令 —— sym
|
2月前
|
分布式计算 关系型数据库 Ruby
crash命令 —— rd
crash命令 —— rd
|
2月前
crash命令 —— vm
crash命令 —— vm
|
2月前
crash命令 —— p
crash命令 —— p
|
2月前
crash命令 —— vtop
crash命令 —— vtop
|
2月前
crash命令 —— ptov
crash命令 —— ptov
|
2月前
crash命令 —— waitq
crash命令 —— waitq
|
2月前
crash命令 —— ptob/btop
crash命令 —— ptob/btop
|
2月前
crash命令 —— log
crash命令 —— log