summaryrefslogtreecommitdiffhomepage
path: root/runsc
diff options
context:
space:
mode:
authorAleksandr Razumov <a.razumov@corp.mail.ru>2019-12-17 13:06:42 +0300
committerAleksandr Razumov <a.razumov@corp.mail.ru>2019-12-17 13:27:13 +0300
commitb661434202672f920291bf5685b68772103c66cb (patch)
treeb242497f07ca106a2600910a5cd8b8ff865b23ca /runsc
parent8782f0e287df2a2fd9f9dfb3f0e1589cc15a4f91 (diff)
Add minimum CPU number and only lower CPUs on --cpu-num-from-quota
* Add `--cpu-num-min` flag to control minimum CPUs * Only lower CPU count * Fix comments
Diffstat (limited to 'runsc')
-rw-r--r--runsc/boot/config.go12
-rw-r--r--runsc/main.go4
-rw-r--r--runsc/sandbox/sandbox.go10
3 files changed, 21 insertions, 5 deletions
diff --git a/runsc/boot/config.go b/runsc/boot/config.go
index 7841d1a7a..d9f5b67c0 100644
--- a/runsc/boot/config.go
+++ b/runsc/boot/config.go
@@ -254,8 +254,14 @@ type Config struct {
// CPUNumFromQuota sets CPU number count to available CPU quota, using
// least integer value greater than or equal to quota.
//
- // E.g. 0.2 CPU quota would result in 1, and 1.9 in 2.
+ // E.g. 0.2 CPU quota will result in 1, and 1.9 in 2.
CPUNumFromQuota bool
+
+ // CPUNumMin is minimum value of CPU number setting when CPUNumFromQuota
+ // strategy is active.
+ //
+ // E.g. when CPUNumMin is 2, 0.2 CPU quota will result in 2 instead of 1.
+ CPUNumMin int
}
// ToFlags returns a slice of flags that correspond to the given Config.
@@ -289,7 +295,9 @@ func (c *Config) ToFlags() []string {
"--overlayfs-stale-read=" + strconv.FormatBool(c.OverlayfsStaleRead),
}
if c.CPUNumFromQuota {
- f = append(f, "--cpu-num-from-quota")
+ f = append(f, "--cpu-num-from-quota",
+ "--cpu-num-min="+strconv.Itoa(c.CPUNumMin),
+ )
}
// Only include these if set since it is never to be used by users.
if c.TestOnlyAllowRunAsCurrentUserWithoutChroot {
diff --git a/runsc/main.go b/runsc/main.go
index febd59aed..7c60cbb4b 100644
--- a/runsc/main.go
+++ b/runsc/main.go
@@ -82,7 +82,8 @@ var (
numNetworkChannels = flag.Int("num-network-channels", 1, "number of underlying channels(FDs) to use for network link endpoints.")
rootless = flag.Bool("rootless", false, "it allows the sandbox to be started with a user that is not root. Sandbox and Gofer processes may run with same privileges as current user.")
referenceLeakMode = flag.String("ref-leak-mode", "disabled", "sets reference leak check mode: disabled (default), log-names, log-traces.")
- cpuNumFromQuota = flag.Bool("cpu-num-from-quota", false, "set cpu number to cpu quota (least integer greater than quota value)")
+ cpuNumFromQuota = flag.Bool("cpu-num-from-quota", false, "set cpu number to cpu quota (least integer greater or equal to quota value)")
+ cpuNumMin = flag.Int("cpu-num-min", 2, "minimum number of cpu to use with --cpu-num-from-quota")
// Test flags, not to be used outside tests, ever.
testOnlyAllowRunAsCurrentUserWithoutChroot = flag.Bool("TESTONLY-unsafe-nonroot", false, "TEST ONLY; do not ever use! This skips many security measures that isolate the host from the sandbox.")
@@ -227,6 +228,7 @@ func main() {
ReferenceLeakMode: refsLeakMode,
OverlayfsStaleRead: *overlayfsStaleRead,
CPUNumFromQuota: *cpuNumFromQuota,
+ CPUNumMin: *cpuNumMin,
TestOnlyAllowRunAsCurrentUserWithoutChroot: *testOnlyAllowRunAsCurrentUserWithoutChroot,
TestOnlyTestNameEnv: *testOnlyTestNameEnv,
diff --git a/runsc/sandbox/sandbox.go b/runsc/sandbox/sandbox.go
index cbfb873d1..f6feadf75 100644
--- a/runsc/sandbox/sandbox.go
+++ b/runsc/sandbox/sandbox.go
@@ -637,8 +637,14 @@ func (s *Sandbox) createSandboxProcess(conf *boot.Config, args *Args, startSyncF
if err != nil {
return fmt.Errorf("getting cpu qouta from cgroups: %v", err)
}
- if quota > 0 {
- cpuNum = int(math.Ceil(quota))
+ if n := int(math.Ceil(quota)); n > 0 {
+ if n < conf.CPUNumMin {
+ n = conf.CPUNumMin
+ }
+ if n < cpuNum {
+ // Only lower the cpu number.
+ cpuNum = n
+ }
}
}
cmd.Args = append(cmd.Args, "--cpu-num", strconv.Itoa(cpuNum))