-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
我看作者实验的时候用的开源的DS2代码,有没有发现DS2代码每次算子的true_process_rates是累积的,拿来作为算子并行度对应处理能力的观测值,符合预期吗?感觉不太对,求解答一下~ #2
Comments
这样每个算子的并行度对应的处理能力,一直是累增的 |
Hi, 不好意思最近因为在整理vldb 2024 pre的时候才看到了github,首先这个函数里 |
另外在 https://github.com/strymon-system/ds2/blob/master/controller/src/bin/manager.rs 保证了每次删除 log,即以前的 log 文件不会存在,那么 epoch 就会保证从 0 开始了 |
@ljqcodelove :在进行Reconfiguring后,是会把metrics_repo_path里面的log删除,然后epoch又是从0开始的,但是在[https://github.com/strymon-system/ds2/blob/master/controller/src/bin/manager.rs]:221行的update_flink_rates函数,会不断的设置log里的rates进去,之前为0的epoch的rates已经设置到了topo中,在267行后Reconfiguring之后这些topo中的rates没有清0。 随后restart后然后epoch又是从0开始,然后又会调用. 199行的 update_flink_rates->update_rates函数,完成累加的操作,这样除了第一次收集的rates不是累积的,后面其实都是累积的好像。 |
@why520it 我当时因为在腾讯机器下有文件权限问题 rust 监听权限问题没有按照 ds2 的代码去跑 |
@why520it 因为当时 ds2 我无法连续启动,所以我对于每个任务都手动写了脚本 |
当然类似 ds2.toml 里我会各种设置 |
这个项目是 腾讯犀牛鸟基金项目,ContTune部署在了腾讯TEG Oceanus,每天调k级别的任务,因为bupt是国防老八的关系,所以我们的作者list并没有出现腾讯,落地在腾讯+Flink1.13,flink1.7,flink1.9(现在支持了最新版本的flink)的代码中,由于 Flink 主要是 Scala 和 Java,所以 DS2 那块是用 java 改写的,因此线上代码也不会遇到这个 issue。 |
@ljqcodelove 十分感谢你提供的DS2,我看了一下 我这边也是为每个任务都手动写了脚本,确实很痛苦哈哈哈。 |
@why520it 其实 ContTune 真的很简单,当你能用一个 GP 拟合出并发度和处理能力的时候,对于一个输入 input rate,你只要 for 循环并发度从小到大找到第一个 GP 的mean 均值(非UCB)大于等于这个input rate 的并发度,就可以了 |
在parse.rs里:
fn update_rates(topology: &mut Topology, mut logs: HashMap<OperatorId,HashMap<OperatorInstanceId,Vec<Log>>>, epoch: Epoch) { for (op_id,instance_logs) in logs.iter_mut() { // Aggregate rates per logical operator let &(idx,_) = topology.dictionary.get(op_id).expect("Operator not found in dictionary."); match topology.logical_graph.node_weight_mut(idx) { Some(ref mut op_info) => { let op_logs = &mut op_info.rates; for (_,mut logs) in instance_logs.iter_mut() { // Make sure the given logs correspond to a single epoch, i.e. the given one assert_eq!(logs.len(),1); let mut ep = epoch; for &(_,true_proc_rate,true_out_rate,obs_proc_rate,obs_out_rate) in logs.iter() {// Add given rates to the existing ones (if any) let op_log = op_logs.entry(ep).or_insert_with(|| Rates::default()); op_log.0 += true_proc_rate; op_log.1 += true_out_rate; op_log.2 += obs_proc_rate; op_log.3 += obs_out_rate; ep += 1; } } } None => panic!("Operator not found in topology.") }; } }
The text was updated successfully, but these errors were encountered: