Merge pull request #2867 from crosbymichael/update-cgroups
Update cgroups to 1152b960fcee041f50df15cdc67c29db
This commit is contained in:
commit
d22f079e0c
@ -1,6 +1,6 @@
|
|||||||
github.com/containerd/go-runc 5a6d9f37cfa36b15efba46dc7ea349fa9b7143c3
|
github.com/containerd/go-runc 5a6d9f37cfa36b15efba46dc7ea349fa9b7143c3
|
||||||
github.com/containerd/console c12b1e7919c14469339a5d38f2f8ed9b64a9de23
|
github.com/containerd/console c12b1e7919c14469339a5d38f2f8ed9b64a9de23
|
||||||
github.com/containerd/cgroups 5e610833b72089b37d0e615de9a92dfc043757c2
|
github.com/containerd/cgroups 1152b960fcee041f50df15cdc67c29dbccf801ef
|
||||||
github.com/containerd/typeurl a93fcdb778cd272c6e9b3028b2f42d813e785d40
|
github.com/containerd/typeurl a93fcdb778cd272c6e9b3028b2f42d813e785d40
|
||||||
github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c
|
github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c
|
||||||
github.com/containerd/btrfs 2e1aa0ddf94f91fa282b6ed87c23bf0d64911244
|
github.com/containerd/btrfs 2e1aa0ddf94f91fa282b6ed87c23bf0d64911244
|
||||||
|
14
vendor/github.com/containerd/cgroups/README.md
generated
vendored
14
vendor/github.com/containerd/cgroups/README.md
generated
vendored
@ -1,8 +1,9 @@
|
|||||||
# cgroups
|
# cgroups
|
||||||
|
|
||||||
[](https://travis-ci.org/containerd/cgroups)
|
[](https://travis-ci.org/containerd/cgroups)
|
||||||
|
|
||||||
[](https://codecov.io/gh/containerd/cgroups)
|
[](https://codecov.io/gh/containerd/cgroups)
|
||||||
|
[](https://godoc.org/github.com/containerd/cgroups)
|
||||||
|
[](https://goreportcard.com/report/github.com/containerd/cgroups)
|
||||||
|
|
||||||
Go package for creating, managing, inspecting, and destroying cgroups.
|
Go package for creating, managing, inspecting, and destroying cgroups.
|
||||||
The resources format for settings on the cgroup uses the OCI runtime-spec found
|
The resources format for settings on the cgroup uses the OCI runtime-spec found
|
||||||
@ -110,3 +111,14 @@ err := control.MoveTo(destination)
|
|||||||
```go
|
```go
|
||||||
subCgroup, err := control.New("child", resources)
|
subCgroup, err := control.New("child", resources)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Project details
|
||||||
|
|
||||||
|
Cgroups is a containerd sub-project, licensed under the [Apache 2.0 license](./LICENSE).
|
||||||
|
As a containerd sub-project, you will find the:
|
||||||
|
|
||||||
|
* [Project governance](https://github.com/containerd/project/blob/master/GOVERNANCE.md),
|
||||||
|
* [Maintainers](https://github.com/containerd/project/blob/master/MAINTAINERS),
|
||||||
|
* and [Contributing guidelines](https://github.com/containerd/project/blob/master/CONTRIBUTING.md)
|
||||||
|
|
||||||
|
information in our [`containerd/project`](https://github.com/containerd/project) repository.
|
||||||
|
57
vendor/github.com/containerd/cgroups/blkio.go
generated
vendored
57
vendor/github.com/containerd/cgroups/blkio.go
generated
vendored
@ -191,31 +191,42 @@ func (b *blkioController) readEntry(devices map[deviceKey]string, path, name str
|
|||||||
}
|
}
|
||||||
|
|
||||||
func createBlkioSettings(blkio *specs.LinuxBlockIO) []blkioSettings {
|
func createBlkioSettings(blkio *specs.LinuxBlockIO) []blkioSettings {
|
||||||
settings := []blkioSettings{
|
settings := []blkioSettings{}
|
||||||
{
|
|
||||||
name: "weight",
|
if blkio.Weight != nil {
|
||||||
value: blkio.Weight,
|
|
||||||
format: uintf,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "leaf_weight",
|
|
||||||
value: blkio.LeafWeight,
|
|
||||||
format: uintf,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, wd := range blkio.WeightDevice {
|
|
||||||
settings = append(settings,
|
settings = append(settings,
|
||||||
blkioSettings{
|
blkioSettings{
|
||||||
name: "weight_device",
|
name: "weight",
|
||||||
value: wd,
|
value: blkio.Weight,
|
||||||
format: weightdev,
|
format: uintf,
|
||||||
},
|
|
||||||
blkioSettings{
|
|
||||||
name: "leaf_weight_device",
|
|
||||||
value: wd,
|
|
||||||
format: weightleafdev,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
if blkio.LeafWeight != nil {
|
||||||
|
settings = append(settings,
|
||||||
|
blkioSettings{
|
||||||
|
name: "leaf_weight",
|
||||||
|
value: blkio.LeafWeight,
|
||||||
|
format: uintf,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
for _, wd := range blkio.WeightDevice {
|
||||||
|
if wd.Weight != nil {
|
||||||
|
settings = append(settings,
|
||||||
|
blkioSettings{
|
||||||
|
name: "weight_device",
|
||||||
|
value: wd,
|
||||||
|
format: weightdev,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if wd.LeafWeight != nil {
|
||||||
|
settings = append(settings,
|
||||||
|
blkioSettings{
|
||||||
|
name: "leaf_weight_device",
|
||||||
|
value: wd,
|
||||||
|
format: weightleafdev,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
for _, t := range []struct {
|
for _, t := range []struct {
|
||||||
name string
|
name string
|
||||||
list []specs.LinuxThrottleDevice
|
list []specs.LinuxThrottleDevice
|
||||||
@ -265,12 +276,12 @@ func uintf(v interface{}) []byte {
|
|||||||
|
|
||||||
func weightdev(v interface{}) []byte {
|
func weightdev(v interface{}) []byte {
|
||||||
wd := v.(specs.LinuxWeightDevice)
|
wd := v.(specs.LinuxWeightDevice)
|
||||||
return []byte(fmt.Sprintf("%d:%d %d", wd.Major, wd.Minor, wd.Weight))
|
return []byte(fmt.Sprintf("%d:%d %d", wd.Major, wd.Minor, *wd.Weight))
|
||||||
}
|
}
|
||||||
|
|
||||||
func weightleafdev(v interface{}) []byte {
|
func weightleafdev(v interface{}) []byte {
|
||||||
wd := v.(specs.LinuxWeightDevice)
|
wd := v.(specs.LinuxWeightDevice)
|
||||||
return []byte(fmt.Sprintf("%d:%d %d", wd.Major, wd.Minor, wd.LeafWeight))
|
return []byte(fmt.Sprintf("%d:%d %d", wd.Major, wd.Minor, *wd.LeafWeight))
|
||||||
}
|
}
|
||||||
|
|
||||||
func throttleddev(v interface{}) []byte {
|
func throttleddev(v interface{}) []byte {
|
||||||
|
51
vendor/github.com/containerd/cgroups/cgroup.go
generated
vendored
51
vendor/github.com/containerd/cgroups/cgroup.go
generated
vendored
@ -48,11 +48,12 @@ func New(hierarchy Hierarchy, path Path, resources *specs.LinuxResources) (Cgrou
|
|||||||
|
|
||||||
// Load will load an existing cgroup and allow it to be controlled
|
// Load will load an existing cgroup and allow it to be controlled
|
||||||
func Load(hierarchy Hierarchy, path Path) (Cgroup, error) {
|
func Load(hierarchy Hierarchy, path Path) (Cgroup, error) {
|
||||||
|
var activeSubsystems []Subsystem
|
||||||
subsystems, err := hierarchy()
|
subsystems, err := hierarchy()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// check the the subsystems still exist
|
// check that the subsystems still exist, and keep only those that actually exist
|
||||||
for _, s := range pathers(subsystems) {
|
for _, s := range pathers(subsystems) {
|
||||||
p, err := path(s.Name())
|
p, err := path(s.Name())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -63,14 +64,15 @@ func Load(hierarchy Hierarchy, path Path) (Cgroup, error) {
|
|||||||
}
|
}
|
||||||
if _, err := os.Lstat(s.Path(p)); err != nil {
|
if _, err := os.Lstat(s.Path(p)); err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
return nil, ErrCgroupDeleted
|
continue
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
activeSubsystems = append(activeSubsystems, s)
|
||||||
}
|
}
|
||||||
return &cgroup{
|
return &cgroup{
|
||||||
path: path,
|
path: path,
|
||||||
subsystems: subsystems,
|
subsystems: activeSubsystems,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,6 +321,49 @@ func (c *cgroup) processes(subsystem Name, recursive bool) ([]Process, error) {
|
|||||||
return processes, err
|
return processes, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tasks returns the tasks running inside the cgroup along
|
||||||
|
// with the subsystem used, pid, and path
|
||||||
|
func (c *cgroup) Tasks(subsystem Name, recursive bool) ([]Task, error) {
|
||||||
|
c.mu.Lock()
|
||||||
|
defer c.mu.Unlock()
|
||||||
|
if c.err != nil {
|
||||||
|
return nil, c.err
|
||||||
|
}
|
||||||
|
return c.tasks(subsystem, recursive)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *cgroup) tasks(subsystem Name, recursive bool) ([]Task, error) {
|
||||||
|
s := c.getSubsystem(subsystem)
|
||||||
|
sp, err := c.path(subsystem)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
path := s.(pather).Path(sp)
|
||||||
|
var tasks []Task
|
||||||
|
err = filepath.Walk(path, func(p string, info os.FileInfo, err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !recursive && info.IsDir() {
|
||||||
|
if p == path {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return filepath.SkipDir
|
||||||
|
}
|
||||||
|
dir, name := filepath.Split(p)
|
||||||
|
if name != cgroupTasks {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
procs, err := readTasksPids(dir, subsystem)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
tasks = append(tasks, procs...)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return tasks, err
|
||||||
|
}
|
||||||
|
|
||||||
// Freeze freezes the entire cgroup and all the processes inside it
|
// Freeze freezes the entire cgroup and all the processes inside it
|
||||||
func (c *cgroup) Freeze() error {
|
func (c *cgroup) Freeze() error {
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
|
11
vendor/github.com/containerd/cgroups/control.go
generated
vendored
11
vendor/github.com/containerd/cgroups/control.go
generated
vendored
@ -44,6 +44,15 @@ type Process struct {
|
|||||||
Path string
|
Path string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Task struct {
|
||||||
|
// Subsystem is the name of the subsystem that the task is in
|
||||||
|
Subsystem Name
|
||||||
|
// Pid is the process id of the task
|
||||||
|
Pid int
|
||||||
|
// Path is the full path of the subsystem and location that the task is in
|
||||||
|
Path string
|
||||||
|
}
|
||||||
|
|
||||||
// Cgroup handles interactions with the individual groups to perform
|
// Cgroup handles interactions with the individual groups to perform
|
||||||
// actions on them as them main interface to this cgroup package
|
// actions on them as them main interface to this cgroup package
|
||||||
type Cgroup interface {
|
type Cgroup interface {
|
||||||
@ -64,6 +73,8 @@ type Cgroup interface {
|
|||||||
Update(resources *specs.LinuxResources) error
|
Update(resources *specs.LinuxResources) error
|
||||||
// Processes returns all the processes in a select subsystem for the cgroup
|
// Processes returns all the processes in a select subsystem for the cgroup
|
||||||
Processes(Name, bool) ([]Process, error)
|
Processes(Name, bool) ([]Process, error)
|
||||||
|
// Tasks returns all the tasks in a select subsystem for the cgroup
|
||||||
|
Tasks(Name, bool) ([]Task, error)
|
||||||
// Freeze freezes or pauses all processes inside the cgroup
|
// Freeze freezes or pauses all processes inside the cgroup
|
||||||
Freeze() error
|
Freeze() error
|
||||||
// Thaw thaw or resumes all processes inside the cgroup
|
// Thaw thaw or resumes all processes inside the cgroup
|
||||||
|
10
vendor/github.com/containerd/cgroups/cpuset.go
generated
vendored
10
vendor/github.com/containerd/cgroups/cpuset.go
generated
vendored
@ -57,21 +57,21 @@ func (c *cpusetController) Create(path string, resources *specs.LinuxResources)
|
|||||||
if resources.CPU != nil {
|
if resources.CPU != nil {
|
||||||
for _, t := range []struct {
|
for _, t := range []struct {
|
||||||
name string
|
name string
|
||||||
value *string
|
value string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "cpus",
|
name: "cpus",
|
||||||
value: &resources.CPU.Cpus,
|
value: resources.CPU.Cpus,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "mems",
|
name: "mems",
|
||||||
value: &resources.CPU.Mems,
|
value: resources.CPU.Mems,
|
||||||
},
|
},
|
||||||
} {
|
} {
|
||||||
if t.value != nil {
|
if t.value != "" {
|
||||||
if err := ioutil.WriteFile(
|
if err := ioutil.WriteFile(
|
||||||
filepath.Join(c.Path(path), fmt.Sprintf("cpuset.%s", t.name)),
|
filepath.Join(c.Path(path), fmt.Sprintf("cpuset.%s", t.name)),
|
||||||
[]byte(*t.value),
|
[]byte(t.value),
|
||||||
defaultFilePerm,
|
defaultFilePerm,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return err
|
return err
|
||||||
|
3
vendor/github.com/containerd/cgroups/devices.go
generated
vendored
3
vendor/github.com/containerd/cgroups/devices.go
generated
vendored
@ -58,6 +58,9 @@ func (d *devicesController) Create(path string, resources *specs.LinuxResources)
|
|||||||
if device.Allow {
|
if device.Allow {
|
||||||
file = allowDeviceFile
|
file = allowDeviceFile
|
||||||
}
|
}
|
||||||
|
if device.Type == "" {
|
||||||
|
device.Type = "a"
|
||||||
|
}
|
||||||
if err := ioutil.WriteFile(
|
if err := ioutil.WriteFile(
|
||||||
filepath.Join(d.Path(path), file),
|
filepath.Join(d.Path(path), file),
|
||||||
[]byte(deviceString(device)),
|
[]byte(deviceString(device)),
|
||||||
|
2
vendor/github.com/containerd/cgroups/net_prio.go
generated
vendored
2
vendor/github.com/containerd/cgroups/net_prio.go
generated
vendored
@ -50,7 +50,7 @@ func (n *netprioController) Create(path string, resources *specs.LinuxResources)
|
|||||||
if resources.Network != nil {
|
if resources.Network != nil {
|
||||||
for _, prio := range resources.Network.Priorities {
|
for _, prio := range resources.Network.Priorities {
|
||||||
if err := ioutil.WriteFile(
|
if err := ioutil.WriteFile(
|
||||||
filepath.Join(n.Path(path), "net_prio_ifpriomap"),
|
filepath.Join(n.Path(path), "net_prio.ifpriomap"),
|
||||||
formatPrio(prio.Name, prio.Priority),
|
formatPrio(prio.Name, prio.Priority),
|
||||||
defaultFilePerm,
|
defaultFilePerm,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
|
2
vendor/github.com/containerd/cgroups/subsystem.go
generated
vendored
2
vendor/github.com/containerd/cgroups/subsystem.go
generated
vendored
@ -42,7 +42,7 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Subsystems returns a complete list of the default cgroups
|
// Subsystems returns a complete list of the default cgroups
|
||||||
// avaliable on most linux systems
|
// available on most linux systems
|
||||||
func Subsystems() []Name {
|
func Subsystems() []Name {
|
||||||
n := []Name{
|
n := []Name{
|
||||||
Hugetlb,
|
Hugetlb,
|
||||||
|
33
vendor/github.com/containerd/cgroups/systemd.go
generated
vendored
33
vendor/github.com/containerd/cgroups/systemd.go
generated
vendored
@ -32,6 +32,11 @@ const (
|
|||||||
defaultSlice = "system.slice"
|
defaultSlice = "system.slice"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
canDelegate bool
|
||||||
|
once sync.Once
|
||||||
|
)
|
||||||
|
|
||||||
func Systemd() ([]Subsystem, error) {
|
func Systemd() ([]Subsystem, error) {
|
||||||
root, err := v1MountPoint()
|
root, err := v1MountPoint()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -54,7 +59,7 @@ func Slice(slice, name string) Path {
|
|||||||
slice = defaultSlice
|
slice = defaultSlice
|
||||||
}
|
}
|
||||||
return func(subsystem Name) (string, error) {
|
return func(subsystem Name) (string, error) {
|
||||||
return filepath.Join(slice, unitName(name)), nil
|
return filepath.Join(slice, name), nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,15 +85,39 @@ func (s *SystemdController) Create(path string, resources *specs.LinuxResources)
|
|||||||
}
|
}
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
slice, name := splitName(path)
|
slice, name := splitName(path)
|
||||||
|
// We need to see if systemd can handle the delegate property
|
||||||
|
// Systemd will return an error if it cannot handle delegate regardless
|
||||||
|
// of its bool setting.
|
||||||
|
checkDelegate := func() {
|
||||||
|
canDelegate = true
|
||||||
|
dlSlice := newProperty("Delegate", true)
|
||||||
|
if _, err := conn.StartTransientUnit(slice, "testdelegate", []systemdDbus.Property{dlSlice}, nil); err != nil {
|
||||||
|
if dbusError, ok := err.(dbus.Error); ok {
|
||||||
|
// Starting with systemd v237, Delegate is not even a property of slices anymore,
|
||||||
|
// so the D-Bus call fails with "InvalidArgs" error.
|
||||||
|
if strings.Contains(dbusError.Name, "org.freedesktop.DBus.Error.PropertyReadOnly") || strings.Contains(dbusError.Name, "org.freedesktop.DBus.Error.InvalidArgs") {
|
||||||
|
canDelegate = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
conn.StopUnit(slice, "testDelegate", nil)
|
||||||
|
}
|
||||||
|
once.Do(checkDelegate)
|
||||||
properties := []systemdDbus.Property{
|
properties := []systemdDbus.Property{
|
||||||
systemdDbus.PropDescription(fmt.Sprintf("cgroup %s", name)),
|
systemdDbus.PropDescription(fmt.Sprintf("cgroup %s", name)),
|
||||||
systemdDbus.PropWants(slice),
|
systemdDbus.PropWants(slice),
|
||||||
newProperty("DefaultDependencies", false),
|
newProperty("DefaultDependencies", false),
|
||||||
newProperty("Delegate", true),
|
|
||||||
newProperty("MemoryAccounting", true),
|
newProperty("MemoryAccounting", true),
|
||||||
newProperty("CPUAccounting", true),
|
newProperty("CPUAccounting", true),
|
||||||
newProperty("BlockIOAccounting", true),
|
newProperty("BlockIOAccounting", true),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we can delegate, we add the property back in
|
||||||
|
if canDelegate {
|
||||||
|
properties = append(properties, newProperty("Delegate", true))
|
||||||
|
}
|
||||||
|
|
||||||
ch := make(chan string)
|
ch := make(chan string)
|
||||||
_, err = conn.StartTransientUnit(name, "replace", properties, ch)
|
_, err = conn.StartTransientUnit(name, "replace", properties, ch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
29
vendor/github.com/containerd/cgroups/utils.go
generated
vendored
29
vendor/github.com/containerd/cgroups/utils.go
generated
vendored
@ -111,7 +111,7 @@ func remove(path string) error {
|
|||||||
return fmt.Errorf("cgroups: unable to remove path %q", path)
|
return fmt.Errorf("cgroups: unable to remove path %q", path)
|
||||||
}
|
}
|
||||||
|
|
||||||
// readPids will read all the pids in a cgroup by the provided path
|
// readPids will read all the pids of processes in a cgroup by the provided path
|
||||||
func readPids(path string, subsystem Name) ([]Process, error) {
|
func readPids(path string, subsystem Name) ([]Process, error) {
|
||||||
f, err := os.Open(filepath.Join(path, cgroupProcs))
|
f, err := os.Open(filepath.Join(path, cgroupProcs))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -138,6 +138,33 @@ func readPids(path string, subsystem Name) ([]Process, error) {
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// readTasksPids will read all the pids of tasks in a cgroup by the provided path
|
||||||
|
func readTasksPids(path string, subsystem Name) ([]Task, error) {
|
||||||
|
f, err := os.Open(filepath.Join(path, cgroupTasks))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
var (
|
||||||
|
out []Task
|
||||||
|
s = bufio.NewScanner(f)
|
||||||
|
)
|
||||||
|
for s.Scan() {
|
||||||
|
if t := s.Text(); t != "" {
|
||||||
|
pid, err := strconv.Atoi(t)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
out = append(out, Task{
|
||||||
|
Pid: pid,
|
||||||
|
Subsystem: subsystem,
|
||||||
|
Path: path,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
func hugePageSizes() ([]string, error) {
|
func hugePageSizes() ([]string, error) {
|
||||||
var (
|
var (
|
||||||
pageSizes []string
|
pageSizes []string
|
||||||
|
Loading…
Reference in New Issue
Block a user