一、测试范围和目标
Dolphinscheduler包含四个微服务,api/master/worker/alert,性能主要体现在master和worker两个服务。
Master负责任务分发和管理,性能体现在并发处理任务的能力上,可以直接采用shell任务进行测试。
Worker负责任务的具体执行和状态上报,性能体现在并发执行的资源开销上,本次使用linkis-client提交spark任务,并观测并发执行时的内存和CPU负载情况。
二、度量指标
Master性能采用每分钟最大处理任务数进行度量,即一次性大量提交远大于master处理能力的任务值数据库中,master对任务开始进行处理,其峰值处理能力可以达到多少。
Worker性能通过记录内存和CPU负载进行比对,通过预置不同内存和CPU配置,给出并发任务逐渐增加时的观测数据。
三、Master性能
3.1 不限资源,1 master + 1 executor,普通shell任务
3.2 测试分析
当前实测性能大约为每分钟执行2500个任务
四、Worker性能测试
4.1 4c+8g,20个spark sql任务并发
4.2 4c+8g,50个spark sql任务并发
4.3 8c+16g,20个spark sql任务并发
4.4 8c+16g,50个spark sql任务并发
4.5 测试数据分析
在任务并发提交时,CPU短时负载很高,即使少量任务也可以打满CPU,在任务被全部调起后,CPU回到正常负载水平。
内存随着任务被调起执行,逐渐升高,并长时间维持在一个区间内,在任务逐渐被执行完成后,内存负载下降,并最终回到空闲状态。
五、测试相关准备
5.1 数据库数据准备
import java.sql.*;
public class DolphinTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/dolphinschedulerdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&rewriteBatchedStatements=true";
Connection conn = DriverManager.getConnection(url, "XXX", "XXX");
// process_definition_code 指定工作流
// executor_id 执行用户
// process_definition_version 指定工作流版本
PreparedStatement pstmt = conn.prepareStatement(
"insert into t_ds_command(command_type, process_definition_code, command_param" +
", task_depend_type, failure_strategy, warning_type, warning_group_id" +
", start_time, executor_id, update_time" + // schedule_time,
", process_instance_priority, worker_group, environment_code, dry_run" +
", process_instance_id, process_definition_version)" +
" values (?, ? ,?" +
", ?, ?, ?, ?" +
", ?, ?, ?" +
", ?, ?, ?, ?" +
", ?, ?)");
for (int i = 0; i < 10000; i++){
pstmt.setInt(1, 0);
pstmt.setLong(2, 12990046315936L);
pstmt.setString(3, "{}");
pstmt.setInt(4, 2);
pstmt.setInt(5, 0);
pstmt.setInt(6, 0);
pstmt.setInt(7, 0);
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
pstmt.setTimestamp(8, timestamp);
pstmt.setInt(9, 1);
pstmt.setTimestamp(10, timestamp);
pstmt.setInt(11, 2);
pstmt.setString(12, "default");
pstmt.setLong(13, -1);
pstmt.setInt(14, 0);
pstmt.setInt(15, 0);
pstmt.setInt(16, 1);
pstmt.addBatch();
}
pstmt.executeBatch();
pstmt.close();
conn.close();
}
}
5.2 master性能统计sql
select
date_format(start_time, '%Y-%m-%d %H:%i:00') as minute,
count(1)
from t_ds_task_instance
where start_time >= 'XXX' and start_time <= 'XXX'
group by minute
order by minute desc