01 fio磁盘性能测试

一 容器共享宿主机内核带来的影响

在第一章“容器核心基础”:03 容器镜像与UnionFS 章节里,我们提过,容器里的操作系统只有一个rootfs,没有bootfs,同一个宿主机上的多个容器,大家是共享宿主机内核的,所以一旦宿主机内核有问题,会直接影响到容器。比如当宿主机内核从ubuntu 18.04(linux内核4.15)升级到ubuntu20.04(linux内核5.4)之后,你会发现该宿主机上的容器磁盘io读写性能降低为ubuntu 18.04内核的1/8左右

在linux内核4.15之后,为了OverlayFS添加了自己的read/write接口,从而不再直接调用OverlayFS后端文件系统如XFS或Ext4的读写接口,但也只实现了同步I/O(sync I/O),没有实现异步I/O,如果我们用fio工具去测试文件系统性能,才用异步io模式,在linux5.4内核上就无法测试OverlayFS的最高性能指标。

OverlayFS 在 Linux 内核中还在不断的完善中,linux5.6内核通过打补丁的方式修复了上述问题

二 fio工具

可以用fio命令测试,详解见:https://egonlin.com/?p=250

使用示例,磁盘IO

fio -name=mytest -direct=1 -rw=read -bs=4k -size=5G -ioengine=libaio -iodepth=64 -thread -numjob=1 -filename=/dev/sda

简单参数解释
-name=mytest 指定本次测试任务名,自定义即可
-direct=1 代表从内存直接写入磁盘,即采用O_DIECT的方式,规避buffer写缓冲区带来的影响
-rw=read 代表顺序读取
-bs=4k -size=5G 代表单次IO块大小为4k,总共读取5G数据
-ioengine=libaio 代表异步读取,提交完io请求后可以继续提交下一个
-iodepth=64 则代表总共提交了多少个io请求,结合上一个参数的异步提交,此处的io提交是提交完一个立即提交下一个
-thread=1  使用pthread_create创建线程,另一种是fork创建进程。进程的开销比线程要大,一般都采用thread测试。
-numjob=1 代表启动一个任务来执行上述的IO测试,一个任务代表一个线程

-filename=/dev/sda代表测试文件名称,通常选择需要测试的盘的data目录。
-runtime=60 代表测试多长时间,测试时间为60秒,如果不写则一直将5g文件分4k每次写完为止。

三 perf性能分析工具

3.1 perf工具简单原理

perf是一款Linux性能分析工具。Linux性能计数器是一个新的基于内核的子系统,它提供一个性能分析框架,比如硬件(CPU、PMU(Performance Monitoring Unit))功能和软件(软件计数器、tracepoint)功能。通过perf,应用程序可以利用PMU、tracepoint和内核中的计数器来进行性能统计。它不但可以分析指定应用程序的性能问题(per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用程序和内核,从而全面理解应用程序中的性能瓶颈。

使用perf,可以分析程序运行期间发生的硬件事件,比如instructions retired、processor clock cycles等;也可以分析软件事件,比如page fault和进程切换。

3.2 基本使用

# 1、针对运行中的进程PID,使用perf采样函数的调用频率(对于C/C++语言,为了能够显示完整的函数栈,需要在编译时加入-g选项),如下所示
perf record -F 99 -p 进程PID -g

# 2、一段时间后,使用Ctrl+C结束抓取,会看到当前目录下有一个data.perf文件,该文件是一个二进制信息的问题;

# 3、将二进制信息转换为ASCII格式的文件,方便可视化处理:
perf script > out.perf

运行命令

[root@test04 ~]# fio -name=mytest -direct=1 -rw=read -bs=4k -size=5G -ioengine=libaio -iodepth=64 -thread -numjob=1 -filename=/dev/sda 

perf查看

fio_pid=$(ps aux |grep fio |grep -v grep | awk '{print $2}')

perf record -F 99 -p $fio_pid -g -- sleep 60

perf script > out.perf

生成火焰图,使用开源工具FlameGraph

mkdir /root/flame && cd /root/flame
git clone https://github.com/brendangregg/FlameGraph.git

cd FlameGraph/
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > kernel.svg  # 在浏览器打开该文件即可

3.3 perf工具详解

3.3.1 什么是PMU

Performance Monitor Unit,性能监视单元,其实CPU提供的一个单元,属于硬件的范畴。通过访问相关的寄存器能读取到CPU的一些性能数据,目前大部分CPU都会提供相应的PMU。

3.3.2 硬件特性之cache

内存读写是很快的,但是还是无法和处理器指令执行速度相比。为了从内存中读取指令和数据,处理器需要等待,用处理器时间来衡量,这种等待非常漫长。cache是一种SRAM,读写速度非常快,能和处理器相匹配。因此将常用的数据保存在cache中,处理器便无需等待,从而提高性能。cache的尺寸一般都很小,充分利用cache是软件调优非常重要部分。

3.3.3 tracepoints

tracepoints是散落在内核源码中的一些hook,它们可以在特定的代码被执行到时触发,这一特性可以被各种trace/debug工具所使用。

perf将tracepoint产生的时间记录下来,生成报告,通过分析这些报告,调优人员便可以了解程序运行期间内核的各种细节,对性能症状做出准确的诊断。

这些tracepint的对应的sysfs节点在/sys/kernel/debug/tracing/events目录下。

下图展示perf整体架构

3.3.4 perf 使用

perf提供的事件主要可以分为三种:

  • Hardware Event由PMU部件产生,在特定的条件下探测性能事件是否发生以及发生的次数。比如cache命中。
  • Software Event是内核产生的事件,分布在各个功能模块中,统计和操作系统相关性能事件。比如进程切换,tick数等。
  • Tracepoint Event是内核中静态tracepoint所触发的事件,这些tracepoint用来判断程序运行期间内核的行为细节,比如slab分配器的分配次数等。

perf –help之后可以看到perf的二级命令(常用的以黑体标出)

3.4.5 perf list

perf list查看当前系统支持的性能事件

sw实际上是内核的计数器,与硬件无关。

hw和cache是CPU架构相关的,依赖于具体硬件。

tracepoint是基于内核的ftrace,主线2.6.3x以上的内核版本才支持。

3.4.6 perf top

perf top类似top命令,主要用于实时分析各个函数在某个性能事件上的热度,能够快速的定位热点函数,包括应用程序函数、

模块函数与内核函数,甚至能够定位到热点指令。默认的性能事件为cpu cycles。

列名 含义
Overhead 符号引发的性能事件比例
Shared Object 符号所在的DSO(Dynamic Shared Object),可以是应用程序、内核、动态链接库、模块。
Symbol 符号名,前面的 [ ] 表示DSO类型,[.]表示此符号属于用户态的ELF文件,包括可执行文件与动态链接库,[k]表述此符号属于内核或模块

当然还可以使用

-e:指定事件

-p:指定进程

更多参数,请 perf –help

3.4.7 perf stat

用于输出指定程序的性能统计数据

各事件含义前文已有解释,这里不再赘述。

常用参数:

-p:指定进程

-a:从所有CPU上收集性能数据

-C:从指定CPU上收集数据

更多参数请参考 perf –help 或者 man

3.4.8 perf record

perf record收集采样信息,并记录在文件中,可以离线分析。使用下面的 perf report解析收集的采样数据文件。

常用方式 perf record

-e 指定事件

-p 指定进程

-g 生成调用关系(类似gcc中-g)

-o 输出文件名

采样一段时间,可以使用ctrl+c停止命令,这时会生成 perf.data 文件(默认文件名)

联系管理员微信tutu19192010,注册账号

上一篇
下一篇
Copyright © 2022 Egon的知识星球 egonlin.com 版权所有 帮助IT小伙伴学到真正的技术