lmbench套件

操作手册,里面介绍了每个程序的参数怎么写,作用是什么,输入输出有哪些。

下载和构建

参考仓库里的readme

gcc -O -DRUSAGE -DHAVE_uint=1 -DHAVE_int64_t=1 -DHAVE_DRAND48 -DHAVE_SCHED_SETAFFINITY=1   -c lib_tcp.c -o ../bin//lib_tcp.o
In file included from lib_tcp.c:9:
bench.h:38:10: 致命错误:rpc/rpc.h:没有那个文件或目录
   38 | #include <rpc/rpc.h>
      |          ^~~~~~~~~~~
编译中断。
gmake[1]: *** [Makefile:246:../bin//lib_tcp.o] 错误 1
gmake[1]: 离开目录“/home/admin/logs/mba_yl/lmbench3/src”
make: *** [Makefile:114:lmbench] 错误 2

$ yum install libtirpc-devel

$ find /usr -name "rpc.h"
/usr/include/gssrpc/rpc.h
/usr/include/tirpc/rpc/rpc.h

$ find /usr -name "libtirpc.so*"
/usr/lib64/libtirpc.so.3.0.0
/usr/lib64/libtirpc.so
/usr/lib64/libtirpc.so.3

这里需要对Makefile做一定的修改

CFLAGS += -I/usr/include/tirpc   # 确保编译器能找到 rpc/rpc.h
LDFLAGS += -L/usr/lib64  -ltirpc               # 链接 libtirpc 库

@env CFLAGS=-O MAKE="$(MAKE)" ... 
# 替换为
@env CFLAGS="$(CFLAGS)" MAKE="$(MAKE)" ...

lat_mem_rd

这个工具会逐渐增加内存访问的步长,开始时步长很短,得到的延迟是一级、二级缓存、LLC的缓存访问延迟;之后步长增加就得到了内存访问的延迟。

由于程序逐渐增加步长,其实一次测试还比较费时常,如果只想测某一部分的,可以修改这个程序的step函数以调整步长。
这里是部分测试数据,这个数据前面是内存访问步长,后面是对应的延迟,单位ns

484.00000 109.938
488.00000 107.705
492.00000 110.366
496.00000 108.049
500.00000 107.005
504.00000 108.194
508.00000 106.910
512.00000 108.315

bw_mem

输出数据第一个表示测试内存块大小,第二个表示理论带宽值。
调整-p参数的大小将产生不同大小的内存带宽。

自己写的内存带宽压力测试程序

指针追逐(pointer chasing)模式来制造内存访问压力。通过创建内存地址间的相互引用,强制CPU按特定顺序访问内存,使得缓存无效。并且启动多线程,同时多个内存访问请求,进一步增加带宽压力。

char* mem = mmap(NULL, memsize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
// 创建指针追逐结构
for (i = 0; i < size - 1; i++)
    *(char **)&mem[indices[i]*stride] = (char*)&mem[indices[i+1]*stride];
*(char **)&mem[indices[size-1]*stride] = (char*)&mem[indices[0]*stride];

初始化阶段可以用嵌套宏展开,也会产生大量内存访问指令。

STREAM

计算机器最大的可持续带宽。
介绍
下载
使用:

$ yum install gcc-gfortran

$ export OMP_NUM_THREADS=64; taskset -c 0-63 ./stream_c.exe
-------------------------------------------------------------
This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 10000000 (elements), Offset = 0 (elements)
Memory per array = 76.3 MiB (= 0.1 GiB).
Total memory required = 228.9 MiB (= 0.2 GiB).
Each kernel will be executed 10 times.
 The *best* time for each kernel (excluding the first iteration)
 will be used to compute the reported bandwidth.
-------------------------------------------------------------
Number of Threads requested = 64
Number of Threads counted = 64
-------------------------------------------------------------
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:          166481.9     0.001047     0.000961     0.001155
Scale:         158425.1     0.001166     0.001010     0.001274
Add:           144154.8     0.001820     0.001665     0.001890
Triad:         142683.6     0.001728     0.001682     0.001767
-------------------------------------------------------------

文章作者: 易百分
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 易百分 !
 上一篇
Linux内核页面迁移流程深入解析 Linux内核页面迁移流程深入解析
本文基于 Linux 内核页面迁移机制,以4个自定义的页面迁移函数为例,讲解怎么实现定制需求的页面迁移。
2025-04-21
下一篇 
Linux内核中的动态量化采样频率调整机制 Linux内核中的动态量化采样频率调整机制
在 Linux 内核性能分析和硬件事件监控场景中,重要的性能数据通过实时采样获取。但是,采样频率过高将自身带来不容忽视的 CPU 费用,对正在分析的系统产生打扰。
2025-03-21
  目录