Explorar o código

implement "-c" option to allocate a number of CPU shares to a container

Jérôme Petazzoni %!s(int64=12) %!d(string=hai) anos
pai
achega
efd9becb78

+ 1 - 0
commands_test.go

@@ -413,6 +413,7 @@ func TestAttachDisconnect(t *testing.T) {
 	container, err := NewBuilder(runtime).Create(
 		&Config{
 			Image:     GetTestImage(runtime).Id,
+			CpuShares: 1024,
 			Memory:    33554432,
 			Cmd:       []string{"/bin/cat"},
 			OpenStdin: true,

+ 4 - 0
container.go

@@ -56,6 +56,7 @@ type Config struct {
 	User         string
 	Memory       int64 // Memory limit (in bytes)
 	MemorySwap   int64 // Total memory usage (memory + swap); set `-1' to disable swap
+	CpuShares    int64 // CPU shares (relative weight vs. other containers)
 	AttachStdin  bool
 	AttachStdout bool
 	AttachStderr bool
@@ -91,6 +92,8 @@ func ParseRun(args []string, stdout io.Writer, capabilities *Capabilities) (*Con
 		*flMemory = 0
 	}
 
+	flCpuShares := cmd.Int64("c", 1024, "CPU shares (relative weight)")
+
 	var flPorts ListOpts
 	cmd.Var(&flPorts, "p", "Expose a container's port to the host (use 'docker port' to see the actual mapping)")
 
@@ -137,6 +140,7 @@ func ParseRun(args []string, stdout io.Writer, capabilities *Capabilities) (*Con
 		Tty:          *flTty,
 		OpenStdin:    *flStdin,
 		Memory:       *flMemory,
+		CpuShares:    *flCpuShares,
 		AttachStdin:  flAttach.Get("stdin"),
 		AttachStdout: flAttach.Get("stdout"),
 		AttachStderr: flAttach.Get("stderr"),

+ 8 - 2
container_test.go

@@ -390,6 +390,7 @@ func TestStart(t *testing.T) {
 		&Config{
 			Image:     GetTestImage(runtime).Id,
 			Memory:    33554432,
+			CpuShares: 1000,
 			Cmd:       []string{"/bin/cat"},
 			OpenStdin: true,
 		},
@@ -1059,12 +1060,17 @@ func TestLXCConfig(t *testing.T) {
 	memMin := 33554432
 	memMax := 536870912
 	mem := memMin + rand.Intn(memMax-memMin)
+	// CPU shares as well
+	cpuMin := 100
+	cpuMax := 10000
+	cpu := cpuMin + rand.Intn(cpuMax-cpuMin)
 	container, err := NewBuilder(runtime).Create(&Config{
 		Image: GetTestImage(runtime).Id,
 		Cmd:   []string{"/bin/true"},
 
-		Hostname: "foobar",
-		Memory:   int64(mem),
+		Hostname:  "foobar",
+		Memory:    int64(mem),
+		CpuShares: int64(cpu),
 	},
 	)
 	if err != nil {

+ 1 - 0
docs/sources/commandline/command/commit.rst

@@ -16,6 +16,7 @@ Full -run example::
 
     {"Hostname": "",
      "User": "",
+     "CpuShares": 0,
      "Memory": 0,
      "MemorySwap": 0,
      "PortSpecs": ["22", "80", "443"],

+ 1 - 0
docs/sources/commandline/command/run.rst

@@ -9,6 +9,7 @@
     Run a command in a new container
 
       -a=map[]: Attach to stdin, stdout or stderr.
+      -c=1024: CPU shares (relative weight)
       -d=false: Detached mode: leave the container running in the background
       -e=[]: Set environment variables
       -h="": Container host name

+ 3 - 0
lxc_template.go

@@ -96,6 +96,9 @@ lxc.cgroup.memory.soft_limit_in_bytes = {{.Config.Memory}}
 lxc.cgroup.memory.memsw.limit_in_bytes = {{$memSwap}}
 {{end}}
 {{end}}
+{{if .Config.CpuShares}}
+lxc.cgroup.cpu.shares = {{.Config.CpuShares}}
+{{end}}
 `
 
 var LxcTemplateCompiled *template.Template

+ 1 - 0
utils.go

@@ -486,6 +486,7 @@ func CompareConfig(a, b *Config) bool {
 		a.User != b.User ||
 		a.Memory != b.Memory ||
 		a.MemorySwap != b.MemorySwap ||
+		a.CpuShares != b.CpuShares ||
 		a.OpenStdin != b.OpenStdin ||
 		a.Tty != b.Tty {
 		return false