目录
一、实验
1.环境
2.mount
3.free
4.top
5.vmstat
6.sar
7.slabtop
8.strace
9.opensnoop
10.filetop
11.cachestat
二、问题
1.Ftrace实例如何实现
2.Function trace 如何跟踪实例
3.function_graph Trace 如何跟踪实例
4.trace event 如何跟踪实例
5.未找到命令
6. fatrace有何功能
(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 | mount | 列出文件系统和它们的挂载选项 |
2 | free | 缓存容量统计信息 |
3 | top | 包括内存使用概要 |
4 | vmstat | 虚拟内存统计信息 |
5 | sar | 多种统计信息,包括历史信息 |
6 | slabtop | 内核slab分配器统计信息 |
7 | strace | 系统调用跟踪 |
8 | opensnoop | 跟踪打开的文件 |
9 | filetop | 使用中的最高IOPS和字节数的文件 |
10 | cachestat | 页缓存统计信息 |
(1) 列出挂载的文件系统与挂载选择
[root@agent ~]# mount
(1) 显示内存和交换区的统计信息
①显示正常输出,单位为MB(-m)
[root@agent ~]# free -m
② 显示宽(-w)的输出,单位为MB(-m)。
[root@agent ~]# free -mw
输出包含一个buffers列,表示缓冲区高速缓存大小,以及一个cache列,表示页缓存大小。
(1) 输出包含文件系统缓存的详细信息
[root@agent ~]# top
输出了buff/cache和avail Mem统计信息
(1) 输出包含文件系统缓存的详细信息
每秒1次,共5次输出
[root@agent ~]# vmstat 1 5
输出包含一个buffer列,表示缓冲区高速缓存大小,以及一个cache列,表示页缓存大小。
(1) 报告当前文件系统的统计信息
每秒1次,共5次输出
[root@agent ~]# sar -v 1 5
(2)-r 选项
每秒1次,共5次输出
[root@agent ~]# sar -r 1 5
输出了分别代表缓冲区高速缓存大小以及页缓存大小的kbbuffers 和 kbcached
(1) 打印有关内核slab缓存的信息,有些用于文件系统缓存
[root@agent ~]# slabtop -o
(1) 文件系统延时,测量系统操作事件
选项-tt在左侧打印出相对时间戳,而选项-T在右侧打印出系统调用事件
[root@agent ~]# strace -ttT -p 755
(1) 跟踪文件打开
① -T选项包含时间戳
[root@agent ~]# opensnoop -T
② -x 选项只显示失败的打开事件
[root@agent ~]# opensnoop -x
(1) 显示最频繁读或者写的文件名
-a显示所有文件,每秒1次,共2次输出
[root@agent ~]# filetop -a 1 2
(1) 展示页缓存命中和未命中的统计信息
每秒1次,共5次输出
[root@agent ~]# cachestat -T 1 5
(1)Ftrace 三板斧
1)设置 tracer 类型
2)设置 tracer 参数
3)使能 tracer
(1)查看
1)进入 ftrace 工作目录
cd /sys/kernel/debug/tracing
2)查看系统支持的 tracer 类型
cat available_tracers
3)Disable tracer
echo 0 > tracing_on
4)设置 tracer 类型为 function
echo function > current_tracer
5)设置 tracer 类型为 function
echo function > current_tracer
6)set_ftrace_filter 表示要跟踪的函数,这里我们只跟踪 dev_attr_show 函数
echo dev_attr_show > set_ftrace_filter
7)Enable tracer
echo 1 > tracing_on
8)提取 trace 结果
cat trace
(2)检查当前所设置的跟踪器
cat current_tracer
(3)开始跟踪
1)初始化跟踪
echo 1 > tracing_on
2)将跟踪文件保存到一个临时文件
cat trace > /tmp/trace.txt
3)禁用跟踪功能
echo 0 > tracing_on
4) 查看trace文件的输出。
cat /tmp/trace.txt | head -25
(1) 查看
1)进入 ftrace 工作目录
cd /sys/kernel/debug/tracing
2)查看系统支持的 tracer 类型
cat available_tracers
(2)设置跟踪器
①设置 tracer 类型为 function_graph
echo function_graph > current_tracer
(3)检查当前所设置的跟踪器
cat current_tracer
(4)开始跟踪
1)初始化跟踪
echo 1 > tracing_on
2)将跟踪文件保存到一个临时文件
cat trace > /tmp/grapgtrace.txt
3)禁用跟踪功能
echo 0 > tracing_on
4) 查看trace文件的输出。
cat /tmp/grapgtrace.txt | head -25
(1) 查看
1)进入 ftrace 工作目录
cd /sys/kernel/debug/tracing
2)查看系统支持的 tracer 类型
cat available_tracers
(2)打开 sched_switch
event (监控系统内进程切换事件)
1)切换目录
cd /sys/kernel/debug/tracing/events/sched/sched_switch
2)查看
ls
3)写入
echo 1 > enable
(3)设置跟踪器
①设置 tracer 类型为 function_graph
echo nop > current_tracer
(4)检查当前所设置的跟踪器
cat current_tracer
(5)开始跟踪
1)初始化跟踪
echo 1 > tracing_on
2)将跟踪文件保存到一个临时文件
cat trace > /tmp/traceevent.txt
3)禁用跟踪功能
echo 0 > tracing_on
4) 查看trace文件的输出。
cat /tmp/traceevent.txt | head -25
(6)过滤信息
1)切换目录
cd /sys/kernel/debug/tracing/events/sched/sched_switch
2)查看
cat format
(7)分析
format 信息可以看出 sched_switch
打印的信息格式,基于上面提供的关键字可以实现信息过滤
print fmt: "prev_comm=%s prev_pid=%d prev_prio=%d prev_state=%s%s ==> next_comm=%s next_pid=%d next_prio=%d", REC->prev_comm, REC->prev_pid, REC->prev_prio, (REC->prev_state & ((((0x0000 | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040) + 1) << 1) - 1)) ? __print_flags(REC->prev_state & ((((0x0000 | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040) + 1) << 1) - 1), "|", { 0x0001, "S" }, { 0x0002, "D" }, { 0x0004, "T" }, { 0x0008, "t" }, { 0x0010, "X" }, { 0x0020, "Z" }, { 0x0040, "P" }, { 0x0080, "I" }) : "R", REC->prev_state & (((0x0000 | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040) + 1) << 1) ? "+" : "", REC->next_comm, REC->next_pid, REC->next_prio
查看目录
比如下面的过滤命令可以只显示 chrome 进程的切换信息
echo "prev_comm == 'chrome' || next_comm == 'chrome'" > filter
(1)报错
(2)原因分析
未申明环境变量
(3)解决方法
① 临时申明环境变量
[root@agent sched_switch]# export PATH=$PATH:/usr/share/bcc/tools
② 永久申明环境变量
1)修改配置文件
[root@agent ~]# vim /etc/profile
export PATH=$PATH:/usr/share/bcc/tools
2)更新
[root@agent ~]# source /etc/profile
③ 成功
(1)功能
特殊的跟踪器,使用Linux的fanotify API
(2)命令
fatrace