Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
e0ad2718
Commit
e0ad2718
authored
Feb 12, 2019
by
Bobby (Babak) Salamat
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Optimize scheduler cache snapshotting using an MRU structure.
parent
a2a5bd03
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
177 additions
and
58 deletions
+177
-58
generic_scheduler.go
pkg/scheduler/core/generic_scheduler.go
+13
-13
generic_scheduler_test.go
pkg/scheduler/core/generic_scheduler_test.go
+1
-1
cache.go
pkg/scheduler/internal/cache/cache.go
+150
-37
cache_test.go
pkg/scheduler/internal/cache/cache_test.go
+1
-1
BUILD
pkg/scheduler/internal/cache/fake/BUILD
+0
-1
fake_cache.go
pkg/scheduler/internal/cache/fake/fake_cache.go
+2
-3
interface.go
pkg/scheduler/internal/cache/interface.go
+10
-2
No files found.
pkg/scheduler/core/generic_scheduler.go
View file @
e0ad2718
...
@@ -141,7 +141,7 @@ type genericScheduler struct {
...
@@ -141,7 +141,7 @@ type genericScheduler struct {
extenders
[]
algorithm
.
SchedulerExtender
extenders
[]
algorithm
.
SchedulerExtender
lastNodeIndex
uint64
lastNodeIndex
uint64
alwaysCheckAllPredicates
bool
alwaysCheckAllPredicates
bool
cachedNodeInfoMap
map
[
string
]
*
schedulernodeinfo
.
NodeInfo
nodeInfoSnapshot
schedulerinternalcache
.
NodeInfoSnapshot
volumeBinder
*
volumebinder
.
VolumeBinder
volumeBinder
*
volumebinder
.
VolumeBinder
pvcLister
corelisters
.
PersistentVolumeClaimLister
pvcLister
corelisters
.
PersistentVolumeClaimLister
pdbLister
algorithm
.
PDBLister
pdbLister
algorithm
.
PDBLister
...
@@ -153,7 +153,7 @@ type genericScheduler struct {
...
@@ -153,7 +153,7 @@ type genericScheduler struct {
// functions.
// functions.
func
(
g
*
genericScheduler
)
snapshot
()
error
{
func
(
g
*
genericScheduler
)
snapshot
()
error
{
// Used for all fit and priority funcs.
// Used for all fit and priority funcs.
return
g
.
cache
.
UpdateNode
NameToInfoMap
(
g
.
cachedNodeInfoMap
)
return
g
.
cache
.
UpdateNode
InfoSnapshot
(
&
g
.
nodeInfoSnapshot
)
}
}
// Schedule tries to schedule the given pod to one of the nodes in the node list.
// Schedule tries to schedule the given pod to one of the nodes in the node list.
...
@@ -210,8 +210,8 @@ func (g *genericScheduler) Schedule(pod *v1.Pod, nodeLister algorithm.NodeLister
...
@@ -210,8 +210,8 @@ func (g *genericScheduler) Schedule(pod *v1.Pod, nodeLister algorithm.NodeLister
},
nil
},
nil
}
}
metaPrioritiesInterface
:=
g
.
priorityMetaProducer
(
pod
,
g
.
cached
NodeInfoMap
)
metaPrioritiesInterface
:=
g
.
priorityMetaProducer
(
pod
,
g
.
nodeInfoSnapshot
.
NodeInfoMap
)
priorityList
,
err
:=
PrioritizeNodes
(
pod
,
g
.
cached
NodeInfoMap
,
metaPrioritiesInterface
,
g
.
prioritizers
,
filteredNodes
,
g
.
extenders
)
priorityList
,
err
:=
PrioritizeNodes
(
pod
,
g
.
nodeInfoSnapshot
.
NodeInfoMap
,
metaPrioritiesInterface
,
g
.
prioritizers
,
filteredNodes
,
g
.
extenders
)
if
err
!=
nil
{
if
err
!=
nil
{
return
result
,
err
return
result
,
err
}
}
...
@@ -290,7 +290,7 @@ func (g *genericScheduler) Preempt(pod *v1.Pod, nodeLister algorithm.NodeLister,
...
@@ -290,7 +290,7 @@ func (g *genericScheduler) Preempt(pod *v1.Pod, nodeLister algorithm.NodeLister,
if
!
ok
||
fitError
==
nil
{
if
!
ok
||
fitError
==
nil
{
return
nil
,
nil
,
nil
,
nil
return
nil
,
nil
,
nil
,
nil
}
}
if
!
podEligibleToPreemptOthers
(
pod
,
g
.
cached
NodeInfoMap
)
{
if
!
podEligibleToPreemptOthers
(
pod
,
g
.
nodeInfoSnapshot
.
NodeInfoMap
)
{
klog
.
V
(
5
)
.
Infof
(
"Pod %v/%v is not eligible for more preemption."
,
pod
.
Namespace
,
pod
.
Name
)
klog
.
V
(
5
)
.
Infof
(
"Pod %v/%v is not eligible for more preemption."
,
pod
.
Namespace
,
pod
.
Name
)
return
nil
,
nil
,
nil
,
nil
return
nil
,
nil
,
nil
,
nil
}
}
...
@@ -311,7 +311,7 @@ func (g *genericScheduler) Preempt(pod *v1.Pod, nodeLister algorithm.NodeLister,
...
@@ -311,7 +311,7 @@ func (g *genericScheduler) Preempt(pod *v1.Pod, nodeLister algorithm.NodeLister,
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
nil
,
nil
,
err
return
nil
,
nil
,
nil
,
err
}
}
nodeToVictims
,
err
:=
selectNodesForPreemption
(
pod
,
g
.
cached
NodeInfoMap
,
potentialNodes
,
g
.
predicates
,
nodeToVictims
,
err
:=
selectNodesForPreemption
(
pod
,
g
.
nodeInfoSnapshot
.
NodeInfoMap
,
potentialNodes
,
g
.
predicates
,
g
.
predicateMetaProducer
,
g
.
schedulingQueue
,
pdbs
)
g
.
predicateMetaProducer
,
g
.
schedulingQueue
,
pdbs
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
nil
,
nil
,
err
return
nil
,
nil
,
nil
,
err
...
@@ -335,7 +335,7 @@ func (g *genericScheduler) Preempt(pod *v1.Pod, nodeLister algorithm.NodeLister,
...
@@ -335,7 +335,7 @@ func (g *genericScheduler) Preempt(pod *v1.Pod, nodeLister algorithm.NodeLister,
// nomination updates these pods and moves them to the active queue. It
// nomination updates these pods and moves them to the active queue. It
// lets scheduler find another place for them.
// lets scheduler find another place for them.
nominatedPods
:=
g
.
getLowerPriorityNominatedPods
(
pod
,
candidateNode
.
Name
)
nominatedPods
:=
g
.
getLowerPriorityNominatedPods
(
pod
,
candidateNode
.
Name
)
if
nodeInfo
,
ok
:=
g
.
cached
NodeInfoMap
[
candidateNode
.
Name
];
ok
{
if
nodeInfo
,
ok
:=
g
.
nodeInfoSnapshot
.
NodeInfoMap
[
candidateNode
.
Name
];
ok
{
return
nodeInfo
.
Node
(),
nodeToVictims
[
candidateNode
]
.
Pods
,
nominatedPods
,
nil
return
nodeInfo
.
Node
(),
nodeToVictims
[
candidateNode
]
.
Pods
,
nominatedPods
,
nil
}
}
...
@@ -355,7 +355,7 @@ func (g *genericScheduler) processPreemptionWithExtenders(
...
@@ -355,7 +355,7 @@ func (g *genericScheduler) processPreemptionWithExtenders(
newNodeToVictims
,
err
:=
extender
.
ProcessPreemption
(
newNodeToVictims
,
err
:=
extender
.
ProcessPreemption
(
pod
,
pod
,
nodeToVictims
,
nodeToVictims
,
g
.
cached
NodeInfoMap
,
g
.
nodeInfoSnapshot
.
NodeInfoMap
,
)
)
if
err
!=
nil
{
if
err
!=
nil
{
if
extender
.
IsIgnorable
()
{
if
extender
.
IsIgnorable
()
{
...
@@ -452,14 +452,14 @@ func (g *genericScheduler) findNodesThatFit(pod *v1.Pod, nodes []*v1.Node) ([]*v
...
@@ -452,14 +452,14 @@ func (g *genericScheduler) findNodesThatFit(pod *v1.Pod, nodes []*v1.Node) ([]*v
ctx
,
cancel
:=
context
.
WithCancel
(
context
.
Background
())
ctx
,
cancel
:=
context
.
WithCancel
(
context
.
Background
())
// We can use the same metadata producer for all nodes.
// We can use the same metadata producer for all nodes.
meta
:=
g
.
predicateMetaProducer
(
pod
,
g
.
cached
NodeInfoMap
)
meta
:=
g
.
predicateMetaProducer
(
pod
,
g
.
nodeInfoSnapshot
.
NodeInfoMap
)
checkNode
:=
func
(
i
int
)
{
checkNode
:=
func
(
i
int
)
{
nodeName
:=
g
.
cache
.
NodeTree
()
.
Next
()
nodeName
:=
g
.
cache
.
NodeTree
()
.
Next
()
fits
,
failedPredicates
,
err
:=
podFitsOnNode
(
fits
,
failedPredicates
,
err
:=
podFitsOnNode
(
pod
,
pod
,
meta
,
meta
,
g
.
cached
NodeInfoMap
[
nodeName
],
g
.
nodeInfoSnapshot
.
NodeInfoMap
[
nodeName
],
g
.
predicates
,
g
.
predicates
,
g
.
schedulingQueue
,
g
.
schedulingQueue
,
g
.
alwaysCheckAllPredicates
,
g
.
alwaysCheckAllPredicates
,
...
@@ -476,7 +476,7 @@ func (g *genericScheduler) findNodesThatFit(pod *v1.Pod, nodes []*v1.Node) ([]*v
...
@@ -476,7 +476,7 @@ func (g *genericScheduler) findNodesThatFit(pod *v1.Pod, nodes []*v1.Node) ([]*v
cancel
()
cancel
()
atomic
.
AddInt32
(
&
filteredLen
,
-
1
)
atomic
.
AddInt32
(
&
filteredLen
,
-
1
)
}
else
{
}
else
{
filtered
[
length
-
1
]
=
g
.
cached
NodeInfoMap
[
nodeName
]
.
Node
()
filtered
[
length
-
1
]
=
g
.
nodeInfoSnapshot
.
NodeInfoMap
[
nodeName
]
.
Node
()
}
}
}
else
{
}
else
{
predicateResultLock
.
Lock
()
predicateResultLock
.
Lock
()
...
@@ -500,7 +500,7 @@ func (g *genericScheduler) findNodesThatFit(pod *v1.Pod, nodes []*v1.Node) ([]*v
...
@@ -500,7 +500,7 @@ func (g *genericScheduler) findNodesThatFit(pod *v1.Pod, nodes []*v1.Node) ([]*v
if
!
extender
.
IsInterested
(
pod
)
{
if
!
extender
.
IsInterested
(
pod
)
{
continue
continue
}
}
filteredList
,
failedMap
,
err
:=
extender
.
Filter
(
pod
,
filtered
,
g
.
cached
NodeInfoMap
)
filteredList
,
failedMap
,
err
:=
extender
.
Filter
(
pod
,
filtered
,
g
.
nodeInfoSnapshot
.
NodeInfoMap
)
if
err
!=
nil
{
if
err
!=
nil
{
if
extender
.
IsIgnorable
()
{
if
extender
.
IsIgnorable
()
{
klog
.
Warningf
(
"Skipping extender %v as it returned error %v and has ignorable flag set"
,
klog
.
Warningf
(
"Skipping extender %v as it returned error %v and has ignorable flag set"
,
...
@@ -1193,7 +1193,7 @@ func NewGenericScheduler(
...
@@ -1193,7 +1193,7 @@ func NewGenericScheduler(
priorityMetaProducer
:
priorityMetaProducer
,
priorityMetaProducer
:
priorityMetaProducer
,
pluginSet
:
pluginSet
,
pluginSet
:
pluginSet
,
extenders
:
extenders
,
extenders
:
extenders
,
cachedNodeInfoMap
:
make
(
map
[
string
]
*
schedulernodeinfo
.
NodeInfo
),
nodeInfoSnapshot
:
schedulerinternalcache
.
NewNodeInfoSnapshot
(
),
volumeBinder
:
volumeBinder
,
volumeBinder
:
volumeBinder
,
pvcLister
:
pvcLister
,
pvcLister
:
pvcLister
,
pdbLister
:
pdbLister
,
pdbLister
:
pdbLister
,
...
...
pkg/scheduler/core/generic_scheduler_test.go
View file @
e0ad2718
...
@@ -513,7 +513,7 @@ func makeScheduler(predicates map[string]algorithmpredicates.FitPredicate, nodes
...
@@ -513,7 +513,7 @@ func makeScheduler(predicates map[string]algorithmpredicates.FitPredicate, nodes
emptyPluginSet
,
emptyPluginSet
,
nil
,
nil
,
nil
,
nil
,
false
,
false
,
nil
,
nil
,
nil
,
nil
,
false
,
false
,
schedulerapi
.
DefaultPercentageOfNodesToScore
)
schedulerapi
.
DefaultPercentageOfNodesToScore
)
cache
.
UpdateNode
NameToInfoMap
(
s
.
(
*
genericScheduler
)
.
cachedNodeInfoMap
)
cache
.
UpdateNode
InfoSnapshot
(
&
s
.
(
*
genericScheduler
)
.
nodeInfoSnapshot
)
return
s
.
(
*
genericScheduler
)
return
s
.
(
*
genericScheduler
)
}
}
...
...
pkg/scheduler/internal/cache/cache.go
View file @
e0ad2718
This diff is collapsed.
Click to expand it.
pkg/scheduler/internal/cache/cache_test.go
View file @
e0ad2718
...
@@ -1132,7 +1132,7 @@ func BenchmarkUpdate1kNodes30kPods(b *testing.B) {
...
@@ -1132,7 +1132,7 @@ func BenchmarkUpdate1kNodes30kPods(b *testing.B) {
b
.
ResetTimer
()
b
.
ResetTimer
()
for
n
:=
0
;
n
<
b
.
N
;
n
++
{
for
n
:=
0
;
n
<
b
.
N
;
n
++
{
cachedNodes
:=
map
[
string
]
*
schedulernodeinfo
.
NodeInfo
{}
cachedNodes
:=
map
[
string
]
*
schedulernodeinfo
.
NodeInfo
{}
cache
.
UpdateNodeNameToInfoMap
(
cachedNodes
)
cache
.
SnapshotNodeInfo
(
cachedNodes
)
}
}
}
}
...
...
pkg/scheduler/internal/cache/fake/BUILD
View file @
e0ad2718
...
@@ -8,7 +8,6 @@ go_library(
...
@@ -8,7 +8,6 @@ go_library(
deps = [
deps = [
"//pkg/scheduler/algorithm:go_default_library",
"//pkg/scheduler/algorithm:go_default_library",
"//pkg/scheduler/internal/cache:go_default_library",
"//pkg/scheduler/internal/cache:go_default_library",
"//pkg/scheduler/nodeinfo:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
],
],
...
...
pkg/scheduler/internal/cache/fake/fake_cache.go
View file @
e0ad2718
...
@@ -21,7 +21,6 @@ import (
...
@@ -21,7 +21,6 @@ import (
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/kubernetes/pkg/scheduler/algorithm"
"k8s.io/kubernetes/pkg/scheduler/algorithm"
schedulerinternalcache
"k8s.io/kubernetes/pkg/scheduler/internal/cache"
schedulerinternalcache
"k8s.io/kubernetes/pkg/scheduler/internal/cache"
schedulernodeinfo
"k8s.io/kubernetes/pkg/scheduler/nodeinfo"
)
)
// Cache is used for testing
// Cache is used for testing
...
@@ -75,8 +74,8 @@ func (c *Cache) UpdateNode(oldNode, newNode *v1.Node) error { return nil }
...
@@ -75,8 +74,8 @@ func (c *Cache) UpdateNode(oldNode, newNode *v1.Node) error { return nil }
// RemoveNode is a fake method for testing.
// RemoveNode is a fake method for testing.
func
(
c
*
Cache
)
RemoveNode
(
node
*
v1
.
Node
)
error
{
return
nil
}
func
(
c
*
Cache
)
RemoveNode
(
node
*
v1
.
Node
)
error
{
return
nil
}
// UpdateNode
NameToInfoMap
is a fake method for testing.
// UpdateNode
InfoSnapshot
is a fake method for testing.
func
(
c
*
Cache
)
UpdateNode
NameToInfoMap
(
infoMap
map
[
string
]
*
schedulernodeinfo
.
NodeInfo
)
error
{
func
(
c
*
Cache
)
UpdateNode
InfoSnapshot
(
nodeSnapshot
*
schedulerinternalcache
.
NodeInfoSnapshot
)
error
{
return
nil
return
nil
}
}
...
...
pkg/scheduler/internal/cache/interface.go
View file @
e0ad2718
...
@@ -95,10 +95,10 @@ type Cache interface {
...
@@ -95,10 +95,10 @@ type Cache interface {
// RemoveNode removes overall information about node.
// RemoveNode removes overall information about node.
RemoveNode
(
node
*
v1
.
Node
)
error
RemoveNode
(
node
*
v1
.
Node
)
error
// UpdateNode
NameToInfoMap updates the passed infoMap
to the current contents of Cache.
// UpdateNode
InfoSnapshot updates the passed infoSnapshot
to the current contents of Cache.
// The node info contains aggregated information of pods scheduled (including assumed to be)
// The node info contains aggregated information of pods scheduled (including assumed to be)
// on this node.
// on this node.
UpdateNode
NameToInfoMap
(
infoMap
map
[
string
]
*
schedulernodeinfo
.
NodeInfo
)
error
UpdateNode
InfoSnapshot
(
nodeSnapshot
*
NodeInfoSnapshot
)
error
// List lists all cached pods (including assumed ones).
// List lists all cached pods (including assumed ones).
List
(
labels
.
Selector
)
([]
*
v1
.
Pod
,
error
)
List
(
labels
.
Selector
)
([]
*
v1
.
Pod
,
error
)
...
@@ -118,3 +118,11 @@ type Snapshot struct {
...
@@ -118,3 +118,11 @@ type Snapshot struct {
AssumedPods
map
[
string
]
bool
AssumedPods
map
[
string
]
bool
Nodes
map
[
string
]
*
schedulernodeinfo
.
NodeInfo
Nodes
map
[
string
]
*
schedulernodeinfo
.
NodeInfo
}
}
// NodeInfoSnapshot is a snapshot of cache NodeInfo. The scheduler takes a
// snapshot at the beginning of each scheduling cycle and uses it for its
// operations in that cycle.
type
NodeInfoSnapshot
struct
{
NodeInfoMap
map
[
string
]
*
schedulernodeinfo
.
NodeInfo
Generation
int64
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment