4.1 工具范围
本章汇总介绍了linux系统各个组件常用的性能指标观测工具,以及观测数据获取的来源,与前三章偏理论的讲解不同,本章介绍的是实际生产过程中经常会用到的命令,建议在阅读过程中可以在linux环境中执行看下有怎样的效果。
这张图列出系统各个特定资源对应的观测工具,后面的章节会分别对其中大部分命令进行详细介绍。在排查分析实际生产问题的过程中往往也需要将其中多个命令结合使用。
4.1.1 静态性能工具
这些工具更像是一些检查系统配置的工具,比如df、ethtool、ip、dmesg、fdisk、sysctl等,这些命令用来检查系统的静态配置,而不是业务的动态负载情况,其中在性能调优过程中常用到的是sysctl,它用来配置很多的系统参数,比如打开文件数、tcp回收时间、网络队列、缓存大小等等。和windows的注册表类似,修改系统配置要小心,有时会产生意想不到的故障。
4.1.2 危机处理工具
最小化安装的操作系统可能会有很多观测命令无法直接使用,本章列出了常用工具所属的软件包(debian/ubuntu),但可能与实际环境不太一样,建议给系统配置好本地yum源,使用过程缺什么工具都可以用yum来安装。
4.2 工具类型
这里根据观测对象类型(系统级和用户进程级)和方法(计数器和事件),划分了四个象限。
比如iostat 是一个系统级别的计数器类型的性能统计工具。当然有些工具不止适合一个象限,比如top展示的内容既有进程级别的资源使用情况,也有系统的CPU、内存利用率统计。
4.2.1 固定计数器
内核维护了各种提供系统统计数据的计数器,比如网络、io、中断等指标,事件发生时递增。常见的计数器有:
系统级别:vmstat、mpstat、iostat、nstat、sar
进程级别:ps、top、pmap
这些命令往往是在排查性能问题开始阶段用来了解系统和进程的基本信息用的,比如获取CPU、内存使用量,使用率靠前的进程,进程id,进程命令和位置等。但不能因为这些命令比较基础而忽视其中隐含的隐藏信息,比如top命令中展示的最近1 5 15分钟CPU延时时间、CPU使用的分布情况(系统、用户还是iowait),通过这些基础信息可以大概判断出性能问题的瓶颈在那里,为后续的排查指明方向。
4.2.2 剖析
剖析这个词对我来说比较抽象,一开始看到并不是很好理解。研究了一下概念可以简化为:在某一时刻或一个较短的时间段内,某一个指标(如CPU使用率)的构成(比如mysql select查询占用20%,io读写 15%,网络连接10%),这样可以直观地看出具体是哪个过程占用了资源。常用的剖析工具:perf,后面也会具体介绍。
4.2.3 跟踪
跟踪 就字面意思来说更好理解一些,就是获取一段较长时间内某一指标的细节信息(最常用的比如网络抓包工具tcpdump、进程调用工具strace等)。我们排查问题常用到的日志也是 跟踪 的一种形式。
系统级别:
tcpdump:网络抓包
biosnoop、execsnoop:I/O和进程追踪,要用到BCC和bpftrace,后面会有介绍
Ftrace:linux内置跟踪器
BCC、bpftrace:本书作者推荐的性能工具,后文会介绍
进程级别:
strace:跟踪进程调用,很好用的进程排查工具,可以分类跟踪进程执行过程中调用的文件、网络、信号量等信息,参数既可以加具体命令也可以指定进程id。具体实战中的使用可以参考我之前的这篇文章:云平台DNS故障导致网站访问卡顿异常排查过程,wireshark、strace等工具在实际问题排查过程中的应用方法_网站访问延迟大 抓包排查-CSDN博客
4.2.4 监测
监测指的是定期采集、记录、保存性能数据,以备之后查询。
常用的监测工具有:
sar:可以定期获取几十个不同的统计数据,包括CPU、内存、磁盘io、网络、中断等,可以通过sar命令查看,也可以在/var/log目录下面查看到记录的日志文件。
snmp:这是最常用的一种指标监测协议,不仅可以监控操作系统、进程的各种指标信息,也可以获取硬件的可用性等数据,常用的商用监控工具大多都是通过snmp来获取设备信息的。
代理:要获取特定应用的详细性能参数(如数据库死锁、tomcat线程池等),需要安装特定的代理客户端,使用代理收集信息后传给监测软件,然后处理展示。常见的有prometheus等。
4.3 监测来源
图中列举了为各种监测工具提供数据的各种接口、路径和框架。可以看到很多数据都来自/proc和/sys两个目录,下面将会具体介绍这两个目录中的内容。
而下图则列出了各个系统模块的跟踪源:
4.3.1 /proc
/proc目录也是排查linux问题时常常会访问的目录,可以直接用linux命令或通用的POSIX文件系统编程接口进行调用(open、read、close)。
目录下面有meminfo、cpuinfo、slabinfo等常用的系统性能信息,vmstat、top、free等命令也是从这些文件中获取的数据。所以直接查看这些文件可以获取到更多的信息。比如执行free查看内存使用,并不会展示其中slab占用多少,但可以从meminfo中查看。
除了系统级别的统计数据,每个运行中的进程在/proc目录下也会有一个以PID命名的文件夹,其中包含了这个进程运行过程的性能和参数信息。
实际生成过程中使用最多的是fd这个文件夹,里面有这个进程打开的所有文件的链接(包括已经建立连接的网络套接字),如果要在不停止进程的情况下清理进程日志,可以执行echo > xx(链接号)进行清空。
4.3.2 /sys
linux还提供了一个sysfs文件系统,挂载在/sys目录上,这个目录提供给运维人员一个可以直接获取和操作维护系统硬件的接口。比如在/sys/devices/system/cpu目录下可以获取到每个CPU的状态、缓存、拓扑等信息,以及通过echo直接更改online文件内容实现CPU上线和下线。
4.3.3 延时核算
linux系统开启CONFIG_TASK_DELAY_ACCT选项后,系统按以下状态跟踪每个任务的延时时间。
调度器延时:等待轮到CPU
块I/O:等待块IO完成
交换:等待换页(内存)
内存回收:等待内存回收例程
4.3.4 netlink
特殊的套接字地址族,用来获取网络相关的内核信息。ip、ss、netstat、ifconfig等命令都是通过netlink获取的。
4.3.5 tracepoint
tracepoint是linux内核代码中预置的检测点,比如系统调用、文件系统操作、磁盘I/O操作的开始和结束都有tracepoint,监测工具通过跟踪这些tracepoint来统计汇总各类性能指标。
可以使用perf list tracepoint命令查看perf命令用到的各类tracepoint:
如果想追踪某一个tracepoint,可以使用perf trace -e block:block_rq_issue。前提是要了解各个tracepoint监控的系统调用的内容。其中有进程名称和ID、时间戳和block的格式字符串(后文介绍)。
tracepoint参数和格式字符串
每个tracepoint都有一个包含事件参数的格式字符串,字符串结构可以在/sys/kernel/debug/tracing/events下面的format文件中看到。比如:
可以根据这里的格式来阅读上面perf trace命令执行的输出,可以看到各个参数对应的具体内容。也可以使用--filter 按条件进行筛选。比如:
perf trace -e block:block_rq_issue --filter ‘bytes > 1024’
tracepoint开销
tracepoint被激活时,会给每个事件增加少量CPU开销。
4.3.6 kprobes和uprobes
这两个分别是内核探针和用户空间探针。
kprobe可以跟踪任何内核函数和指令,修改运行中的内核代码的指令文本,在需要的地方插入检测逻辑。相比于trace point,kprobe是动态的,且可监测的事件数是tracepoint的几十倍。可以在bpftrace等工具中指定:
bpftrace -e 'kprobe:do_nanosleep { printf("sleep by: %s\n",comm); }'
uprobe 类似于kprobe,只是监测的内容作用于用户空间,uprobes可以动态检测应用程序和库中的函数。
4.4 sar
sar是一个常用的性能监测工具,不同的命令选项可以覆盖到操作系统性能的各个方面。
在一些操作系统中,默认开启了sar数据收集,日志文件一般存放在/var/log/sar文件夹下面。也可以执行sar命令来检查是否开启。
查询历史报告:
可以执行图中的参数来查询对应的性能指标。比如sar -u -n TCP,ETCP (-u CPU,-n TCP和TCP错误)。
也可以设定好执行间隔和次数,进行实时监控:sar -n TCP 1 5