简介

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.xmlcore-site.xml 文件放置在 be/conf 目录下。

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

  • file_size:指定读取或写入文件的大小。

  • buffer_size:一次读取操作读取的文件块大小。

  • base_dir:指定读取或写入文件的 base 路径。

--fs_type必选参数

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

--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