OLAP 系统在做ETL或者大的Adhoc 查询时,需要读取大量的数据,Doris 为了加速数据分析过程,内部会使用多线程并行的方式对多个磁盘文件扫描,会产生巨大的磁盘IO,就会对其他的查询(比如报表分析)产生影响。 可以通过Workload Group 对离线的ETL数据处理和在线的报表查询做分组,限制离线数据处理IO带宽的方式,降低它对在线报表分析的影响。
测试本地IO硬限
测试环境
1FE,1BE, 配置为96核。
测试数据集为clickbench。
不开启IO硬限测试
- 关闭缓存。
1. // 清空操作系统缓存
2. sync; echo 3 > /proc/sys/vm/drop_caches
4. // 禁用BE的page cache
5. disable_storage_page_cache = true
- 对clickbench的表执行全表扫描,执行单并发查询即可。
1. set dry_run_query = true;
2. select * from hits.hits;
- 通过Doris的内表查看当前Group的最大吞吐为3GB每秒。
1. mysql [information_schema]>select LOCAL_SCAN_BYTES_PER_SECOND / 1024 / 1024 as mb_per_sec from workload_group_resource_usage where WORKLOAD_GROUP_ID=11201;
2. +--------------------+
3. | mb_per_sec |
4. +--------------------+
5. | 1146.6208400726318 |
6. +--------------------+
7. 1 row in set (0.03 sec)
9. mysql [information_schema]>select LOCAL_SCAN_BYTES_PER_SECOND / 1024 / 1024 as mb_per_sec from workload_group_resource_usage where WORKLOAD_GROUP_ID=11201;
10. +--------------------+
11. | mb_per_sec |
12. +--------------------+
13. | 3496.2762966156006 |
14. +--------------------+
15. 1 row in set (0.04 sec)
17. mysql [information_schema]>select LOCAL_SCAN_BYTES_PER_SECOND / 1024 / 1024 as mb_per_sec from workload_group_resource_usage where WORKLOAD_GROUP_ID=11201;
18. +--------------------+
19. | mb_per_sec |
20. +--------------------+
21. | 2192.7690029144287 |
22. +--------------------+
23. 1 row in set (0.02 sec)
- 使用pidstat命令查看进程IO,图中第一列是进程id,第二列是读IO的吞吐(单位是kb/s)。可以看到不限制IO时,最大吞吐为2G每秒。

开启IO硬限后测试
- 关闭缓存。
1. // 清空操作系统缓存
2. sync; echo 3 > /proc/sys/vm/drop_caches
4. // 禁用BE的page cache
5. disable_storage_page_cache = true
- 修改Workload Group的配置,限制每秒最大吞吐为100M。
1. // 限制当前Group的读吞吐为每秒100M
2. alter workload group g2 properties('read_bytes_per_second'='104857600');
- 使用Doris系统表查看Workload Group的最大IO吞吐为每秒98M。
1. mysql [information_schema]>select LOCAL_SCAN_BYTES_PER_SECOND / 1024 / 1024 as mb_per_sec from workload_group_resource_usage where WORKLOAD_GROUP_ID=11201;
2. +--------------------+
3. | mb_per_sec |
4. +--------------------+
5. | 97.94296646118164 |
6. +--------------------+
7. 1 row in set (0.03 sec)
9. mysql [information_schema]>select LOCAL_SCAN_BYTES_PER_SECOND / 1024 / 1024 as mb_per_sec from workload_group_resource_usage where WORKLOAD_GROUP_ID=11201;
10. +--------------------+
11. | mb_per_sec |
12. +--------------------+
13. | 98.37584781646729 |
14. +--------------------+
15. 1 row in set (0.04 sec)
17. mysql [information_schema]>select LOCAL_SCAN_BYTES_PER_SECOND / 1024 / 1024 as mb_per_sec from workload_group_resource_usage where WORKLOAD_GROUP_ID=11201;
18. +--------------------+
19. | mb_per_sec |
20. +--------------------+
21. | 98.06641292572021 |
22. +--------------------+
23. 1 row in set (0.02 sec)
- 使用pid工具查看进程最大IO吞吐为每秒131M。

注意事项
- 系统表中的LOCAL_SCAN_BYTES_PER_SECOND字段代表的是当前Workload Group在进程粒度的统计汇总值,比如配置了12个文件路径,那么LOCAL_SCAN_BYTES_PER_SECOND就是这12个文件路径IO的最大值,如果期望查看每个文件路径分别的IO吞吐,可以在grafana上或者BE的bvar监控查看明细的值。
- 由于操作系统和Doris的Page Cache的存在,通过linux的IO监控脚本看到的IO通常要比系统表看到的要小。
