Add ctr support for CPUMax and CPUShares

Adds CPU.Maximum and CPU.Shares support to the ctr
cmdline for testing

Signed-off-by: Justin Terry <jlterry@amazon.com>
This commit is contained in:
Justin Terry 2022-04-14 15:21:21 -07:00
parent 0f5d4ff0ff
commit 227156dac6
4 changed files with 54 additions and 13 deletions

View File

@ -21,9 +21,18 @@ import (
) )
func init() { func init() {
ContainerFlags = append(ContainerFlags, cli.Uint64Flag{ ContainerFlags = append(ContainerFlags,
cli.Uint64Flag{
Name: "cpu-count", Name: "cpu-count",
Usage: "number of CPUs available to the container", Usage: "number of CPUs available to the container",
},
cli.Uint64Flag{
Name: "cpu-shares",
Usage: "The relative number of CPU shares given to the container relative to other workloads. Between 0 and 10,000.",
},
cli.Uint64Flag{
Name: "cpu-max",
Usage: "The number of processor cycles threads in a container can use per 10,000 cycles. Set to a percentage times 100. Between 1 and 10,000",
}, cli.StringSliceFlag{ }, cli.StringSliceFlag{
Name: "device", Name: "device",
Usage: "identifier of a device to add to the container (e.g. class://5B45201D-F2F2-4F3B-85BB-30FF1F953599)", Usage: "identifier of a device to add to the container (e.g. class://5B45201D-F2F2-4F3B-85BB-30FF1F953599)",

View File

@ -143,6 +143,14 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli
if ccount != 0 { if ccount != 0 {
opts = append(opts, oci.WithWindowsCPUCount(ccount)) opts = append(opts, oci.WithWindowsCPUCount(ccount))
} }
cshares := context.Uint64("cpu-shares")
if cshares != 0 {
opts = append(opts, oci.WithWindowsCPUShares(uint16(cshares)))
}
cmax := context.Uint64("cpu-max")
if cmax != 0 {
opts = append(opts, oci.WithWindowsCPUMaximum(uint16(cmax)))
}
for _, dev := range context.StringSlice("device") { for _, dev := range context.StringSlice("device") {
parts := strings.Split(dev, "://") parts := strings.Split(dev, "://")
if len(parts) != 2 { if len(parts) != 2 {

View File

@ -83,6 +83,10 @@ func setResources(s *Spec) {
s.Linux.Resources = &specs.LinuxResources{} s.Linux.Resources = &specs.LinuxResources{}
} }
} }
}
// nolint
func setResourcesWindows(s *Spec) {
if s.Windows != nil { if s.Windows != nil {
if s.Windows.Resources == nil { if s.Windows.Resources == nil {
s.Windows.Resources = &specs.WindowsResources{} s.Windows.Resources = &specs.WindowsResources{}
@ -98,6 +102,11 @@ func setCPU(s *Spec) {
s.Linux.Resources.CPU = &specs.LinuxCPU{} s.Linux.Resources.CPU = &specs.LinuxCPU{}
} }
} }
}
// nolint
func setCPUWindows(s *Spec) {
setResourcesWindows(s)
if s.Windows != nil { if s.Windows != nil {
if s.Windows.Resources.CPU == nil { if s.Windows.Resources.CPU == nil {
s.Windows.Resources.CPU = &specs.WindowsCPUResources{} s.Windows.Resources.CPU = &specs.WindowsCPUResources{}

View File

@ -31,17 +31,32 @@ import (
// `count` specified. // `count` specified.
func WithWindowsCPUCount(count uint64) SpecOpts { func WithWindowsCPUCount(count uint64) SpecOpts {
return func(_ context.Context, _ Client, _ *containers.Container, s *Spec) error { return func(_ context.Context, _ Client, _ *containers.Container, s *Spec) error {
if s.Windows.Resources == nil { setCPUWindows(s)
s.Windows.Resources = &specs.WindowsResources{}
}
if s.Windows.Resources.CPU == nil {
s.Windows.Resources.CPU = &specs.WindowsCPUResources{}
}
s.Windows.Resources.CPU.Count = &count s.Windows.Resources.CPU.Count = &count
return nil return nil
} }
} }
// WithWindowsCPUShares sets the `Windows.Resources.CPU.Shares` section to the
// `shares` specified.
func WithWindowsCPUShares(shares uint16) SpecOpts {
return func(_ context.Context, _ Client, _ *containers.Container, s *Spec) error {
setCPUWindows(s)
s.Windows.Resources.CPU.Shares = &shares
return nil
}
}
// WithWindowsCPUMaximum sets the `Windows.Resources.CPU.Maximum` section to the
// `max` specified.
func WithWindowsCPUMaximum(max uint16) SpecOpts {
return func(_ context.Context, _ Client, _ *containers.Container, s *Spec) error {
setCPUWindows(s)
s.Windows.Resources.CPU.Maximum = &max
return nil
}
}
// WithWindowsIgnoreFlushesDuringBoot sets `Windows.IgnoreFlushesDuringBoot`. // WithWindowsIgnoreFlushesDuringBoot sets `Windows.IgnoreFlushesDuringBoot`.
func WithWindowsIgnoreFlushesDuringBoot() SpecOpts { func WithWindowsIgnoreFlushesDuringBoot() SpecOpts {
return func(_ context.Context, _ Client, _ *containers.Container, s *Spec) error { return func(_ context.Context, _ Client, _ *containers.Container, s *Spec) error {