目录
一、实验
1.环境
2.vmstat
3.PSI
4.swapon
5.sar
6.slabtop
7.numstat
8.ps
9.top
10.pmap
11.perf
12.bpftrace
二、问题
1.接口读写报错
2.slabtop如何安装
3.numactl如何安装
4.numad启动服务与关闭NUMA
5. perf如何安装
6. kernel-lt-doc与kernel-lt-tools-libs-devel如何安装
7.bpftrace如何安装
8. drsnoop如何使用
一、实验
1.环境
(1)主机
表1-1 主机
主机 | 架构 | 组件 | IP | 备注 |
prometheus | 监测 系统 | prometheus、node_exporter | 192.168.204.18 | |
grafana | 监测GUI | grafana | 192.168.204.19 | |
agent | 监测 主机 | node_exporter | 192.168.204.20 |
(2)内存观测工具
表1-2 内存观测工具
序号 | 工具 | 描述 |
1 | vmstat | 虚拟内存和物理内存统计信息 |
2 | PSI | 内存压力滞留信息 |
3 | swapon | 交换设备使用率 |
4 | sar | 历史统计信息 |
5 | slabtop | 内核slab分配器统计信息 |
6 | numastat | NUMA分析 |
7 | ps | 进程状态 |
8 | top | 监测每个进程的内存使用率 |
9 | pmap | 进程地址空间统计信息 |
10 | perf | 内存PMC和跟踪点分析 |
11 | bpftrace | 用于内存分析的跟踪程序 |
2.vmstat
(1) 每秒1次,共5次输出
[root@agent ~]# vmstat 1 5
(2)-S 选项将输出单位修改为MB(m表示1 000 000, M表示 1 048 576)
[root@agent ~]# vmstat -Sm 1 5
[root@agent ~]# vmstat -SM 1 5
(3) -a 选项可以输出非活动inactive和活动页active缓存的明细
[root@agent ~]# vmstat -a 1 5
3.PSI
(1) 显示是否有内存压力,和过去5分钟内的变化情况
cat /proc/pressure/memory
some开头的一行显示了一些任务(线程)受到影响的时间,full开头的一行显示了所有可运行任务受到影响的时间
4.swapon
(1) 显示配置的交换设备以及使用率
[root@agent ~]# swapon
5.sar
(1) -B 换页统计信息
每秒1次,共5次
[root@agent ~]# sar -B 1 5
(2)-H 巨型页统计信息
每秒1次,共5次
[root@agent ~]# sar -H 1 5
(3)-r 内存使用率
每秒1次,共5次
[root@agent ~]# sar -r 1 5
(4)-S 交换空间统计信息
每秒1次,共5次
[root@agent ~]# sar -S 1 5
(5)-W 交换统计信息
[root@agent ~]# sar -W 1 5
6.slabtop
(1) 输出内核slab缓存使用情况
每5s显示一次
[root@agent ~]# slabtop -d 5
7.numstat
(1)查询CPU插槽系数
为非统一内存访问(NUMA)系统提供统计数据
[root@agent ~]# numastat
8.ps
(1) 列出包括内存使用同统计信息在内的所有进程细节
[root@agent ~]# ps aux
(2)数据列用SVR4 方式的-o选择
[root@agent ~]# ps -eo pid,pmem,vsz,rss,comm
9.top
(1) 显示内存使用统计信息
[root@agent ~]# top -o %MEM
10.pmap
(1) 列出一个进程的内存映射,显示其大小、权限和映射对象
[root@agent ~]# pmap -x 755
(2)-X 显示更多的细节
[root@agent ~]# pmap -X $(pgrep mysqld) | head -2
(3)-XX 显示内核提供的“一切”
[root@agent ~]# pmap -XX $(pgrep mysqld) | head -2
11.perf
(1) 采样整个系统的缺页(RSS增长)机器栈踪迹,按下CTRL+C组合键结束
[root@agent ~]# perf record -e page-faults -a -g
(2)记录pid为755的进程在60秒内发生的所有却也及其栈踪迹
[root@agent ~]# perf record -e page-faults -c 1 -p 755 -g -- sleep 60
(3)通过brk记录栈的增长,按下CTRL+C组合键结束
[root@agent ~]# perf record -e syscalls:sys_enter_brk -a -g
(4)记录NUMA系统上的页迁移情况
[root@agent ~]# perf record -e migrate:mm_migrate_pages -a
(5)使用栈踪迹来跟踪kswapd唤醒时间,按下CTRL+C组合键结束
[root@agent ~]# perf record -e vmscan:mm_vmscan_wakeup_kswapd -ag
12.bpftrace
(1)按代码路径对进程堆扩张情况(brk)计数
[root@agent ~]# bpftrace -e 'tracepoint:syscalls:sys_enter_brk { @[ustack,comm] = count(); }'
(2)按跟踪点对vmscan操作数量计数
[root@agent ~]# bpftrace -e 'tracepoint:vmscan:* { @[probe] = count(); }'
(3)按进程对swapins操作数量计数
[root@agent ~]# bpftrace -e 'kprobe:swap_readpage { @[comm,pid] = count(); }'
(4) 对页迁移数量计数
[root@agent ~]# bpftrace -e 'tracepoint:migrate:mm_migrate_pages { @ = count(); }'
(5)跟踪内存压缩事件
[root@agent ~]# bpftrace -e 't:compaction:mm_compaction_begin { time(); }'
(6)列出内核kmem的跟踪点
[root@agent ~]# bpftrace -l 't:mm_*'
(7)列出所有内存子系统(mm)的跟踪点
[root@agent ~]# bpftrace -l 't:mm_*'
二、问题
1.接口读写报错
(1)报错
提示“不支持的操作”或 "Operation not supported"
(2)原因分析
查看当前内核版本
5.4 版本的内核在 "psi_proc_init" 函数中没有进行 "psi_enable" 的判断,就直接创建了 "/proc" 下的这些文件,导致可以看到而不能使用。
(3)解决方法
此问题已在 5.6 版本里修复了,如下面的commit。
sched/psi: create /proc/pressure and /proc/pressure/{io|memory|cpu} o… · torvalds/linux@3d81768 · GitHub
2.slabtop如何安装
(1)安装
yum install procps-ng
(2)使用
slabtop -d 5 #每5s显示一次
(3)参数
选项 | 说明 |
---|---|
-d n / --delay=n | 设置显示的时间间隔 |
-s S / --sort=S | 设置排序规则。a,以活动对象数目排序;b,以每个slab对象数目排序;c,以缓存大小排序;l,以slab数量排序;v,以多动的slab排序;n,以名字排序;o,以对象数目排序;p,以每slab的页数排序;u,以缓存利用率排序 |
-o /--once | 只显示一次,之后退出 |
-V / --version | 显示版本信息,并且退出 |
--help | 显示帮助信息,并且退出 |
设置排序规则
[root@agent ~]# slabtop -s S
只显示一次,之后退出
显示版本信息
[root@agent ~]# slabtop -V
显示帮助信息
[root@agent ~]# slabtop --help
3.numactl如何安装
(1)安装
yum -y install numactl
(2) 使用
numactl -H #查看当前服务器的NUMA配置。
(3)参数
--show:可以查看当前的numa策略,-H:可以显示各Node中内存使用情况--membind:只从某节点分配内存,当某节点内存不足,则会分配失败,格式:numactl --membind=nodes program(nodes写你要分配的节点0或1或者其它节点数,后面是程序,可以写绝对路径,也可写服务启动脚本)--numactl:把进程绑定到某节点上,用法如下:numactl --cpunodebind=nodes program(nodes为Cpu节点,后面跟程序,)--physcpubind:把进程绑定到某核心上,如果程序运行,用法如下(参数太长就简写了,其它简写参数自己Man):numactl -C 1,3 httpd--localalloc:指令永远在当前节点分配内存,用法:numactl -l httpd--preferred:如果指定的内存无法分配足够的空间,可以指定去某一个节点的内存分配,格式如下:numactl --preferred=0 http
4.numad启动服务与关闭NUMA
(1)numad
numad是一个自动numa亲和度管理进程。监控NUMA拓扑和资源使用,来动态提高NUMA资源分配和管理。
(2)启动命令
service numad start
(3)关闭NUMA
方法一:通过bios关闭
BIOS:interleave = Disable / Enable
方法二:通过OS关闭
①编辑 /etc/default/grub 文件,加上:numa=off
GRUB_CMDLINE_LINUX="crashkernel=auto numa=off rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
②重新生成 /etc/grub2.cfg 配置文件
grub2-mkconfig -o /etc/grub2.cfg
③ 重启操作系统
reboot
④ 确认
# dmesg | grep -i numa# cat /proc/cmdline
5. perf如何安装
(1)查看当前可用的内核发行版本
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
(2)安装
yum --enablerepo=elrepo-kernel install perf
6. kernel-lt-doc与kernel-lt-tools-libs-devel如何安装
(1)查看当前可用的内核发行版本
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
(2) 安装依赖包
yum --enablerepo=elrepo-kernel install kernel-lt-doc \
kernel-lt-tools-libs-devel
7.bpftrace如何安装
(1)查询
rpm -qa | grep bcc-static
rpm -qa | grep bcc-tools
rpm -qa | grep bpftrace
rpm -qa | grep bpftrace-tools
rpm -qa | grep bpftrace-doc
(2)添加repo
curl https://repos.baslab.org/rhel/7/bpftools/bpftools.repo --output /etc/yum.repos.d/bpftools.repo
(2)安装
yum install bpftrace bpftrace-tools bpftrace-doc bcc-static -y
8. drsnoop如何使用
(1) 跟踪通过直接回收释放内存的方法,显示受影响的进程和延时
drsnoop -T