Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
milvus
milvus
提交
b7b24977
M
milvus
项目概览
milvus
/
milvus
9 个月 前同步成功
通知
260
Star
22476
Fork
2472
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
milvus
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
b7b24977
编写于
7月 06, 2023
作者:
W
wei liu
提交者:
GitHub
7月 06, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
enable metrics expire for replica selection (#25360)
Signed-off-by:
N
Wei Liu
<
wei.liu@zilliz.com
>
上级
fe22720f
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
38 addition
and
11 deletion
+38
-11
internal/proxy/look_aside_balancer.go
internal/proxy/look_aside_balancer.go
+21
-2
internal/proxy/look_aside_balancer_test.go
internal/proxy/look_aside_balancer_test.go
+17
-9
未找到文件。
internal/proxy/look_aside_balancer.go
浏览文件 @
b7b24977
...
...
@@ -37,6 +37,7 @@ import (
var
(
checkQueryNodeHealthInterval
=
500
*
time
.
Millisecond
CostMetricsExpireTime
=
1000
*
time
.
Millisecond
)
type
LookAsideBalancer
struct
{
...
...
@@ -101,7 +102,7 @@ func (b *LookAsideBalancer) SelectNode(ctx context.Context, availableNodes []int
b
.
executingTaskTotalNQ
.
Insert
(
node
,
executingNQ
)
}
score
:=
b
.
calculateScore
(
cost
,
executingNQ
.
Load
())
score
:=
b
.
calculateScore
(
node
,
cost
,
executingNQ
.
Load
())
metrics
.
ProxyWorkLoadScore
.
WithLabelValues
(
strconv
.
FormatInt
(
node
,
10
))
.
Set
(
score
)
if
targetNode
==
-
1
||
score
<
targetScore
{
...
...
@@ -138,10 +139,18 @@ func (b *LookAsideBalancer) UpdateCostMetrics(node int64, cost *internalpb.CostA
// calculateScore compute the query node's workload score
// https://www.usenix.org/conference/nsdi15/technical-sessions/presentation/suresh
func
(
b
*
LookAsideBalancer
)
calculateScore
(
cost
*
internalpb
.
CostAggregation
,
executingNQ
int64
)
float64
{
func
(
b
*
LookAsideBalancer
)
calculateScore
(
node
int64
,
cost
*
internalpb
.
CostAggregation
,
executingNQ
int64
)
float64
{
if
cost
==
nil
||
cost
.
ResponseTime
==
0
||
cost
.
ServiceTime
==
0
{
return
math
.
Pow
(
float64
(
1
+
executingNQ
),
3.0
)
}
// for multi-replica cases, when there are no task which waiting in queue,
// the response time will effect the score, to prevent the score based on a too old value
// we expire the cost metrics by second if no task in queue.
if
executingNQ
==
0
&&
cost
.
TotalNQ
==
0
&&
b
.
isNodeCostMetricsTooOld
(
node
)
{
return
0
}
executeSpeed
:=
float64
(
cost
.
ResponseTime
)
-
float64
(
1
)
/
float64
(
cost
.
ServiceTime
)
workload
:=
math
.
Pow
(
float64
(
1
+
cost
.
TotalNQ
+
executingNQ
),
3.0
)
/
float64
(
cost
.
ServiceTime
)
if
workload
<
0.0
{
...
...
@@ -151,6 +160,16 @@ func (b *LookAsideBalancer) calculateScore(cost *internalpb.CostAggregation, exe
return
executeSpeed
+
workload
}
// if the node cost metrics hasn't been updated for a second, we think the metrics is too old
func
(
b
*
LookAsideBalancer
)
isNodeCostMetricsTooOld
(
node
int64
)
bool
{
lastUpdateTs
,
ok
:=
b
.
metricsUpdateTs
.
Get
(
node
)
if
!
ok
||
lastUpdateTs
==
0
{
return
false
}
return
time
.
Now
()
.
UnixMilli
()
-
lastUpdateTs
>
CostMetricsExpireTime
.
Milliseconds
()
}
func
(
b
*
LookAsideBalancer
)
checkQueryNodeHealthLoop
(
ctx
context
.
Context
)
{
log
:=
log
.
Ctx
(
ctx
)
.
WithRateGroup
(
"proxy.LookAsideBalancer"
,
60
,
1
)
defer
b
.
wg
.
Done
()
...
...
internal/proxy/look_aside_balancer_test.go
浏览文件 @
b7b24977
...
...
@@ -93,19 +93,19 @@ func (suite *LookAsideBalancerSuite) TestCalculateScore() {
TotalNQ
:
0
,
}
score1
:=
suite
.
balancer
.
calculateScore
(
costMetrics1
,
0
)
score2
:=
suite
.
balancer
.
calculateScore
(
costMetrics2
,
0
)
score3
:=
suite
.
balancer
.
calculateScore
(
costMetrics3
,
0
)
score4
:=
suite
.
balancer
.
calculateScore
(
costMetrics4
,
0
)
score1
:=
suite
.
balancer
.
calculateScore
(
-
1
,
costMetrics1
,
0
)
score2
:=
suite
.
balancer
.
calculateScore
(
-
1
,
costMetrics2
,
0
)
score3
:=
suite
.
balancer
.
calculateScore
(
-
1
,
costMetrics3
,
0
)
score4
:=
suite
.
balancer
.
calculateScore
(
-
1
,
costMetrics4
,
0
)
suite
.
Equal
(
float64
(
12
),
score1
)
suite
.
Equal
(
float64
(
8.5
),
score2
)
suite
.
Equal
(
float64
(
17
),
score3
)
suite
.
Equal
(
float64
(
5
),
score4
)
score5
:=
suite
.
balancer
.
calculateScore
(
costMetrics1
,
5
)
score6
:=
suite
.
balancer
.
calculateScore
(
costMetrics2
,
5
)
score7
:=
suite
.
balancer
.
calculateScore
(
costMetrics3
,
5
)
score8
:=
suite
.
balancer
.
calculateScore
(
costMetrics4
,
5
)
score5
:=
suite
.
balancer
.
calculateScore
(
-
1
,
costMetrics1
,
5
)
score6
:=
suite
.
balancer
.
calculateScore
(
-
1
,
costMetrics2
,
5
)
score7
:=
suite
.
balancer
.
calculateScore
(
-
1
,
costMetrics3
,
5
)
score8
:=
suite
.
balancer
.
calculateScore
(
-
1
,
costMetrics4
,
5
)
suite
.
Equal
(
float64
(
347
),
score5
)
suite
.
Equal
(
float64
(
176
),
score6
)
suite
.
Equal
(
float64
(
352
),
score7
)
...
...
@@ -118,8 +118,16 @@ func (suite *LookAsideBalancerSuite) TestCalculateScore() {
TotalNQ
:
math
.
MaxInt64
,
}
score9
:=
suite
.
balancer
.
calculateScore
(
costMetrics5
,
math
.
MaxInt64
)
score9
:=
suite
.
balancer
.
calculateScore
(
-
1
,
costMetrics5
,
math
.
MaxInt64
)
suite
.
Equal
(
math
.
MaxFloat64
,
score9
)
// test metrics expire
suite
.
balancer
.
metricsUpdateTs
.
Insert
(
1
,
time
.
Now
()
.
UnixMilli
())
score10
:=
suite
.
balancer
.
calculateScore
(
1
,
costMetrics4
,
0
)
suite
.
Equal
(
float64
(
5
),
score10
)
suite
.
balancer
.
metricsUpdateTs
.
Insert
(
1
,
time
.
Now
()
.
UnixMilli
()
-
5000
)
score11
:=
suite
.
balancer
.
calculateScore
(
1
,
costMetrics4
,
0
)
suite
.
Equal
(
float64
(
0
),
score11
)
}
func
(
suite
*
LookAsideBalancerSuite
)
TestSelectNode
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录