github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/pkg/sysinfo/cgroup2_linux.go (about)

     1  package sysinfo // import "github.com/docker/docker/pkg/sysinfo"
     2  
     3  import (
     4  	"io/ioutil"
     5  	"path"
     6  	"strings"
     7  
     8  	cgroupsV2 "github.com/containerd/cgroups/v2"
     9  	rsystem "github.com/opencontainers/runc/libcontainer/system"
    10  	"github.com/sirupsen/logrus"
    11  )
    12  
    13  type infoCollectorV2 func(info *SysInfo, controllers map[string]struct{}, dirPath string) (warnings []string)
    14  
    15  func newV2(quiet bool, opts *opts) *SysInfo {
    16  	var warnings []string
    17  	sysInfo := &SysInfo{
    18  		CgroupUnified: true,
    19  	}
    20  	g := opts.cg2GroupPath
    21  	if g == "" {
    22  		g = "/"
    23  	}
    24  	m, err := cgroupsV2.LoadManager("/sys/fs/cgroup", g)
    25  	if err != nil {
    26  		logrus.Warn(err)
    27  	} else {
    28  		controllersM := make(map[string]struct{})
    29  		controllers, err := m.Controllers()
    30  		if err != nil {
    31  			logrus.Warn(err)
    32  		}
    33  		for _, c := range controllers {
    34  			controllersM[c] = struct{}{}
    35  		}
    36  		opsV2 := []infoCollectorV2{
    37  			applyMemoryCgroupInfoV2,
    38  			applyCPUCgroupInfoV2,
    39  			applyIOCgroupInfoV2,
    40  			applyCPUSetCgroupInfoV2,
    41  			applyPIDSCgroupInfoV2,
    42  			applyDevicesCgroupInfoV2,
    43  		}
    44  		dirPath := path.Join("/sys/fs/cgroup", path.Clean(g))
    45  		for _, o := range opsV2 {
    46  			w := o(sysInfo, controllersM, dirPath)
    47  			warnings = append(warnings, w...)
    48  		}
    49  	}
    50  
    51  	ops := []infoCollector{
    52  		applyNetworkingInfo,
    53  		applyAppArmorInfo,
    54  		applySeccompInfo,
    55  		applyCgroupNsInfo,
    56  	}
    57  	for _, o := range ops {
    58  		w := o(sysInfo, nil)
    59  		warnings = append(warnings, w...)
    60  	}
    61  	if !quiet {
    62  		for _, w := range warnings {
    63  			logrus.Warn(w)
    64  		}
    65  	}
    66  	return sysInfo
    67  }
    68  
    69  func applyMemoryCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string {
    70  	var warnings []string
    71  	if _, ok := controllers["memory"]; !ok {
    72  		warnings = append(warnings, "Unable to find memory controller")
    73  		return warnings
    74  	}
    75  
    76  	info.MemoryLimit = true
    77  	info.SwapLimit = true
    78  	info.MemoryReservation = true
    79  	info.OomKillDisable = false
    80  	info.MemorySwappiness = false
    81  	info.KernelMemory = false
    82  	info.KernelMemoryTCP = false
    83  	return warnings
    84  }
    85  
    86  func applyCPUCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string {
    87  	var warnings []string
    88  	if _, ok := controllers["cpu"]; !ok {
    89  		warnings = append(warnings, "Unable to find cpu controller")
    90  		return warnings
    91  	}
    92  	info.CPUShares = true
    93  	info.CPUCfsPeriod = true
    94  	info.CPUCfsQuota = true
    95  	info.CPURealtimePeriod = false
    96  	info.CPURealtimeRuntime = false
    97  	return warnings
    98  }
    99  
   100  func applyIOCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string {
   101  	var warnings []string
   102  	if _, ok := controllers["io"]; !ok {
   103  		warnings = append(warnings, "Unable to find io controller")
   104  		return warnings
   105  	}
   106  
   107  	info.BlkioWeight = true
   108  	info.BlkioWeightDevice = true
   109  	info.BlkioReadBpsDevice = true
   110  	info.BlkioWriteBpsDevice = true
   111  	info.BlkioReadIOpsDevice = true
   112  	info.BlkioWriteIOpsDevice = true
   113  	return warnings
   114  }
   115  
   116  func applyCPUSetCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, dirPath string) []string {
   117  	var warnings []string
   118  	if _, ok := controllers["cpuset"]; !ok {
   119  		warnings = append(warnings, "Unable to find cpuset controller")
   120  		return warnings
   121  	}
   122  	info.Cpuset = true
   123  
   124  	cpus, err := ioutil.ReadFile(path.Join(dirPath, "cpuset.cpus.effective"))
   125  	if err != nil {
   126  		return warnings
   127  	}
   128  	info.Cpus = strings.TrimSpace(string(cpus))
   129  
   130  	mems, err := ioutil.ReadFile(path.Join(dirPath, "cpuset.mems.effective"))
   131  	if err != nil {
   132  		return warnings
   133  	}
   134  	info.Mems = strings.TrimSpace(string(mems))
   135  	return warnings
   136  }
   137  
   138  func applyPIDSCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string {
   139  	var warnings []string
   140  	if _, ok := controllers["pids"]; !ok {
   141  		warnings = append(warnings, "Unable to find pids controller")
   142  		return warnings
   143  	}
   144  	info.PidsLimit = true
   145  	return warnings
   146  }
   147  
   148  func applyDevicesCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string {
   149  	info.CgroupDevicesEnabled = !rsystem.RunningInUserNS()
   150  	return nil
   151  }