常用工具
进程
strace
# ps -ef | grep c-init-sig
root 15857 14391 0 06:23 pts/0 00:00:00 docker run -it registry/fwd_sig:v1 /c-init-sig
root 15909 15879 0 06:23 pts/0 00:00:00 /c-init-sig
root 15959 15909 0 06:23 pts/0 00:00:00 /c-init-sig
root 16046 14607 0 06:23 pts/3 00:00:00 grep --color=auto c-init-sig
# 15909 是容器内的 init 进程
# strace -p 15909
strace: Process 15909 attached
restart_syscall(<... resuming interrupted read ...>) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=0, si_uid=0} ---
write(1, "received SIGTERM\n", 17) = 17
exit_group(0) = ?
+++ exited with 0 +++
# 15959 是容器内由 init 进程创建的其他进程
# strace -p 15959
strace: Process 15959 attached
restart_syscall(<... resuming interrupted read ...>) = ?
+++ killed by SIGKILL +++在每个 Linux 发行版都有这个工具,安装方式:
CentOS:
yum install prefUbuntu:
apt install linux-tools-common
对于定位 CPU Usage 异常,查找高 CPU 使用率情况下的热点函数,perf 显然是最有力的工具。在 CPU Usage 增高的节点上找到具体的引起 CPU 增高的函数,然后就可以有针对性地聚焦到那个函数做分析。
通常分为三个步骤:
抓取数据(
pref record),命令运行结束后会在磁盘的当前目录留下perf.data文件,记录了所有采样得到的信息。数据读取(
pref script和pref report),把perf.data转化成分析脚本,然后用 FlameGraph 工具来读取脚本,生成火焰图。异常聚焦,看火焰图 X 轴占比比较大的函数。
第一次上手使用时,可以先运行一下 perf list 命令,会看到列出了大量的 event,event 是 perf 工作的基础,主要有两种:
使用硬件的 PMU 里的 event,
在内核代码中注册的 event。
Hardware event 来自处理器中的一个 PMU(Performance Monitoring Unit),这些 event 数目不多,都是底层处理器相关的行为,perf 中会命名几个通用的事件,比如 cpu-cycles,执行完成的 instructions,Cache 相关的 cache-misses。运行一下 perf stat ,可以看到在这段时间里这些 Hardware event 发生的数目。
Software event 是定义在 Linux 内核代码中的几个特定的事件,比较典型的有进程上下文切换(内核态到用户态的转换)事件 context-switches、发生缺页中断的事件 page-faults 等。
Tracepoints event 在 perf list 中数量众多,因为内核中很多关键函数里都有 Tracepoints。它的实现方式和 Software event 类似,都是在内核函数中注册了 event。这些 Tracepoints 不仅是用在 perf 中,它已经是 Linux 内核 tracing 的标准接口了,ftrace,ebpf 等工具都会用到它。
pref 使用这些 event 的方式有两种,计数和采样。
计数,统计某个 event 在一段时间里发生了多少次(
pref stats)采样,按照一定规则抽样(
pref record在不加 -e 指定 event 的时候,缺省的 event 是 Hardware event cycles)
Perf 对 event 的采样有两种模式:
按照 event 的数目(period),比如每发生 10000 次 cycles event 就记录一次 IP、进程等信息,
-c参数可以指定每发生多少次,就做一次记录。定义一个频率(frequency),
-F参数就是指定频率的。
最理想的情况是直接在宿主机上运行 pref 命令,容器中使用 pref 的注意事项:
perf 是和 Linux kernel 一起发布的,版本最好是和 Linux kernel 一样,不然可能无法正常工作,可以直接从源代码编译出静态链接的
perf。系统调用权限问题,
perf通过系统调用perf_event_open()来完成对 event 的计数或者采样。Docker 使用 seccomp 默认禁止这个系统调用,可以在启动容器的命令里,加上参数"--security-opt seccomp=unconfined" 来解决。需要允许容器在没有
SYS_ADMIN这个 capability 的情况下,也可以让 perf 访问 event。在宿主机上设置echo -1 > /proc/sys/kernel/perf_event_paranoid,这样普通的容器里也能执行 perf 。
ftrace

ftrace(function tracer)的操作都可以在 tracefs 这个虚拟文件系统中完成,对于 CentOS,这个 tracefs 的挂载点在 /sys/kernel/debug/tracing。
通过 cat trace 命令可以查看 ftrace 的输出结果,每一行的输出就是当前内核中被调用到的内核函数。在缺省状态下 ftrace 的 tracer 是 nop,也就是什么都不做。通过向挂载点内的文件执行echo 命令,来向内核的 ftrace 系统发送命令,通过 cat 文件的方式查看 ftrace 的设置结果。
利用 ftrace 里的 filter 参数做筛选:
通过
set_ftrace_filter只列出想看到的内核函数,通过
set_ftrace_pid只列出想看到的进程。
如果想要看更加完整的函数调用栈,可以打开 ftrace 中的 func_stack_trace 选项。
通过 function tracer 可以帮我们判断内核中函数是否被调用到,以及函数被调用的整个路径 也就是调用栈。
如果通过
perf发现了一个内核函数的调用频率比较高,就可以通过ftrace工具继续深入,这样就能大概知道这个函数是在什么情况下被调用到的。
如果还想知道,某个函数在内核中大致花费了多少时间,把 ftrace 的 tracer 设置为 function_graph,通过这个办法查看内核函数的调用时间。
通过 function_graph tracer,还可以看到每个函数里所有子函数的调用以及时间,这对理解和分析内核行为都是很有帮助的。
磁盘
fio
磁盘性能测试工具。
iostat
查看实际的磁盘写入速度。
xfs_quota
目录静态容量大小限制。
网络
namespace
ip
tcpdump
衡量网络性能的工具,它可以提供单向吞吐量和端到端延迟的测试。
TCP_RR 是 netperf 里专门用来测试网络延时的,缺省每次运行 10 秒钟。运行以后,计算平均每秒钟 TCP request/response 的次数,这个次数越高,就说明延时越小。
iperf3
从 iperf3 的输出 "Retr" 列里,可以看到有多少重传的数据包。
ipvsadm
查看节点上 IPVS 规则的数目。
安全
配置 Linux capabilities 的工具。
getcap
查看文件的 capabilities。
setcap
给文件设置 capabilities。
Last updated