forked from containers/common
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
switch c/common to use runc cgroup creation so that we can use resource limits This entails importing the newly refactored runc code to manage reading from and writing to cgroup. vendoring in directly an unreleased runc commit from opencontainers/runc#3452 Signed-off-by: cdoern <[email protected]>
- Loading branch information
Showing
171 changed files
with
6,244 additions
and
1,966 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,6 @@ | ||
//go:build !linux | ||
// +build !linux | ||
|
||
package cgroups | ||
|
||
import ( | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,159 @@ | ||
//go:build linux | ||
// +build linux | ||
|
||
package cgroups | ||
|
||
import ( | ||
"bufio" | ||
"os" | ||
"path/filepath" | ||
"strconv" | ||
"strings" | ||
|
||
"github.com/opencontainers/runc/libcontainer/cgroups" | ||
"github.com/opencontainers/runc/libcontainer/cgroups/fs" | ||
"github.com/opencontainers/runc/libcontainer/cgroups/fs2" | ||
"github.com/opencontainers/runc/libcontainer/configs" | ||
"github.com/pkg/errors" | ||
) | ||
|
||
type linuxBlkioHandler struct { | ||
Blkio fs.BlkioGroup | ||
} | ||
|
||
func getBlkioHandler() *linuxBlkioHandler { | ||
return &linuxBlkioHandler{} | ||
} | ||
|
||
// Apply set the specified constraints | ||
func (c *linuxBlkioHandler) Apply(ctr *CgroupControl, res *configs.Resources) error { | ||
if ctr.cgroup2 { | ||
ctr.config.Parent = cgroupRoot | ||
man, err := fs2.NewManager(ctr.config, ctr.config.Path) | ||
if err != nil { | ||
return err | ||
} | ||
return man.Set(res) | ||
|
||
} | ||
path := filepath.Join(cgroupRoot, Blkio, ctr.config.Path) | ||
return c.Blkio.Set(path, res) | ||
} | ||
|
||
// Create the cgroup | ||
func (c *linuxBlkioHandler) Create(ctr *CgroupControl) (bool, error) { | ||
return ctr.createCgroupDirectory(Blkio) | ||
} | ||
|
||
// Destroy the cgroup | ||
func (c *linuxBlkioHandler) Destroy(ctr *CgroupControl) error { | ||
return rmDirRecursively(ctr.getCgroupv1Path(Blkio)) | ||
} | ||
|
||
// Stat fills a metrics structure with usage stats for the controller | ||
func (c *linuxBlkioHandler) Stat(ctr *CgroupControl, m *cgroups.Stats) error { | ||
var ioServiceBytesRecursive []cgroups.BlkioStatEntry | ||
|
||
if ctr.cgroup2 { | ||
// more details on the io.stat file format:X https://facebookmicrosites.github.io/cgroup2/docs/io-controller.html | ||
values, err := readCgroup2MapFile(ctr, "io.stat") | ||
if err != nil { | ||
return err | ||
} | ||
for k, v := range values { | ||
d := strings.Split(k, ":") | ||
if len(d) != 2 { | ||
continue | ||
} | ||
minor, err := strconv.ParseUint(d[0], 10, 0) | ||
if err != nil { | ||
return err | ||
} | ||
major, err := strconv.ParseUint(d[1], 10, 0) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
for _, item := range v { | ||
d := strings.Split(item, "=") | ||
if len(d) != 2 { | ||
continue | ||
} | ||
op := d[0] | ||
|
||
// Accommodate the cgroup v1 naming | ||
switch op { | ||
case "rbytes": | ||
op = "read" | ||
case "wbytes": | ||
op = "write" | ||
} | ||
|
||
value, err := strconv.ParseUint(d[1], 10, 0) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
entry := cgroups.BlkioStatEntry{ | ||
Op: op, | ||
Major: major, | ||
Minor: minor, | ||
Value: value, | ||
} | ||
ioServiceBytesRecursive = append(ioServiceBytesRecursive, entry) | ||
} | ||
} | ||
} else { | ||
BlkioRoot := ctr.getCgroupv1Path(Blkio) | ||
|
||
p := filepath.Join(BlkioRoot, "blkio.throttle.io_service_bytes_recursive") | ||
f, err := os.Open(p) | ||
if err != nil { | ||
if os.IsNotExist(err) { | ||
return nil | ||
} | ||
return errors.Wrapf(err, "open %s", p) | ||
} | ||
defer f.Close() | ||
|
||
scanner := bufio.NewScanner(f) | ||
for scanner.Scan() { | ||
line := scanner.Text() | ||
parts := strings.Fields(line) | ||
if len(parts) < 3 { | ||
continue | ||
} | ||
d := strings.Split(parts[0], ":") | ||
if len(d) != 2 { | ||
continue | ||
} | ||
minor, err := strconv.ParseUint(d[0], 10, 0) | ||
if err != nil { | ||
return err | ||
} | ||
major, err := strconv.ParseUint(d[1], 10, 0) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
op := parts[1] | ||
|
||
value, err := strconv.ParseUint(parts[2], 10, 0) | ||
if err != nil { | ||
return err | ||
} | ||
entry := cgroups.BlkioStatEntry{ | ||
Op: op, | ||
Major: major, | ||
Minor: minor, | ||
Value: value, | ||
} | ||
ioServiceBytesRecursive = append(ioServiceBytesRecursive, entry) | ||
} | ||
if err := scanner.Err(); err != nil { | ||
return errors.Wrapf(err, "parse %s", p) | ||
} | ||
} | ||
m.BlkioStats.IoServiceBytesRecursive = ioServiceBytesRecursive | ||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,10 @@ | ||
//go:build !linux | ||
// +build !linux | ||
|
||
package cgroups | ||
|
||
import ( | ||
"bufio" | ||
"bytes" | ||
"context" | ||
"fmt" | ||
"io/ioutil" | ||
|
Oops, something went wrong.