性能测试工具 Lmbench 的使用方法以及解析运行结果
1. Lmbench 简介
Lmbench 是一款简易可以移植的内存测试工具,其主要功能有,带宽测评(读取缓存文件、拷贝内存、读/写内存、管道、TCP),延时测评(上下文切换、网络、文件系统的建立和删除、进程创建、信号处理、上层系统调用、内存读入反应时间)等功能。
2. 下载和安装
官网地址:http://www.bitmover.com/lmbench/
下载连接:lmbench-3.0
imaginemiracle:Downloads$ unzip lmbench-3.0-a9.zip
需要注意的是,目前解压出的 lmbench 中所有文件都不可被执行,当直接执行 make 编译后将会看到类似有 Permission denied 等一系列错误。
这里首先需要更改所有文件的权限:
imaginemiracle:Downloads$ sudo chmod 777 -R lmbench-3.0-a9/
进入 lmbench 目录,其目录结构如下。
imaginemiracle:Downloads$ cd lmbench-3.0-a9/ imaginemiracle:lmbench-3.0-a9$ ls ACKNOWLEDGEMENTS CHANGES COPYING doc Makefile results src bin ChangeSet COPYING-2 hbench-REBUTTAL README scripts
3. 使用 Lmbench 测试
执行 make results,执行后将会有以下选项提示需要设置:
- MULTIPLE COPIES: 同时运行并行测试,对应生成结果中的 scal load 项;
- Job placement selection: 作业调度控制方法,默认选 1,表示允许作业调度;
- Options to control job placement: 默认选 1;
- Memory: 设置为大于 4 倍的 cache size,该值越大结果越精确,同时运行时间越长;
- SUBSET: 要运行的子集,包含 ALL / HARWARE / OS / DEVELOPMENT,默认选 all;
- FASTMEM、SLOWFS、DISKS、REMOTE… 等选项,均保持默认即可。
设置完成后测试程序开始运行,需要注意运行时间较久,需耐心等待,或先做其他事情至少 10 min 后再看。
4. 查看结果
执行 make see 查看运行结果,若只出现两行命令,显示运行结果输出到了 summary.out 文件中,则直接查看该文件即可。cat ./results/summary.out。
将会看到如下输出:
4.1. 系统基本信息
输出结果中开始显示系统的基本参数信息。
其中:
- tlb: 表示转换后备缓存的页面数;
- cache line bytes: 高速缓存行字节数
- mem par: 存储器分层并行化;
- scal load: 并行执行的 Lmbench 数目。
4.2. 处理器 Processor 性能
如下输出结果单位均为 us,数值越小表示性能越好。
- null call: 执行 getppid 需要的时间;
- null I/O: 从 /dev/zero 读取一个字节的时长 t1,写一个字节到 /dev/null 的时长 t2,t1、t2 取平均值即为该项结果;
- stat: stat 一个文件(即得到一个文件的信息)所需时长;
- open clos: open 一个文件接着再 close 掉该文件一共所用时间(不包含读目录和节点的时间);
- slct TCP: 通过 TCP 网络连接选择 100 个文件描述符所消耗的时间;
- sig inst: install signal 所耗时长;
- sig hndl: handler signal 所耗时长;
- fork proc: fork 一个完全相同的 process,并把原来的 process 关掉一共所消耗的时间;
- exec proc: 模拟一个 shell 进程的工作过程:fork 一个新进程执行新命令消耗的时间。
- sh proc: fork 一个进程,同时询问系统 shell 来找到并运行一个新程序所用时间。
4.3. 数学运算
如下输出结果单位均为 ns,数值越小表示性能越好。
(1) 整型计算
(2) 无符号整型计算
(3) 浮点型计算
(4) 双精度浮点型计算
4.4. 上下文切换
如下输出结果单位均为 us,数值越小表示性能越好。
多个进程用 unix pipe 环连接起来,每个进程从自己的管道中读取 token,执行任务,然后将 token 写给下一个进程。
context swithing 时间包括:切换进程的时间,加上恢复进程所有状态所用的时间(包含恢复 cache 状态)。
- 2p/0k: 每个进程的 size 为 0(不执行任何任务),进程数为 2 时上下文切换所消耗的时间;
- 2p/16k: 每个进程 size 为 16K(执行任务),进程数为 2 时上下文切换所消耗的时间;
之后的测试项以此类推。
4.5. 本地通讯时延
如下输出结果单位均为 us,数值越小表示性能越好。
- 2p/0k: 每个进程的 size 为 0(不执行任何任务),进程数为 2 时上下文切换所消耗的时间;
- Pipe: 即所谓的 hot potato 测试,两个没有具体任务的进程之间使用 pipe 通信,一个 token 在两个进程间来回传递,传递一个来回所消耗时长的平均值;
- AF UNIX: 同 Pipe 测试项,但进程间通信使用的是 socket 通信;
- UDP: 同 Pipe 测试项,但进程间通信使用的是 UDP/IP 通信;
- RPC/UDP: 同 Pipe 测试项,但进程间通信使用的是 sun RPC 通信,默认情况下,RPC 采用 UDP 协议传输;
- TCP: 同 Pipe 测试项,但进程间通信使用的是 TCP/IP 通信;
- RPC/TCP: 同 Pipe 测试项,但进程间通信使用的是 sun RPC 通信,指定 RPC 采用 TCP 协议传输;
- TCP conn: 创建 socket 描述符和建立连接所用时间。
4.6. 文件、内存延时
如下输出结果单位均为 us,数值越小表示性能越好。
- 0K File Create: 0K 文件创建所用时间;
- 0K File Delete: 0K 文件删除所用时间;
- 10K File Create: 10K 文件创建所用时间;
- 10K File Delete: 10K 文件删除所用时间;
- Mmap Latency: 将指定文件的开头 n 个字节 mmap 到内存,然后 unmap,并记录每次 mmap 和 unmap 共消耗的时间,去每次消耗时间的最大值;
- Port Fault: 保护页延时时间;
- Page Faule: 缺页延时时间;
- 100fd selct: 对 100 个文件描述符配置 select 的时间。
4.7. 本地通信带宽
如下输出结果单位均为 MB/s,数值越大表示性能越好。
- Pipe: 在两个进程建立 pipe,pipe 的每个 chunk 为 64K,通过该管道移动 50MB 数据所消耗的时间;
- AF UNIX: 两个进程之间建立 unix stream socket 连接,每个 chunk 为 64K,通过该 socket 传输 10MB 数据所用的时间;
- TCP: 同 Pipe 测试项,但进程间使用 TCP/IP socket 通信,传输数据量为 3MB;
- File reread: 读文件并将其汇总一起所用的时间;
- Mmap reread: 将文件 mmap 到内存中,从内存中读文件并将其汇总一起所用时间;
- Bcopy(libc): do bw_mem $i bcopy,从指定内存区域拷贝指定数量的字节内容到另一个指定内存区域的速度;
- Bcopy(hand): do bw_mem %i fcp,把数据从磁盘的一个位置拷贝到另一个位置所用的时间;
- Mem read: bw_mem $i frd,累加数组中的整数值,测试把数据读入 processor 的带宽;
- Mem write: do bw_mem $i fwr,把整数数组的每个成员设置为 1,测试写数据到内存的带宽。
4.8. 内存操作延时
如下输出结果单位均为 ns,数值越小表示性能越好。
本地测试执行 lat_mem_rd,将整数数组中每第 4 个元素的值累加起来;测试的是读数据到 processor 的带宽。
- L1: 缓存1
- L2: 缓存2
- Main Mem: 连续内存
- Rand Mem: 内存随机访问延时
- Guesses:
假如 L1 和 L2 近似,会显示 “No L1 cache?”
假如 L2 和 Main Mem 近似,会显示 “No L2 cache?”