Filebench 是一个文件系统和存储的benchmark,可生成大量的工作负载。 与典型的基准测试不同,它非常灵活,可允许使用其广泛的工作负载模型语言(WML)指定应用程序的 I/O 行为。 语言(WML)来指定应用程序的 I/O 行为。 用户既可以从头开始描述所需的工作负载,也可以使用用户既可以从头开始描述所需的工作负载,也可以使用 Filebench 提供的工作负载个性(无论修改与否,例如邮件、网络、文件和数据库服务器工作负载)。 Filebench 同样适用于同样适用于微观和宏观基准测试,并且设置工作负载快捷,使用相对简单。

安装


Step 0: 拷贝代码

git clone https://github.com/filebench/filebench.git

Step 1: 自动工具脚本生成

repo 中不包含 Makefile.in 和 configure 文件,因此必须手动生成。为此,请确保已安装 libtoolize 和 automake 工具,并在终端命令行运行以下命令:

libtoolize
aclocal
autoheader
automake --add-missing
autoconf

Step 2: 编译安装

请确保系统中的 yacc 和 lex 可用。

sudo apt-get install flex
sudo apt-get install bison

然后进入filebench目录中进行配置、编译和安装(不要使用超级用户):

./configure
make
sudo make install

filebench使用说明以及工作负载举例


本例子中,假定Filebench的版本为 1.5-alpha1 或更高版本。 Filebench分别介绍工具两种不同的典型负载的工作流程:

  1. 用户使用工作负载模型语言(WML)描述自定义的工作负载并生成工作负载;
  2. 使用Filebench预定义的工作负载(在workloads目录下)。

举例 1: 用户自定义工作负载

Step 1:用 WML 语言创建工作负载描述。通常情况下,创建以”.f “为扩展名的工作负载文件中。在本例中,描述了一个非常简单的工作负载,它由两个进程组成,每个进程有三个线程。每个线程不断从许多文件中选择一个文件,读取文件,然后关闭文件。下面是相应的工作负载特性:

define fileset name="testF", entries=10000, filesize=16k, prealloc, path="/tmp"
define process name="readerP",instances=2 {
    thread name="readerT",instances=3 {
        flowop openfile name="openOP",filesetname="testF"
        flowop readwholefile name="readOP",filesetname="testF"
        flowop closefile name="closeOP"
    }
}

run 60

Filebench 的四个主要实体是 filesets, processes, threads, and flowops. 在在第一行中定义了fileset文件集包括5个参数,name是文件集所在目录的命名,entries表示文件集中文件的数量本例中设置 10,000 个文件, filesize表示文件集中每个文件的大小,本例中设置 16KiB,prealloc表示需要预创建文件,path表示filebench创建文件集的目录(一般为文件系统挂载点根目录), 本例中设置 /tmp 为文件集路径。

在第二第三行中,process定义了两个相同的进程名字为readerP,每个进程由三个相同的线程thread组成名字为readerT。Filebench 中的每个线程都在循环中重复其定义的 flowops(文件系统操作),在这个例子中主要描述了每个线程循环执行的流程在 “testF “文件集中依次打开文件、完全读取文件并关闭文件。 最后一行 run 60 定义了线程执行的时间,以秒为单位。

最后,为了创建复杂的工作负载中,例如,如何定义任意数量的文件集、多个不同的进程和线程不同的进程和线程,使用各种 flowops 和属性等。请参考完整的 WML 词汇表,网址为 https://github.com/filebench/filebench/wiki/Workload-model-language

Step 2: 禁用进程地址空间随机化

启用终端命令行运行以下命令: sudo bash -c "echo 0 > /proc/sys/kernel/randomize_va_space"

Step 3: Save and run

假设工作负载代码保存在 readfiles.f 文件中,在 readfiles.f 文件所在的目录下,启用终端命令行运行以下命令: sudo filebench -f varmail

举例 2: 预定义工作负载

Filebench 自带多个预定义的微基准工作负载和宏基准工作负载(例如,网络服务器webserver、文件服务器fileserver、邮件服务器varmail等),这些负载也在 WML 中进行了详细描述。大体上与上述例 1 中的工作负载差别不大,这些负载安装完成后通常位于/usr/local/share/filebench/workloads目录下。下面介绍集中常用的宏基准工作负载:

  1. Varmail工作负载模拟邮件服务器,执行许多元数据密集型的系统调用(例如creat和unlink)。为了模拟邮件的发送删除的情景,varmail进行频繁地创建和删除目录下的文件。为了模拟用户收到电子邮件立即保存的情景,varmail在每次创建完文件后,都会调用fsync传入日志,最终将数据持久化到存储设备。
  2. Fileserver模拟文件服务器是一个数据密集型的工作负载,涉及到大量读写大文件的I/O请求。但是只有少量的元数据更新和fsync请求。
  3. Webserver是读密集型工作负载。模拟网页服务器,对大量的小文件进行读取。在该工作负载下只有少量更新元数据的I/O。

以Varmail工作负载为例介绍代码流程:

set $dir=/tmp
set $nfiles=1000
set $meandirwidth=1000000
set $filesize=cvar(type=cvar-gamma,parameters=mean:16384;gamma:1.5)
set $nthreads=16
set $iosize=1m
set $meanappendsize=16k

define fileset name=bigfileset,path=$dir,size=$filesize,entries=$nfiles,dirwidth=$meandirwidth,prealloc=80

define process name=filereader,instances=1
{
  thread name=filereaderthread,memsize=10m,instances=$nthreads
  {
    flowop deletefile name=deletefile1,filesetname=bigfileset
    flowop createfile name=createfile2,filesetname=bigfileset,fd=1
    flowop appendfilerand name=appendfilerand2,iosize=$meanappendsize,fd=1
    flowop fsync name=fsyncfile2,fd=1
    flowop closefile name=closefile2,fd=1
    flowop openfile name=openfile3,filesetname=bigfileset,fd=1
    flowop readwholefile name=readfile3,fd=1,iosize=$iosize
    flowop appendfilerand name=appendfilerand3,iosize=$meanappendsize,fd=1
    flowop fsync name=fsyncfile3,fd=1
    flowop closefile name=closefile3,fd=1
    flowop openfile name=openfile4,filesetname=bigfileset,fd=1
    flowop readwholefile name=readfile4,fd=1,iosize=$iosize
    flowop closefile name=closefile4,fd=1
  }
}

echo  "Varmail Version 3.0 personality successfully loaded"

run 60

varmail.f文件中,前面set部分为设置测试文件集的全局参数。dir为文件集所在路径(也可理解为文件集进行dir目录下的文件系统性能的测试),可以修改为任何你想测试文件系统所在的挂载点目录下。nfiles为测试文件集中总文件的数目。meandirwidth为测试文件集平均每个目录下文件的数量。filesize为文件大小,cvar用于设置文件大小的分布形式,其中mean:16384表示文件集中文件平均大小。nthreads表示总共线程数目。iosize表示系统I/O请求的平均大小。后续define与自定义中的解释类似,其中prealloc=80表示预处理系数。下面执行过程中分别有nthreads个线程循环执行flowop的操作,分别是删除文件,创建文件,追加写文件,持久化,关闭文件,打开文件,读取整个文件等。

有关如何扩展 Filebench 工作负载的详细讨论,请访问 https://github.com/filebench/filebench/wiki/Scaling-Filebench-workloads

问题反馈


要询问有关 Filebench 的问题、报告错误或申请新功能,您可以使用 GitHub 的问题跟踪系统。这是用户支持和 Bug 跟踪的中心,网址是 https://github.com/filebench/filebench/issues