简介

fs_benchmark_tool 可以用于测试包括 hdfs 和对象存储在内的远端存储系统的基本服务性能,如读取、写入性能。该工具主要用于分析或排查远端存储系统的性能问题。

编译与安装

fs_benchmark_tool 是 BE 代码的一部分,默认不编译。如需编译,请执行以下命令:

1. cd doris
2. BUILD_FS_BENCHMARK=ON ./build.sh  --be

编译完之后会在output/be/ 目录下生成如下相关内容:

1. bin/run-fs-benchmark.sh
2. lib/fs_benchmark_tool

注意,fs_benchmark_tool 需在BE运行环境目录下使用,因为其依赖 BE 相关的 jar 包、环境变量等内容。

使用

命令格式:

1. sh run-fs-benchmark.sh \
2. --conf=配置文件 \
3. --fs_type= 文件系统 \
4. --operation= 对文件系统的操作  \
5. --file_size= 文件的大小 \
6. --threads= 线程数量 \
7. --iterations= 迭代次数

参数解析

--conf必选参数

操作文件对应的配置文件。主要用于添加远端存储系统的相关连接信息。详见下文示例。

如连接hdfs,请将 hdfs-site.xml,core-site.xml 文件放置在 be/conf 目录下。

除连接信息外,还有以下额外参数:

  • file_size:指定读取或写入文件的大小。
  • buffer_size:一次读取操作读取的文件块大小。
  • base_dir:指定读取或写入文件的 base 路径。

--fs_type必选参数

需要操作的文件系统类型。目前支持hdfs,s3。

--operation 必选参数

指定操作类型

  • create_write :每个线程在base_dir(conf文件中设置)目录下,创建文件名为test_当前的线程号,并写入文件,写入大小为file_size。
  • open_read:在create_write创建好文件的基础下,每个线程读取文件名为test_当前的线程号的文件,读取大小为file_size。
  • single_read:读取file_path(conf文件中设置)文件,读取大小为file_size。
  • prefetch_read:使用 prefetch reader 读取file_path(conf文件中设置)文件,读取大小为file_size。仅适用于 s3。
  • exists :每个线程查询文件名为test_当前的线程号的文件是否存在。
  • rename :在create_write创建好文件的基础下,每个线程将文件名为为test_当前的线程号的文件更改为为test_当前的线程号_new。
  • list:获取 base_dir(conf文件中设置) 目录下的文件列表。

--file_size 操作的文件大小,以字节为单位。

  • create_write:默认为 10MB。
  • open_read:默认为 10MB。
  • single_read:默认为0,即读取完整文件。

--threads

操作的线程数量,默认数量为1。

--iterations

每个线程进行迭代的次数(函数执行次数),默认数量为1。

结果解析

除了rename操作外,其余操作都会重复三次,并求出平均值,中间值,标准偏差等。

1. --------------------------------------------------------------------------------------------------------------------------------
2. Benchmark                                                                      Time             CPU   Iterations UserCounters...
3. --------------------------------------------------------------------------------------------------------------------------------
4. HdfsReadBenchmark/iterations:1/repeats:3/manual_time/threads:1             13642 ms         2433 ms            1 OpenReaderTime(S)=4.80734 ReadRate(B/S)=101.104M/s ReadTime(S)=13.642 ReadTotal(B)=1.37926G
5. HdfsReadBenchmark/iterations:1/repeats:3/manual_time/threads:1              3918 ms         1711 ms            1 OpenReaderTime(S)=22.041u ReadRate(B/S)=352.011M/s ReadTime(S)=3.91824 ReadTotal(B)=1.37926G
6. HdfsReadBenchmark/iterations:1/repeats:3/manual_time/threads:1              3685 ms         1697 ms            1 OpenReaderTime(S)=35.837u ReadRate(B/S)=374.313M/s ReadTime(S)=3.68479 ReadTotal(B)=1.37926G
7. HdfsReadBenchmark/iterations:1/repeats:3/manual_time/threads:1_mean         7082 ms         1947 ms            3 OpenReaderTime(S)=1.60247 ReadRate(B/S)=275.809M/s ReadTime(S)=7.08166 ReadTotal(B)=1.37926G
8. HdfsReadBenchmark/iterations:1/repeats:3/manual_time/threads:1_median       3918 ms         1711 ms            3 OpenReaderTime(S)=35.837u ReadRate(B/S)=352.011M/s ReadTime(S)=3.91824 ReadTotal(B)=1.37926G
9. HdfsReadBenchmark/iterations:1/repeats:3/manual_time/threads:1_stddev       5683 ms          421 ms            3 OpenReaderTime(S)=2.7755 ReadRate(B/S)=151.709M/s ReadTime(S)=5.68258 ReadTotal(B)=0
10. HdfsReadBenchmark/iterations:1/repeats:3/manual_time/threads:1_cv          80.24 %         21.64 %             3 OpenReaderTime(S)=173.20% ReadRate(B/S)=55.01% ReadTime(S)=80.24% ReadTotal(B)=0.00%
11. HdfsReadBenchmark/iterations:1/repeats:3/manual_time/threads:1_max         13642 ms         2433 ms            3 OpenReaderTime(S)=4.80734 ReadRate(B/S)=374.313M/s ReadTime(S)=13.642 ReadTotal(B)=1.37926G
12. HdfsReadBenchmark/iterations:1/repeats:3/manual_time/threads:1_min          3685 ms         1697 ms            3 OpenReaderTime(S)=22.041u ReadRate(B/S)=101.104M/s ReadTime(S)=3.68479 ReadTotal(B)=1.37926G

重点关注前3行,分别代码3次重复执行的结果。其中第一次涉及到一些连接初始化等操作,所以耗时会较长。后两次通常代表正常的性能表现。

重点关注UserCounters 中的信息:

  • OpenReaderTime:打开文件的耗时。
  • ReadRate:读取速率。这里记录的是总体的吞吐。如果是多线程,可以除以线程数,即代表每线程平均速率。
  • ReadTime:读取耗时。这里记录的是多线程累计时间。除以线程数,即代表每线程平均耗时。
  • ReadTotal:读取总量。这里记录的是多线程累计值。除以线程数,即代表每线程平均读取量。
  • WriteRate:同 ReadRate。代表写入速率。
  • WriteTime:同 ReadTime。代表写入耗时。
  • WriteTotal:同 ReadTotal。代表写入总量。
  • ListCost/RenameCost/ExistsCost:对应操作的单个操作耗时。

示例

HDFS

命令:

1. sh run-fs-benchmark.sh \
2. --conf=hdfs.conf \
3. --fs_type=hdfs \
4. --operation=create_write  \
5. --file_size=1024000 \
6. --threads=3 \
7. --iterations=5

使用hdfs.conf配置文件,对hdfs文件系统进行create_write操作,使用三个线程,每次操作写入 1MB,迭代次数为5次。

hdfs.conf配置文件:

1. fs.defaultFS=hdfs://HDFS8000871
2. hadoop.username=hadoop
3. dfs.nameservices=HDFS8000871
4. dfs.ha.namenodes.HDFS8000871=nn1,nn2
5. dfs.namenode.rpc-address.HDFS8000871.nn1=102.22.10.56:4007
6. dfs.namenode.rpc-address.HDFS8000871.nn2=102.22.10.57:4007
7. dfs.client.failover.proxy.provider.HDFS8000871=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
8. base_dir=hdfs://HDFS8000871/benchmarks/TestDFSIO/io_data/

运行结果:

1. ---------------------------------------------------------------------------------------------------------------------------------------
2. Benchmark                                                                             Time             CPU   Iterations UserCounters...
3. ---------------------------------------------------------------------------------------------------------------------------------------
4. HdfsCreateWriteBenchmark/iterations:5/repeats:3/manual_time/threads:3              61.7 ms         38.7 ms           15 WriteRate(B/S)=3.31902M/s WriteTime(S)=0.387954 WriteTotal(B)=3.072M
5. HdfsCreateWriteBenchmark/iterations:5/repeats:3/manual_time/threads:3              49.6 ms         3.09 ms           15 WriteRate(B/S)=4.12967M/s WriteTime(S)=0.427992 WriteTotal(B)=3.072M
6. HdfsCreateWriteBenchmark/iterations:5/repeats:3/manual_time/threads:3              45.2 ms         2.72 ms           15 WriteRate(B/S)=4.53148M/s WriteTime(S)=0.362854 WriteTotal(B)=3.072M
7. HdfsCreateWriteBenchmark/iterations:5/repeats:3/manual_time/threads:3_mean         52.2 ms         14.8 ms            3 WriteRate(B/S)=3.99339M/s WriteTime(S)=0.392933 WriteTotal(B)=3.072M
8. HdfsCreateWriteBenchmark/iterations:5/repeats:3/manual_time/threads:3_median       49.6 ms         3.09 ms            3 WriteRate(B/S)=4.12967M/s WriteTime(S)=0.387954 WriteTotal(B)=3.072M
9. HdfsCreateWriteBenchmark/iterations:5/repeats:3/manual_time/threads:3_stddev       8.55 ms         20.7 ms            3 WriteRate(B/S)=617.61k/s WriteTime(S)=0.0328536 WriteTotal(B)=0
10. HdfsCreateWriteBenchmark/iterations:5/repeats:3/manual_time/threads:3_cv          16.39 %        139.34 %             3 WriteRate(B/S)=15.47% WriteTime(S)=8.36% WriteTotal(B)=0.00%
11. HdfsCreateWriteBenchmark/iterations:5/repeats:3/manual_time/threads:3_max          61.7 ms         38.7 ms            3 WriteRate(B/S)=4.53148M/s WriteTime(S)=0.427992 WriteTotal(B)=3.072M
12. HdfsCreateWriteBenchmark/iterations:5/repeats:3/manual_time/threads:3_min          45.2 ms         2.72 ms            3 WriteRate(B/S)=3.31902M/s WriteTime(S)=0.362854 WriteTotal(B)=3.072M
13. HDFS 上生成的文件:
14. [hadoop@172 ~]$ hadoop fs -ls -h /benchmarks/TestDFSIO/io_data/
15. Found 3 items
16. -rw-r--r--   3 hadoop supergroup        100 2023-06-27 11:55 /benchmarks/TestDFSIO/io_data/test_0
17. -rw-r--r--   3 hadoop supergroup        100 2023-06-27 11:55 /benchmarks/TestDFSIO/io_data/test_1
18. -rw-r--r--   3 hadoop supergroup        100 2023-06-27 11:55 /benchmarks/TestDFSIO/io_data/test_2

对象存储

命令:

1. sh bin/run-fs-benchmark.sh \
2. --conf=s3.conf \
3. --fs_type=s3 \
4. --operation=single_read \
5. --threads=1 \
6. --iterations=1

使用s3.conf配置文件,对 s3文件系统进行 single_read操作,使用1个线程,迭代次数为1次。

s3.conf 配置文件:

1. AWS_ACCESS_KEY=ak
2. AWS_SECRET_KEY=sk
3. AWS_ENDPOINT=cos.ap-beijing.myqcloud.com
4. AWS_REGION=ap-beijing
5. file_path=s3://bucket-123/test_data/parquet/000016_0

运行结果:

1. ------------------------------------------------------------------------------------------------------------------------------
2. Benchmark                                                                    Time             CPU   Iterations UserCounters...
3. ------------------------------------------------------------------------------------------------------------------------------
4. S3ReadBenchmark/iterations:1/repeats:3/manual_time/threads:1              7534 ms          140 ms            1 ReadRate(B/S)=11.9109M/s ReadTime(S)=7.53353 ReadTotal(B)=89.7314M
5. S3ReadBenchmark/iterations:1/repeats:3/manual_time/threads:1              5988 ms          118 ms            1 ReadRate(B/S)=14.985M/s ReadTime(S)=5.98808 ReadTotal(B)=89.7314M
6. S3ReadBenchmark/iterations:1/repeats:3/manual_time/threads:1              6060 ms          124 ms            1 ReadRate(B/S)=14.8081M/s ReadTime(S)=6.05961 ReadTotal(B)=89.7314M
7. S3ReadBenchmark/iterations:1/repeats:3/manual_time/threads:1_mean         6527 ms          127 ms            3 ReadRate(B/S)=13.9014M/s ReadTime(S)=6.52707 ReadTotal(B)=89.7314M
8. S3ReadBenchmark/iterations:1/repeats:3/manual_time/threads:1_median       6060 ms          124 ms            3 ReadRate(B/S)=14.8081M/s ReadTime(S)=6.05961 ReadTotal(B)=89.7314M
9. S3ReadBenchmark/iterations:1/repeats:3/manual_time/threads:1_stddev        872 ms         11.4 ms            3 ReadRate(B/S)=1.72602M/s ReadTime(S)=0.87235 ReadTotal(B)=0
10. S3ReadBenchmark/iterations:1/repeats:3/manual_time/threads:1_cv          13.37 %          8.94 %             3 ReadRate(B/S)=12.42% ReadTime(S)=13.37% ReadTotal(B)=0.00%
11. S3ReadBenchmark/iterations:1/repeats:3/manual_time/threads:1_max          7534 ms          140 ms            3 ReadRate(B/S)=14.985M/s ReadTime(S)=7.53353 ReadTotal(B)=89.7314M
12. S3ReadBenchmark/iterations:1/repeats:3/manual_time/threads:1_min          5988 ms          118 ms            3 ReadRate(B/S)=11.9109M/s ReadTime(S)=5.98808 ReadTotal(B)=89.7314M