mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 06:03:57 +08:00
cgroupv1 freezer: thaw to increase freeze chances
It appears that briefly thawing the cgroup while freezing greatly increases its chances to freeze successfully. The test case I used is doing runc exec in a look parallel with runc pause/resume in another loop, and the failure to freeze rate reduced from 40 to 0 per minute (tested inside a VM using a busybox container running sleep 1h, doing about 1500 pause/resumes and 650 execs per minute), with max retries being 150 (of 1000). This is still a game of chances, so failures are possible. Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
This commit is contained in:
@@ -12,6 +12,7 @@ import (
|
||||
"github.com/opencontainers/runc/libcontainer/cgroups"
|
||||
"github.com/opencontainers/runc/libcontainer/cgroups/fscommon"
|
||||
"github.com/opencontainers/runc/libcontainer/configs"
|
||||
"github.com/sirupsen/logrus"
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
@@ -38,13 +39,19 @@ func (s *FreezerGroup) Set(path string, cgroup *configs.Cgroup) error {
|
||||
// (either via fork/clone or by writing new PIDs to
|
||||
// cgroup.procs).
|
||||
//
|
||||
// The number of retries below is chosen to have a decent
|
||||
// chance to succeed even in the worst case scenario (runc
|
||||
// pause/unpause with parallel runc exec).
|
||||
// The numbers below are chosen to have a decent chance to
|
||||
// succeed even in the worst case scenario (runc pause/unpause
|
||||
// with parallel runc exec).
|
||||
//
|
||||
// Adding any amount of sleep in between retries did not
|
||||
// increase the chances of successful freeze.
|
||||
for i := 0; i < 1000; i++ {
|
||||
if i%50 == 49 {
|
||||
// Briefly thawing the cgroup also helps.
|
||||
_ = fscommon.WriteFile(path, "freezer.state", string(configs.Thawed))
|
||||
time.Sleep(10 * time.Millisecond)
|
||||
}
|
||||
|
||||
if err := fscommon.WriteFile(path, "freezer.state", string(configs.Frozen)); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -58,6 +65,9 @@ func (s *FreezerGroup) Set(path string, cgroup *configs.Cgroup) error {
|
||||
case "FREEZING":
|
||||
continue
|
||||
case string(configs.Frozen):
|
||||
if i > 1 {
|
||||
logrus.Debugf("frozen after %d retries", i)
|
||||
}
|
||||
return nil
|
||||
default:
|
||||
// should never happen
|
||||
|
||||
Reference in New Issue
Block a user