56f77d5ade
containers may specify these cgroup values at runtime. This will allow processes to change their priority to real-time within the container when CONFIG_RT_GROUP_SCHED is enabled in the kernel. See #22380. Also added sanity checks for the new --cpu-rt-runtime and --cpu-rt-period flags to ensure that that the kernel supports these features and that runtime is not greater than period. Daemon will support a --cpu-rt-runtime flag to initialize the parent cgroup on startup, this prevents the administrator from alotting runtime to docker after each restart. There are additional checks that could be added but maybe too far? Check parent cgroups to ensure values are <= parent, inspecting rtprio ulimit and issuing a warning. Signed-off-by: Erik St. Martin <alakriti@gmail.com>
121 lines
2.6 KiB
Go
121 lines
2.6 KiB
Go
// +build solaris,cgo
|
|
|
|
package sysinfo
|
|
|
|
import (
|
|
"bytes"
|
|
"os/exec"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
/*
|
|
#cgo LDFLAGS: -llgrp
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <sys/lgrp_user.h>
|
|
int getLgrpCount() {
|
|
lgrp_cookie_t lgrpcookie = LGRP_COOKIE_NONE;
|
|
uint_t nlgrps;
|
|
|
|
if ((lgrpcookie = lgrp_init(LGRP_VIEW_OS)) == LGRP_COOKIE_NONE) {
|
|
return -1;
|
|
}
|
|
nlgrps = lgrp_nlgrps(lgrpcookie);
|
|
return nlgrps;
|
|
}
|
|
*/
|
|
import "C"
|
|
|
|
// IsCPUSharesAvailable returns whether CPUShares setting is supported.
|
|
// We need FSS to be set as default scheduling class to support CPU Shares
|
|
func IsCPUSharesAvailable() bool {
|
|
cmd := exec.Command("/usr/sbin/dispadmin", "-d")
|
|
outBuf := new(bytes.Buffer)
|
|
errBuf := new(bytes.Buffer)
|
|
cmd.Stderr = errBuf
|
|
cmd.Stdout = outBuf
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
return false
|
|
}
|
|
return (strings.Contains(outBuf.String(), "FSS"))
|
|
}
|
|
|
|
// New returns a new SysInfo, using the filesystem to detect which features
|
|
// the kernel supports.
|
|
//NOTE Solaris: If we change the below capabilities be sure
|
|
// to update verifyPlatformContainerSettings() in daemon_solaris.go
|
|
func New(quiet bool) *SysInfo {
|
|
sysInfo := &SysInfo{}
|
|
sysInfo.cgroupMemInfo = setCgroupMem(quiet)
|
|
sysInfo.cgroupCPUInfo = setCgroupCPU(quiet)
|
|
sysInfo.cgroupBlkioInfo = setCgroupBlkioInfo(quiet)
|
|
sysInfo.cgroupCpusetInfo = setCgroupCPUsetInfo(quiet)
|
|
|
|
sysInfo.IPv4ForwardingDisabled = false
|
|
|
|
sysInfo.AppArmor = false
|
|
|
|
return sysInfo
|
|
}
|
|
|
|
// setCgroupMem reads the memory information for Solaris.
|
|
func setCgroupMem(quiet bool) cgroupMemInfo {
|
|
|
|
return cgroupMemInfo{
|
|
MemoryLimit: true,
|
|
SwapLimit: true,
|
|
MemoryReservation: false,
|
|
OomKillDisable: false,
|
|
MemorySwappiness: false,
|
|
KernelMemory: false,
|
|
}
|
|
}
|
|
|
|
// setCgroupCPU reads the cpu information for Solaris.
|
|
func setCgroupCPU(quiet bool) cgroupCPUInfo {
|
|
|
|
return cgroupCPUInfo{
|
|
CPUShares: true,
|
|
CPUCfsPeriod: false,
|
|
CPUCfsQuota: true,
|
|
CPURealtimePeriod: false,
|
|
CPURealtimeRuntime: false,
|
|
}
|
|
}
|
|
|
|
// blkio switches are not supported in Solaris.
|
|
func setCgroupBlkioInfo(quiet bool) cgroupBlkioInfo {
|
|
|
|
return cgroupBlkioInfo{
|
|
BlkioWeight: false,
|
|
BlkioWeightDevice: false,
|
|
}
|
|
}
|
|
|
|
// setCgroupCPUsetInfo reads the cpuset information for Solaris.
|
|
func setCgroupCPUsetInfo(quiet bool) cgroupCpusetInfo {
|
|
|
|
return cgroupCpusetInfo{
|
|
Cpuset: true,
|
|
Cpus: getCPUCount(),
|
|
Mems: getLgrpCount(),
|
|
}
|
|
}
|
|
|
|
func getCPUCount() string {
|
|
ncpus := C.sysconf(C._SC_NPROCESSORS_ONLN)
|
|
if ncpus <= 0 {
|
|
return ""
|
|
}
|
|
return strconv.FormatInt(int64(ncpus), 16)
|
|
}
|
|
|
|
func getLgrpCount() string {
|
|
nlgrps := C.getLgrpCount()
|
|
if nlgrps <= 0 {
|
|
return ""
|
|
}
|
|
return strconv.FormatInt(int64(nlgrps), 16)
|
|
}
|