Skip to content

Commit 8754425

Browse files
jschwinger233CMGS
authored andcommitted
implement RemapResource for docker engine
1 parent 6d2d3ef commit 8754425

File tree

4 files changed

+69
-8
lines changed

4 files changed

+69
-8
lines changed

engine/docker/container.go

+55-4
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ import (
1111
"path/filepath"
1212
"strconv"
1313
"strings"
14+
"sync"
1415
"time"
1516

1617
"github.com/docker/go-connections/nat"
1718
"github.com/docker/go-units"
1819
"github.com/pkg/errors"
1920

21+
corecluster "github.com/projecteru2/core/cluster"
2022
"github.com/projecteru2/core/log"
2123

2224
dockertypes "github.com/docker/docker/api/types"
@@ -31,9 +33,10 @@ import (
3133
)
3234

3335
const (
34-
minMemory = units.MiB * 4
35-
maxMemory = math.MaxInt64
36-
root = "root"
36+
minMemory = units.MiB * 4
37+
maxMemory = math.MaxInt64
38+
defaultCPUShare = 1024
39+
root = "root"
3740
)
3841

3942
type rawArgs struct {
@@ -220,8 +223,56 @@ func (e *Engine) VirtualizationCreate(ctx context.Context, opts *enginetypes.Vir
220223
return r, err
221224
}
222225

226+
// VirtualizationResourceRemap to re-distribute resource according to the whole picture
227+
// supposedly it's exclusively executed, so free feel to operate IO from remote dockerd
223228
func (e *Engine) VirtualizationResourceRemap(ctx context.Context, opts *enginetypes.VirtualizationRemapOptions) (<-chan enginetypes.VirtualizationRemapMessage, error) {
224-
return nil, nil
229+
// calculate share pool
230+
sharePool := []string{}
231+
for cpuID, available := range opts.CPUAvailable {
232+
if available >= opts.CPUShareBase {
233+
sharePool = append(sharePool, cpuID)
234+
}
235+
}
236+
shareCPUSet := strings.Join(sharePool, ",")
237+
if shareCPUSet == "" {
238+
info, err := e.Info(ctx)
239+
if err != nil {
240+
return nil, errors.WithStack(err)
241+
}
242+
shareCPUSet = fmt.Sprintf("0-%d", info.NCPU-1)
243+
}
244+
245+
// filter out workloads non-binding
246+
freeWorkloadResources := map[string]enginetypes.VirtualizationResource{}
247+
for workloadID, resource := range opts.WorkloadResources {
248+
if resource.CPU == nil {
249+
freeWorkloadResources[workloadID] = resource
250+
}
251+
}
252+
253+
// update!
254+
wg := sync.WaitGroup{}
255+
ch := make(chan enginetypes.VirtualizationRemapMessage)
256+
for id, resource := range freeWorkloadResources {
257+
// TODO@zc: limit the max goroutine
258+
wg.Add(1)
259+
go func(id string, resource enginetypes.VirtualizationResource) {
260+
defer wg.Done()
261+
updateConfig := dockercontainer.UpdateConfig{Resources: dockercontainer.Resources{
262+
CPUQuota: int64(resource.Quota * float64(corecluster.CPUPeriodBase)),
263+
CPUPeriod: corecluster.CPUPeriodBase,
264+
CpusetCpus: shareCPUSet,
265+
CPUShares: defaultCPUShare,
266+
}}
267+
_, err := e.client.ContainerUpdate(ctx, id, updateConfig)
268+
ch <- enginetypes.VirtualizationRemapMessage{
269+
ID: id,
270+
Error: err,
271+
}
272+
}(id, resource)
273+
}
274+
wg.Wait()
275+
return ch, nil
225276
}
226277

227278
// VirtualizationCopyTo copy things to virtualization

engine/docker/helper.go

+7
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"io"
1010
"io/ioutil"
11+
"math"
1112
"net"
1213
"net/http"
1314
"net/url"
@@ -118,6 +119,12 @@ func makeResourceSetting(cpu float64, memory int64, cpuMap map[string]int64, num
118119
resource.CpusetCpus = strings.Join(cpuIDs, ",")
119120
// numaNode will empty or numaNode
120121
resource.CpusetMems = numaNode
122+
// unrestrain cpu quota for binding
123+
resource.CPUQuota = -1
124+
// cpu share for fragile pieces
125+
if _, divpart := math.Modf(cpu); divpart > 0 {
126+
resource.CPUShares = int64(float64(1024) * divpart)
127+
}
121128
}
122129
resource.Memory = memory
123130
resource.MemorySwap = memory

engine/systemd/virtualization.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,9 @@ func (s *SSHClient) VirtualizationCreate(ctx context.Context, opts *enginetypes.
5353
}, errors.Wrap(err, stderr.String())
5454
}
5555

56-
func (s *SSHClient) VirtualizationResourceRemap(ctx context.Context, opts *enginetypes.VirtualizationRemapOptions) (<-chan enginetypes.VirtualizationRemapMessage, error) {
57-
return nil, nil
56+
func (s *SSHClient) VirtualizationResourceRemap(ctx context.Context, opts *enginetypes.VirtualizationRemapOptions) (ch <-chan enginetypes.VirtualizationRemapMessage, err error) {
57+
err = types.ErrEngineNotImplemented
58+
return
5859
}
5960

6061
// VirtualizationCopyTo send bytes to file system

engine/virt/virt.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"time"
1313

1414
"github.com/projecteru2/core/log"
15+
"github.com/projecteru2/core/types"
1516

1617
virtapi "github.com/projecteru2/libyavirt/client"
1718
virttypes "github.com/projecteru2/libyavirt/types"
@@ -173,8 +174,9 @@ func (v *Virt) VirtualizationCreate(ctx context.Context, opts *enginetypes.Virtu
173174
return &enginetypes.VirtualizationCreated{ID: resp.ID, Name: opts.Name}, nil
174175
}
175176

176-
func (v *Virt) VirtualizationResourceRemap(ctx context.Context, opts *enginetypes.VirtualizationRemapOptions) (<-chan enginetypes.VirtualizationRemapMessage, error) {
177-
return nil, nil
177+
func (v *Virt) VirtualizationResourceRemap(ctx context.Context, opts *enginetypes.VirtualizationRemapOptions) (ch <-chan enginetypes.VirtualizationRemapMessage, err error) {
178+
err = types.ErrEngineNotImplemented
179+
return
178180
}
179181

180182
// VirtualizationCopyTo copies one.

0 commit comments

Comments
 (0)