安装Lmbench

#安装依赖的开发工具和库
yum groupinstall "Development Tools"
yum install zlib-devel
#解压源代码包
tar -xzf lmbench3.tar.gz
#进入解压后的目录
cd lmbench3
#编译 Lmbench
make
#安装运行 Lmbench
#Lmbench 不需要显式安装。编译后,可执行文件将位于 bin 目录下
cd bin/x86_64-linux-gnu
./lmbench

测试系统整体性能

文件读取

#测试读取一个 1GB 大小的文件
./bw_file_rd 1G open2close hello

image.png 输出结果显示,读取 1GB 文件时的带宽为 180,795,344.33 字节/秒(约为 172.42 MB/s)。

内存复制速度

#测试复制一个 1GB 大小的内存块
./bw_mem 1G cp

image.png 输出结果显示,在复制 1GB 大小的内存块时(将内存块分为两半,前一半复制到另一半)内存复制操作的带宽为 5,797.50 MB/s(兆字节每秒)。

内存读取

#测试读取一个 1GB 大小的内存块
./bw_mem 1G rd

image.png 输出结果显示,读取 1GB 大小的内存块时系统的性能表现为内存读取操作的带宽为 12,147.42 MB/s(兆字节每秒)

内存写入

#测试写入一个 1GB 大小的内存块所需的时间
./bw_mem 1G wr

image.png 输出结果显示,写入 1GB 大小的内存块时系统的性能表现为内存写入操作的带宽为 10,045.51 MB/s(兆字节每秒)。

文件读取

#创建一个1Gb大小的临时文件
dd if=/dev/zero of=/tmp/temp_file_1gb bs=1M count=1024
#测试从打开到关闭一个 1GB 大小的文件的读取速度
./bw_file_rd 1G open2close /tmp/temp_file_1gb

image.png 输出结果显示,在读取 1GB 大小的文件时系统的性能表现为文件读取操作(从打开到关闭)的带宽为 5,914.43 MB/s(兆字节每秒)。

通过管道读取数据

#测试管道读取数据的速度。该工具不需要任何参数。
#它会在两个进程之间创建一个Unix管道,以64KB的块在管道中移动50MB数据
./bw_pipe

image.png 输出结果显示,通过管道从一个进程向另一个进程发送数据的带宽为 2,760.42 MB/s(兆字节每秒)。

内存读取延迟

#测试读取一个 1GB 大小的内存块(步长为 128 字节)
./lat_mem_rd -P 1 -N 5 1G 128

这里:

  • -P 1:表示测试的并行度为 1。您可以根据需要调整并行度。
  • -N 5:表示每个数据点的重复次数。默认值为 11,但可以根据需要调整此值。
  • 1G:表示要操作的内存块大小(1GB)。
  • 128:表示步长(以字节为单位)。在此示例中,步长为 128 字节。

运行该命令后,工具将测试读取一个 1GB 大小的内存块所需的时间,并输出内存读取延迟结果(以纳秒为单位)。 image.png 测试结果分为两列:

  • 第一列(stride):表示内存访问步长,单位为兆字节(MB)。
  • 第二列:表示相应步长下的平均内存读取延迟,单位为纳秒(ns)。

以下是对测试结果的分析:

  • 当步长较小时(例如 128 字节),内存读取延迟相对较低,约为 1.3 纳秒。
  • 随着步长的增加,内存读取延迟也相应增加。例如,在 0.03125 MB(约 32 KB)步长时,延迟为 1.315 纳秒;在 0.04688 MB(约 48 KB)步长时,延迟突然增加到 4.389 纳秒。
  • 当步长继续增加时,内存读取延迟逐渐升高。在 1 MB 步长时,延迟达到 7.319 纳秒。

这些结果说明,内存读取延迟与访问距离(步长)有关。在访问相邻内存地址时,延迟较低;但当访问距离增加时,延迟也随之增加。这与 CPU 缓存层次结构和内存子系统的特性有关。

映射和取消映射

#测试映射(mmap)和取消映射(munmap)操作的性能
#测试映射和取消映射一个 1GB 大小的文件
./lat_mmap -P 1 -N 5 1g /tmp/temp_file_1gb

这里:

  • -N 5:表示每个数据点的重复次数。默认值为 11,但您可以根据需要调整此值。
  • -P 1:表示测试的并行度为 1。您可以根据需要调整并行度。
  • /tmp/testfile:表示要用于测试的文件。请确保此文件已存在,且大小与指定的文件大小一致。
  • 1g:表示要操作的文件大小(1GB)。

运行该命令后,工具将测试映射和取消映射一个 1GB 大小的文件所需的时间,并输出映射和取消映射操作的延迟结果(以微秒为单位)。 image.png 输出结果表示在使用 lat_mmap 工具进行映射和取消映射操作时,平均延迟为 1,073.741824 微秒(约 1.074 毫秒),在这个过程中,映射和取消映射了 9,372 个页面。这些页面是 1GB 文件被映射到内存时所涉及的虚拟内存页面。

管道进程间通信延迟

#测试管道进程间通信延迟
./lat_pipe -P 1 -N 5

这里:

  • -P 1:表示测试的并行度为 1。您可以根据需要调整并行度。
  • -N 5:表示每个数据点的重复次数。默认值为 11,可以根据需要调整此值。

运行该命令后,工具将测试通过管道在两个进程之间发送和接收数据所需的时间,并输出管道进程间通信延迟结果(以微秒为单位)。 image.png 输出结果表示在使用 lat_pipe 工具进行管道进程间通信(IPC)测试时,平均延迟为 19.8120 微秒(约 0.0198 毫秒)。这个结果表示在两个进程之间通过管道发送和接收数据所需的时间。

计算处理器时钟频率

mhz工具并不直接测量处理器的时钟频率,而是通过测量处理器在执行一定数量的操作时所需的时间来估算时钟频率。

#估算处理器的时钟频率
./mhz

image.png 输出结果表示 Lmbench 的 mhz 工具估算出的处理器时钟频率约为 3064 MHz(即 3.064 GHz)。此外,根据这个估算值,每个处理器时钟周期的持续时间约为 0.3264 纳秒。

测试进程创建开销

进程创建测试:进程分叉+退出。

#将一个进程拆分为两个一样的副本
./lat_proc fork

image.png 输出结果表示 Lmbench 的 lat_proc 工具测试进程创建(分叉)和退出所需的平均时间为 130.6098 微秒。这个结果表示进程分叉和退出所需的时间

进程创建测试:创建新进程。

#测试创建新进程并让新进程运行一个新程序所需的平均时间(以微秒为单位)。
./lat_proc exec

image.png 输出结果表示 Lmbench 的 lat_proc 工具测试创建新进程并让新进程运行一个新程序所需的平均时间为 135.3500 微秒。

进程创建测试:创建新进程让 shell 运行。

#测试创建新进程并让 shell 运行
./lat_proc shell

image.png 报错,解决办法:将bin下的hello cp到/tmp目录 image.png 输出结果表示 Lmbench 的 lat_proc 工具测试创建新进程并让 shell 运行所需的平均时间为 1588.2500 微秒。

测试上下文切换时间

测试进程大小为<0k,切换次数为 10 的上下文切换时间测试

#测试在单个进程上下文切换小于 0k 大小 10 次所需的平均时间(以微秒为单位)
./lat_ctx -P 1 -s 0 10

在该命令中,-s 选项用于指定进程大小,-P 选项用于指定并发进程数,最后的10用于指定上下文切换的次数。 image.png 输出结果中,size=0k 表示堆栈大小为 0k,ovr=1.39 表示上下文切换的开销(overhead)是 1.39 微秒。接下来的两行数据表示上下文切换的时间。第一列是上下文切换次数,第二列是对应的时间(微秒)。

测试进程大小为<0k,切换次数为 100 的上下文切换时间测试

image.png

测试进程大小为<0k,切换次数为 500 的上下文切换时间测试

image.png

测试进程大小为 1k,切换次数为 10 的上下文切换时间测试

image.png

测试进程大小为 1k,切换次数为 100 的上下文切换时间测试。

image.png

测试进程大小为 1k,切换次数为 500 的上下文切换时间测试

image.png

测试进程大小为 10k,切换次数为 10 的上下文切换时间测试

image.png

测试进程大小为 10k,切换次数为 100 的上下文切换时间测试

image.png

测试进程大小为 10k,切换次数为 500 的上下文切换时间测试

image.png

测试文件创建开销

#在 /tmp 目录下执行文件创建和删除操作
./lat_fs /tmp

image.png 输出结果中的四列分别表示: 文件的大小、创建的数量、每秒创建量,每秒删除量

测试系统调用开销

测试简单调用的开销

测试一个空系统调用(null syscall)的延迟。空系统调用实际上什么也不做,只是简单地进入内核空间然后返回。它可以作为基准测试,用于比较其他系统调用的开销。

#测试一个空系统调用(null syscall)的延迟。
./lat_syscall null

image.png

测试读调用的开销

测试一个简单的 read() 系统调用的延迟。read() 系统调用从文件描述符中读取数据。

#测试一个简单的 read() 系统调用的延迟。
./lat_syscall read

image.png

测试写调用的开销

测试一个简单的 write() 系统调用的延迟。write() 系统调用将数据写入文件描述符。

#测试一个简单的 write() 系统调用的延迟。
./lat_syscall write

image.png

测试链接调用(stat)的开销

测试 stat() 系统调用的延迟。stat() 系统调用用于获取指定文件的状态信息,如文件大小、创建时间等。

#测试 stat() 系统调用的延迟。
./lat_syscall stat /tmp/temp_file_1gb

image.png

测试链接调用(fstat)的开销

测试 fstat() 系统调用的延迟。fstat() 系统调用用于获取已打开文件的状态信息,与 stat() 类似,但使用文件描述符而非文件路径。

#测试 fstat() 系统调用的延迟。
./lat_syscall fstat /tmp/temp_file_1gb

image.png

测试打开文件调用的开销

测试打开和关闭一个文件的延迟。这个命令执行 open()close() 系统调用

#测试打开和关闭一个文件的延迟。
 ./lat_syscall open /tmp/temp_file_1gb

image.png