Documentation ¶
Index ¶
- Constants
- Variables
- func CalcCPUThrottledRatio(curPoint, prePoint *CPUStatRaw) float64
- func CalculateCatL3MaskValue(cbm uint, startPercent, endPercent int64) (string, error)
- func CheckAndTryEnableResctrlCat() error
- func CheckIfAllSupported(checkSupportedFns ...func() (bool, string)) func() (bool, string)
- func CheckResctrlSchemataValid() error
- func CommonFileRead(file string) (string, error)
- func CommonFileWrite(file string, data string) error
- func CommonFileWriteIfDifferent(file string, value string) (bool, error)
- func ConvertCPUSharesToWeight(s string) (int64, error)
- func ConvertCPUWeightToShares(v int64) (int64, error)
- func EnableCoreSchedIfSupported() (bool, string)
- func FileExists(path string) bool
- func GetCPUInfoPath() string
- func GetCacheIds() ([]int, error)
- func GetCacheInfo(str string) (string, int32, error)
- func GetCgroupFilePath(cgroupTaskDir string, r Resource) string
- func GetContainerPGIDs(containerParentDir string) ([]uint32, error)
- func GetIsStartColdMemory() bool
- func GetIsSupportColdMemory() bool
- func GetKidledColdBoundary() int
- func GetKubeletCommandline(port int) ([]string, error)
- func GetNUMAHugepagesDir(numaNodeSubDir string) string
- func GetNUMAHugepagesNrPath(numaNodeSubDir string, page string) string
- func GetNUMAMemInfoPath(numaNodeSubDir string) string
- func GetPCIDeviceDir() string
- func GetPGIDForPID(pid uint32) (uint32, error)
- func GetPGIDsForPIDs(pids []uint32) ([]uint32, error)
- func GetPeriodTicks(start, end time.Time) float64
- func GetProcFilePath(procRelativePath string) string
- func GetProcPIDStatPath(pid uint32) string
- func GetProcRootDir() string
- func GetProcSysFilePath(file string) string
- func GetResctrlGroupRootDirPath(groupPath string) string
- func GetResctrlL3CbmFilePath() string
- func GetResctrlSchemataFilePath(groupPath string) string
- func GetResctrlSubsystemDirPath() string
- func GetResctrlTasksFilePath(groupPath string) string
- func GetRootCgroupSubfsDir(subfs string) string
- func GetSchedCore() (bool, error)
- func GetSchedGroupIdentity() (bool, error)
- func GetSysCPUSMTActivePath() string
- func GetSysIntelPStateNoTurboPath() string
- func GetSysNUMADir() string
- func GetSysRootDir() string
- func GetVendorIDByCPUInfo(path string) (string, error)
- func GoWithNewThread(f func() interface{}) interface{}
- func InitCatGroupIfNotExist(group string) (bool, error)
- func InitSupportConfigs()
- func IsCgroupV2Resource(r Resource) bool
- func IsCoreSchedFeatureEnabled() (bool, error)
- func IsCoreSchedSupported() (bool, string)
- func IsCoreSchedSysctlSupported() bool
- func IsGroupIdentitySysctlSupported() bool
- func IsKidledSupport() bool
- func IsResourceUnsupportedErr(err error) bool
- func IsSupportResctrl() (bool, error)
- func IsUsingCgroupsV2() bool
- func KubeletPortToPid(port int) (int, error)
- func MilliCPUToQuota(milliCPULimit int64) int64
- func MilliCPUToShares(milliCPURequest int64) int64
- func MountResctrlSubsystem() (bool, error)
- func NewProcSysctl() utilsysctl.Interface
- func ParseCPUAcctUsageV2(content string) (uint64, error)
- func ParseCPUCFSPeriodV2(content string) (int64, error)
- func ParseCPUCFSQuotaV2(content string) (int64, error)
- func ParseCgroupProcs(content string) ([]uint32, error)
- func ParseKVMap(content string) map[string]string
- func ParseResctrlSchemataMap(content string) map[string]map[int]string
- func PathExists(path string) (bool, error)
- func ProcCmdLine(procRoot string, pid int) ([]string, error)
- func ReadCatL3CbmString() (string, error)
- func ReadFileNoStat(filename string) ([]byte, error)
- func ReadResctrlTasksMap(groupPath string) (map[int32]struct{}, error)
- func ResourceUnsupportedErr(msg string) error
- func SetConf(config Config)
- func SetCoreSchedFeatureEnabled() (bool, string)
- func SetIsStartColdMemory(flag bool)
- func SetIsSupportColdMemory(flag bool)
- func SetKidledColdBoundary(boudary int)
- func SetKidledScanPeriodInSeconds(period uint32) error
- func SetKidledUseHierarchy(useHierarchy uint8) error
- func SetSchedCore(enable bool) error
- func SetSchedGroupIdentity(enable bool) error
- func SetupCgroupPathFormatter(driver CgroupDriverType)
- func SupportedIfFileExists(r Resource, dynamicPath string) (bool, string)
- func SupportedIfFileExistsInKubepods(r Resource, _ string) (bool, string)
- func SupportedIfFileExistsInRootCgroup(filename string, subfs string) (bool, string)
- func TCPSocks(fn netstat.AcceptFn) ([]netstat.SockTabEntry, error)
- func ValidateResourceValue(value *int64, dynamicPath string, r Resource) bool
- func WorkingDirOf(pid int) (string, error)
- type BlkIORangeValidator
- type CPUSetStrValidator
- type CPUStatRaw
- type CPUStatV2Raw
- type CgroupDriverType
- type CgroupResource
- func (c *CgroupResource) GetCgroupVersion() CgroupVersion
- func (c *CgroupResource) IsSupported(parentDir string) (bool, string)
- func (c *CgroupResource) IsValid(v string) (bool, string)
- func (c *CgroupResource) Path(parentDir string) string
- func (c *CgroupResource) ResourceType() ResourceType
- func (c *CgroupResource) SetCgroupVersion(cv CgroupVersion)
- func (c *CgroupResource) WithCheckOnce(isCheckOnce bool) Resource
- func (c *CgroupResource) WithCheckSupported(...) Resource
- func (c *CgroupResource) WithSupported(isSupported bool, msg string) Resource
- func (c *CgroupResource) WithValidator(validator ResourceValidator) Resource
- type CgroupResourceFactory
- type CgroupResourceRegistry
- type CgroupResourceRegistryImpl
- type CgroupVersion
- type ColdPageInfoByKidled
- type Config
- type CoreSched
- func (s *CoreSched) Assign(pidTypeFrom CoreSchedScopeType, pidFrom uint32, pidTypeTo CoreSchedScopeType, ...) ([]uint32, error)
- func (s *CoreSched) Clear(pidType CoreSchedScopeType, pids ...uint32) ([]uint32, error)
- func (s *CoreSched) Create(pidType CoreSchedScopeType, pid uint32) error
- func (s *CoreSched) Get(pidType CoreSchedScopeType, pid uint32) (uint64, error)
- func (s *CoreSched) ShareFrom(pidType CoreSchedScopeType, pid uint32) error
- func (s *CoreSched) ShareTo(pidType CoreSchedScopeType, pid uint32) error
- type CoreSchedExtendedInterface
- type CoreSchedExtendedResult
- type CoreSchedInterface
- type CoreSchedScopeType
- type FakeCoreSchedExtended
- func (f *FakeCoreSchedExtended) Assign(pidTypeFrom CoreSchedScopeType, pidFrom uint32, pidTypeTo CoreSchedScopeType, ...) ([]uint32, error)
- func (f *FakeCoreSchedExtended) Clear(pidType CoreSchedScopeType, pids ...uint32) ([]uint32, error)
- func (f *FakeCoreSchedExtended) Create(pidType CoreSchedScopeType, pid uint32) error
- func (f *FakeCoreSchedExtended) Get(pidType CoreSchedScopeType, pid uint32) (uint64, error)
- func (f *FakeCoreSchedExtended) SetCurPID(pid uint32)
- func (f *FakeCoreSchedExtended) SetNextCookieID(id uint64)
- func (f *FakeCoreSchedExtended) ShareFrom(pidType CoreSchedScopeType, pid uint32) error
- func (f *FakeCoreSchedExtended) ShareTo(pidType CoreSchedScopeType, pid uint32) error
- type FileTestUtil
- func (c *FileTestUtil) Cleanup()
- func (c *FileTestUtil) CreateCgroupFile(taskDir string, r Resource)
- func (c *FileTestUtil) CreateFile(testFilePath string)
- func (c *FileTestUtil) CreateProcSubFile(fileRelativePath string)
- func (c *FileTestUtil) MkDirAll(testDir string)
- func (c *FileTestUtil) ReadCgroupFileContents(taskDir string, r Resource) string
- func (c *FileTestUtil) ReadCgroupFileContentsInt(taskDir string, r Resource) *int64
- func (c *FileTestUtil) ReadFileContents(testFilePath string) string
- func (c *FileTestUtil) ReadProcSubFileContents(relativeFilePath string) string
- func (c *FileTestUtil) SetAnolisOSResourcesSupported(supported bool)
- func (c *FileTestUtil) SetCgroupsV2(useCgroupsV2 bool)
- func (c *FileTestUtil) SetConf(setFn, cleanupFn func(conf *Config))
- func (c *FileTestUtil) SetResourcesSupported(supported bool, resources ...Resource)
- func (c *FileTestUtil) SetValidateResource(enabled bool)
- func (c *FileTestUtil) WriteCgroupFileContents(taskDir string, r Resource, contents string)
- func (c *FileTestUtil) WriteFileContents(testFilePath, contents string)
- func (c *FileTestUtil) WriteProcSubFileContents(relativeFilePath string, contents string)
- type Formatter
- type KidledConfig
- type MemoryStatRaw
- type NumaMemoryPages
- type PSIByResource
- type PSILine
- type PSIPath
- type PSIStats
- type ProcStat
- type ProcSysctl
- type RangeValidator
- type ResctrlResource
- func (r *ResctrlResource) IsSupported(parentDir string) (bool, string)
- func (r *ResctrlResource) IsValid(v string) (bool, string)
- func (r *ResctrlResource) Path(parentDir string) string
- func (r *ResctrlResource) ResourceType() ResourceType
- func (r *ResctrlResource) WithCheckOnce(isCheckOnce bool) Resource
- func (r *ResctrlResource) WithCheckSupported(...) Resource
- func (r *ResctrlResource) WithSupported(isSupported bool, msg string) Resource
- func (r *ResctrlResource) WithValidator(validator ResourceValidator) Resource
- type ResctrlSchemataRaw
- func (r *ResctrlSchemataRaw) CacheIds() []int
- func (r *ResctrlSchemataRaw) DeepCopy() *ResctrlSchemataRaw
- func (r *ResctrlSchemataRaw) Equal(a *ResctrlSchemataRaw) (bool, string)
- func (r *ResctrlSchemataRaw) L3Number() int
- func (r *ResctrlSchemataRaw) L3String() string
- func (r *ResctrlSchemataRaw) MBString() string
- func (r *ResctrlSchemataRaw) ParseResctrlSchemata(content string, l3Num int) error
- func (r *ResctrlSchemataRaw) Prefix() string
- func (r *ResctrlSchemataRaw) Validate() (bool, string)
- func (r *ResctrlSchemataRaw) ValidateL3() (bool, string)
- func (r *ResctrlSchemataRaw) ValidateMB() (bool, string)
- func (r *ResctrlSchemataRaw) WithL3Mask(mask string) *ResctrlSchemataRaw
- func (r *ResctrlSchemataRaw) WithL3Num(l3Num int) *ResctrlSchemataRaw
- func (r *ResctrlSchemataRaw) WithMB(valueOrPercent string) *ResctrlSchemataRaw
- type Resource
- func GetCgroupResource(resourceType ResourceType) (Resource, error)
- func NewCommonCgroupResource(resourceType ResourceType, filename string, subfs string) Resource
- func NewCommonResctrlResource(filename string, subdir string) Resource
- func NewCommonSystemResource(relativePath, fileName string, Rootdir func() string) Resource
- type ResourceType
- type ResourceValidator
- type SystemResource
- func (c *SystemResource) IsSupported(dynamicPath string) (bool, string)
- func (c *SystemResource) IsValid(v string) (bool, string)
- func (c *SystemResource) Path(dynamicPath string) string
- func (c *SystemResource) ResourceType() ResourceType
- func (c *SystemResource) WithCheckOnce(isCheckOnce bool) Resource
- func (c *SystemResource) WithCheckSupported(...) Resource
- func (c *SystemResource) WithSupported(isSupported bool, msg string) Resource
- func (c *SystemResource) WithValidator(validator ResourceValidator) Resource
- type VersionInfo
Constants ¶
const ( DefaultCPUCFSPeriod int64 = 100000 // MemoryLimitUnlimitedValue denotes the unlimited value of cgroups-v1 memory.limit_in_bytes. // It derives from linux PAGE_COUNTER_MAX and may be different according to the PAGE_SIZE (here we suppose `4k`). // https://github.com/torvalds/linux/blob/ea4424be16887a37735d6550cfd0611528dbe5d9/mm/memcontrol.c#L5337 MemoryLimitUnlimitedValue int64 = 0x7FFFFFFFFFFFF000 // 9223372036854771712 < math.MaxInt64 // CgroupMaxSymbolStr only appears in cgroups-v2 files, we consider the value as MaxInt64 CgroupMaxSymbolStr string = "max" // CgroupUnlimitedSymbolStr indicates value is unlimited. It appears in cfs_quota which regarded as max in comparison. CgroupUnlimitedSymbolStr string = "-1" // CgroupMaxValueStr math.MaxInt64; writing `memory.high` with this do the same as set as "max" CgroupMaxValueStr string = "9223372036854775807" )
const ( Cgroupfs CgroupDriverType = "cgroupfs" Systemd CgroupDriverType = "systemd" KubeRootNameSystemd = "kubepods.slice/" KubeBurstableNameSystemd = "kubepods-burstable.slice/" KubeBesteffortNameSystemd = "kubepods-besteffort.slice/" KubeRootNameCgroupfs = "kubepods/" KubeBurstableNameCgroupfs = "burstable/" KubeBesteffortNameCgroupfs = "besteffort/" RuntimeTypeDocker = "docker" RuntimeTypeContainerd = "containerd" RuntimeTypePouch = "pouch" RuntimeTypeCrio = "cri-o" RuntimeTypeUnknown = "unknown" )
const ( CgroupCPUDir string = "cpu/" CgroupCPUSetDir string = "cpuset/" CgroupCPUAcctDir string = "cpuacct/" CgroupMemDir string = "memory/" CgroupBlkioDir string = "blkio/" CgroupV2Dir = "" )
const ( CFSBasePeriodValue int64 = 100000 CFSQuotaMinValue int64 = 1000 // min value except `-1` CPUWeightMinValue int64 = 1 CPUWeightMaxValue int64 = 10000 CPUStatName = "cpu.stat" CPUCFSQuotaName = "cpu.cfs_quota_us" CPUCFSPeriodName = "cpu.cfs_period_us" CPUBVTWarpNsName = "cpu.bvt_warp_ns" CPUBurstName = "cpu.cfs_burst_us" CPUTasksName = "tasks" CPUProcsName = "cgroup.procs" CPUThreadsName = "cgroup.threads" CPUMaxName = "cpu.max" CPUMaxBurstName = "cpu.max.burst" CPUWeightName = "cpu.weight" CPUIdleName = "cpu.idle" CPUSetCPUSName = "cpuset.cpus" CPUSetCPUSEffectiveName = "cpuset.cpus.effective" CPUAcctStatName = "cpuacct.stat" CPUAcctUsageName = "cpuacct.usage" CPUAcctCPUPressureName = "cpu.pressure" CPUAcctMemoryPressureName = "memory.pressure" CPUAcctIOPressureName = "io.pressure" MemoryLimitName = "memory.limit_in_bytes" MemoryUsageName = "memory.usage_in_bytes" MemoryStatName = "memory.stat" MemoryNumaStatName = "memory.numa_stat" MemoryWmarkRatioName = "memory.wmark_ratio" MemoryWmarkScaleFactorName = "memory.wmark_scale_factor" MemoryWmarkMinAdjName = "memory.wmark_min_adj" MemoryMinName = "memory.min" // anolis os or cgroups-v2 MemoryLowName = "memory.low" // anolis os or cgroups-v2 MemoryHighName = "memory.high" // anolis os or cgroups-v2 MemoryMaxName = "memory.max" MemoryCurrentName = "memory.current" MemoryPriorityName = "memory.priority" MemoryUsePriorityOomName = "memory.use_priority_oom" MemoryOomGroupName = "memory.oom.group" MemoryIdlePageStatsName = "memory.idle_page_stats" BlkioTRIopsName = "blkio.throttle.read_iops_device" BlkioTRBpsName = "blkio.throttle.read_bps_device" BlkioTWIopsName = "blkio.throttle.write_iops_device" BlkioTWBpsName = "blkio.throttle.write_bps_device" BlkioIOWeightName = "blkio.cost.weight" BlkioIOQoSName = "blkio.cost.qos" BlkioIOModelName = "blkio.cost.model" )
const ( DS_MODE = "dsMode" HOST_MODE = "hostMode" )
const ( // SchedFeatureCoreSched is the feature name of the core scheduling in `/sys/kernel/debug/sched_features`. SchedFeatureCoreSched = "CORE_SCHED" // SchedFeatureNoCoreSched is the feature name that the core scheduling supported but disabled. SchedFeatureNoCoreSched = "NO_CORE_SCHED" )
const ( // VirtualCoreSchedCookieName is the name of a virtual system resource for the core scheduling cookie. VirtualCoreSchedCookieName = "core_sched_cookie" // DefaultCoreSchedCookieID is the default cookie of the core scheduling. DefaultCoreSchedCookieID uint64 = 0 )
const ( ProcStatName = "stat" ProcMemInfoName = "meminfo" ProcCPUInfoName = "cpuinfo" )
const ( ResctrlName string = "resctrl" ResctrlDir string = "resctrl/" RdtInfoDir string = "info" L3CatDir string = "L3" ResctrlSchemataName string = "schemata" ResctrlCbmMaskName string = "cbm_mask" ResctrlTasksName string = "tasks" // L3SchemataPrefix is the prefix of l3 cat schemata L3SchemataPrefix = "L3" // MbSchemataPrefix is the prefix of mba schemata MbSchemataPrefix = "MB" // other cpu vendor like "GenuineIntel" AMD_VENDOR_ID = "AuthenticAMD" )
const ( SysctlSubDir = "sys" KernelCmdlineFileName = "cmdline" HugepageDir = "hugepages" KernelSchedGroupIdentityEnable = "kernel/sched_group_identity_enabled" KernelSchedCore = "kernel/sched_core" SysNUMASubDir = "bus/node/devices" SysPCIDeviceDir = "bus/pci/devices" SysCPUSMTActiveSubPath = "devices/system/cpu/smt/active" SysIntelPStateNoTurboSubPath = "devices/system/cpu/intel_pstate/no_turbo" )
const ( ProcSysVmRelativePath = "sys/vm/" MemcgReaperRelativePath = "kernel/mm/memcg_reaper/" KidledRelativePath = "kernel/mm/kidled/" SchedFeaturesRelativePath = "kernel/debug/" MinFreeKbytesFileName = "min_free_kbytes" WatermarkScaleFactorFileName = "watermark_scale_factor" MemcgReapBackGroundFileName = "reap_background" KidledScanPeriodInSecondsFileName = "scan_period_in_seconds" KidledUseHierarchyFileFileName = "use_hierarchy" SchedFeaturesFileName = "sched_features" )
const ErrCgroupDir = "cgroup path or file not exist"
const ErrResourceUnsupportedPrefix = "resource is unsupported"
Variables ¶
var ( NaturalInt64Validator = &RangeValidator{min: 0, max: math.MaxInt64} CPUBurstValidator = &RangeValidator{min: 0, max: 100 * 10 * 100000} CPUBvtWarpNsValidator = &RangeValidator{min: -1, max: 2} CPUWeightValidator = &RangeValidator{min: CPUWeightMinValue, max: CPUWeightMaxValue} CPUMaxBurstValidator = &RangeValidator{min: 0, max: math.MaxInt64} CPUIdleValidator = &RangeValidator{min: 0, max: 1} MemoryWmarkRatioValidator = &RangeValidator{min: 0, max: 100} MemoryPriorityValidator = &RangeValidator{min: 0, max: 12} MemoryOomGroupValidator = &RangeValidator{min: 0, max: 1} MemoryUsePriorityOomValidator = &RangeValidator{min: 0, max: 1} MemoryWmarkMinAdjValidator = &RangeValidator{min: -25, max: 50} MemoryWmarkScaleFactorFileNameValidator = &RangeValidator{min: 1, max: 1000} BlkioTRIopsValidator = &BlkIORangeValidator{min: 0, max: math.MaxInt64, resource: BlkioTRIopsName} BlkioTRBpsValidator = &BlkIORangeValidator{min: 0, max: math.MaxInt64, resource: BlkioTRBpsName} BlkioTWIopsValidator = &BlkIORangeValidator{min: 0, max: math.MaxInt64, resource: BlkioTWIopsName} BlkioTWBpsValidator = &BlkIORangeValidator{min: 0, max: math.MaxInt64, resource: BlkioTWBpsName} BlkioIOWeightValidator = &BlkIORangeValidator{min: 1, max: 100, resource: BlkioIOWeightName} BlkioIOQoSValidator = &BlkIORangeValidator{min: 0, max: math.MaxInt64, resource: BlkioIOQoSName} BlkioIOModelValidator = &BlkIORangeValidator{min: 1, max: math.MaxInt64, resource: BlkioIOModelName} CPUSetCPUSValidator = &CPUSetStrValidator{} )
var ( DefaultFactory = NewCgroupResourceFactory() CPUStat = DefaultFactory.New(CPUStatName, CgroupCPUDir) CPUCFSQuota = DefaultFactory.New(CPUCFSQuotaName, CgroupCPUDir) CPUCFSPeriod = DefaultFactory.New(CPUCFSPeriodName, CgroupCPUDir) CPUBurst = DefaultFactory.New(CPUBurstName, CgroupCPUDir).WithValidator(CPUBurstValidator).WithCheckSupported(SupportedIfFileExists) CPUBVTWarpNs = DefaultFactory.New(CPUBVTWarpNsName, CgroupCPUDir).WithValidator(CPUBvtWarpNsValidator).WithCheckSupported(SupportedIfFileExists) CPUIdle = DefaultFactory.New(CPUIdleName, CgroupCPUDir).WithValidator(CPUIdleValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) CPUTasks = DefaultFactory.New(CPUTasksName, CgroupCPUDir) CPUProcs = DefaultFactory.New(CPUProcsName, CgroupCPUDir) CPUSet = DefaultFactory.New(CPUSetCPUSName, CgroupCPUSetDir).WithValidator(CPUSetCPUSValidator) CPUAcctStat = DefaultFactory.New(CPUAcctStatName, CgroupCPUAcctDir) CPUAcctUsage = DefaultFactory.New(CPUAcctUsageName, CgroupCPUAcctDir) CPUAcctCPUPressure = DefaultFactory.New(CPUAcctCPUPressureName, CgroupCPUAcctDir).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) CPUAcctMemoryPressure = DefaultFactory.New(CPUAcctMemoryPressureName, CgroupCPUAcctDir).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) CPUAcctIOPressure = DefaultFactory.New(CPUAcctIOPressureName, CgroupCPUAcctDir).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) MemoryLimit = DefaultFactory.New(MemoryLimitName, CgroupMemDir) MemoryUsage = DefaultFactory.New(MemoryUsageName, CgroupMemDir) MemoryStat = DefaultFactory.New(MemoryStatName, CgroupMemDir) MemoryNumaStat = DefaultFactory.New(MemoryNumaStatName, CgroupMemDir) MemoryWmarkRatio = DefaultFactory.New(MemoryWmarkRatioName, CgroupMemDir).WithValidator(MemoryWmarkRatioValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) MemoryWmarkScaleFactor = DefaultFactory.New(MemoryWmarkScaleFactorName, CgroupMemDir).WithValidator(MemoryWmarkScaleFactorFileNameValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) MemoryWmarkMinAdj = DefaultFactory.New(MemoryWmarkMinAdjName, CgroupMemDir).WithValidator(MemoryWmarkMinAdjValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) MemoryMin = DefaultFactory.New(MemoryMinName, CgroupMemDir).WithValidator(NaturalInt64Validator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) MemoryLow = DefaultFactory.New(MemoryLowName, CgroupMemDir).WithValidator(NaturalInt64Validator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) MemoryHigh = DefaultFactory.New(MemoryHighName, CgroupMemDir).WithValidator(NaturalInt64Validator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) MemoryPriority = DefaultFactory.New(MemoryPriorityName, CgroupMemDir).WithValidator(MemoryPriorityValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) MemoryUsePriorityOom = DefaultFactory.New(MemoryUsePriorityOomName, CgroupMemDir).WithValidator(MemoryUsePriorityOomValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) MemoryOomGroup = DefaultFactory.New(MemoryOomGroupName, CgroupMemDir).WithValidator(MemoryOomGroupValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) MemoryIdlePageStats = DefaultFactory.New(MemoryIdlePageStatsName, CgroupMemDir).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) BlkioReadIops = DefaultFactory.New(BlkioTRIopsName, CgroupBlkioDir).WithValidator(BlkioTRIopsValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) BlkioReadBps = DefaultFactory.New(BlkioTRBpsName, CgroupBlkioDir).WithValidator(BlkioTRBpsValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) BlkioWriteIops = DefaultFactory.New(BlkioTWIopsName, CgroupBlkioDir).WithValidator(BlkioTWIopsValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) BlkioWriteBps = DefaultFactory.New(BlkioTWBpsName, CgroupBlkioDir).WithValidator(BlkioTWBpsValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) BlkioIOWeight = DefaultFactory.New(BlkioIOWeightName, CgroupBlkioDir).WithValidator(BlkioIOWeightValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) BlkioIOQoS = DefaultFactory.New(BlkioIOQoSName, CgroupBlkioDir).WithValidator(BlkioIOQoSValidator).WithSupported(SupportedIfFileExistsInRootCgroup(BlkioIOQoSName, CgroupBlkioDir)) BlkioIOModel = DefaultFactory.New(BlkioIOModelName, CgroupBlkioDir).WithValidator(BlkioIOModelValidator).WithSupported(SupportedIfFileExistsInRootCgroup(BlkioIOModelName, CgroupBlkioDir)) CPUCFSQuotaV2 = DefaultFactory.NewV2(CPUCFSQuotaName, CPUMaxName) CPUCFSPeriodV2 = DefaultFactory.NewV2(CPUCFSPeriodName, CPUMaxName) CPUStatV2 = DefaultFactory.NewV2(CPUStatName, CPUStatName) CPUAcctStatV2 = DefaultFactory.NewV2(CPUAcctStatName, CPUStatName) CPUAcctUsageV2 = DefaultFactory.NewV2(CPUAcctUsageName, CPUStatName) CPUBurstV2 = DefaultFactory.NewV2(CPUBurstName, CPUMaxBurstName).WithValidator(CPUMaxBurstValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) CPUBVTWarpNsV2 = DefaultFactory.NewV2(CPUBVTWarpNsName, CPUBVTWarpNsName).WithValidator(CPUBvtWarpNsValidator).WithCheckSupported(SupportedIfFileExists) CPUIdleV2 = DefaultFactory.NewV2(CPUIdleName, CPUIdleName).WithValidator(CPUIdleValidator).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) CPUAcctCPUPressureV2 = DefaultFactory.NewV2(CPUAcctCPUPressureName, CPUAcctCPUPressureName).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) CPUAcctMemoryPressureV2 = DefaultFactory.NewV2(CPUAcctMemoryPressureName, CPUAcctMemoryPressureName).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) CPUAcctIOPressureV2 = DefaultFactory.NewV2(CPUAcctIOPressureName, CPUAcctIOPressureName).WithCheckSupported(SupportedIfFileExistsInKubepods).WithCheckOnce(true) CPUSetV2 = DefaultFactory.NewV2(CPUSetCPUSName, CPUSetCPUSName).WithValidator(CPUSetCPUSValidator) CPUSetEffectiveV2 = DefaultFactory.NewV2(CPUSetCPUSEffectiveName, CPUSetCPUSEffectiveName) // TODO: unify the R/W CPUTasksV2 = DefaultFactory.NewV2(CPUTasksName, CPUThreadsName) CPUProcsV2 = DefaultFactory.NewV2(CPUProcsName, CPUProcsName) MemoryLimitV2 = DefaultFactory.NewV2(MemoryLimitName, MemoryMaxName) MemoryUsageV2 = DefaultFactory.NewV2(MemoryUsageName, MemoryCurrentName) MemoryStatV2 = DefaultFactory.NewV2(MemoryStatName, MemoryStatName) MemoryNumaStatV2 = DefaultFactory.NewV2(MemoryNumaStatName, MemoryNumaStatName) MemoryMinV2 = DefaultFactory.NewV2(MemoryMinName, MemoryMinName).WithValidator(NaturalInt64Validator) MemoryLowV2 = DefaultFactory.NewV2(MemoryLowName, MemoryLowName).WithValidator(NaturalInt64Validator) MemoryHighV2 = DefaultFactory.NewV2(MemoryHighName, MemoryHighName).WithValidator(NaturalInt64Validator) MemoryWmarkRatioV2 = DefaultFactory.NewV2(MemoryWmarkRatioName, MemoryWmarkRatioName).WithValidator(MemoryWmarkRatioValidator).WithCheckSupported(SupportedIfFileExists) MemoryWmarkScaleFactorV2 = DefaultFactory.NewV2(MemoryWmarkScaleFactorName, MemoryWmarkScaleFactorName).WithValidator(MemoryWmarkScaleFactorFileNameValidator).WithCheckSupported(SupportedIfFileExists) MemoryWmarkMinAdjV2 = DefaultFactory.NewV2(MemoryWmarkMinAdjName, MemoryWmarkMinAdjName).WithValidator(MemoryWmarkMinAdjValidator).WithCheckSupported(SupportedIfFileExists) MemoryPriorityV2 = DefaultFactory.NewV2(MemoryPriorityName, MemoryPriorityName).WithValidator(MemoryPriorityValidator).WithCheckSupported(SupportedIfFileExists) MemoryUsePriorityOomV2 = DefaultFactory.NewV2(MemoryUsePriorityOomName, MemoryUsePriorityOomName).WithValidator(MemoryUsePriorityOomValidator).WithCheckSupported(SupportedIfFileExists) MemoryOomGroupV2 = DefaultFactory.NewV2(MemoryOomGroupName, MemoryOomGroupName).WithValidator(MemoryOomGroupValidator).WithCheckSupported(SupportedIfFileExists) )
for cgroup resources, we use the corresponding cgroups-v1 filename as its resource type
var ( CommonRootDir = "" // for uni-test PageSize = int64(syscall.Getpagesize()) )
var ( ResctrlSchemata = NewCommonResctrlResource(ResctrlSchemataName, "") ResctrlTasks = NewCommonResctrlResource(ResctrlTasksName, "") ResctrlL3CbmMask = NewCommonResctrlResource(ResctrlCbmMaskName, filepath.Join(RdtInfoDir, L3CatDir)) )
var ( MinFreeKbytesValidator = &RangeValidator{min: 10 * 1024, max: 10 * 1024 * 1024} WatermarkScaleFactorValidator = &RangeValidator{min: 10, max: 400} MemcgReapBackGroundValidator = &RangeValidator{min: 0, max: 1} KidledScanPeriodInSecondsValidator = &RangeValidator{min: 0, max: math.MaxInt64} KidledUseHierarchyValidator = &RangeValidator{min: 0, max: 1} )
var ( MinFreeKbytes = NewCommonSystemResource(ProcSysVmRelativePath, MinFreeKbytesFileName, GetProcRootDir).WithValidator(MinFreeKbytesValidator) WatermarkScaleFactor = NewCommonSystemResource(ProcSysVmRelativePath, WatermarkScaleFactorFileName, GetProcRootDir).WithValidator(WatermarkScaleFactorValidator) MemcgReapBackGround = NewCommonSystemResource(MemcgReaperRelativePath, MemcgReapBackGroundFileName, GetSysRootDir).WithValidator(MemcgReapBackGroundValidator).WithCheckSupported(SupportedIfFileExists) KidledScanPeriodInSeconds = NewCommonSystemResource(KidledRelativePath, KidledScanPeriodInSecondsFileName, GetSysRootDir).WithValidator(KidledScanPeriodInSecondsValidator).WithCheckSupported(SupportedIfFileExists) KidledUseHierarchy = NewCommonSystemResource(KidledRelativePath, KidledUseHierarchyFileFileName, GetSysRootDir).WithValidator(KidledUseHierarchyValidator).WithCheckSupported(SupportedIfFileExists) // SchedFeatures is the system file which shows the enabled features of the kernel scheduling. SchedFeatures = NewCommonSystemResource(SchedFeaturesRelativePath, SchedFeaturesFileName, GetSysRootDir).WithCheckSupported(SupportedIfFileExists) )
var AgentMode = DS_MODE
var (
CacheIdsCacheFunc func() ([]int, error)
)
var CgroupPathFormatter = GetCgroupFormatter()
CgroupPathFormatter is the cgroup driver formatter. It is initialized with a fastly looked-up type and will be slowly detected with the kubelet when the daemon starts.
var Conf = NewDsModeConfig()
var DefaultRegistry = NewCgroupResourceRegistry()
var ExecCmdOnHost = execCmdOnHostFn
If running in container, exec command by 'nsenter --mount=/proc/1/ns/mnt ${cmds}'. return stdout, exitcode, error
var HostSystemInfo = collectVersionInfo()
var ( // Jiffies is the duration unit of CPU stats. Normally, it is 10ms. Jiffies = float64(10 * time.Millisecond) )
var PidOf = pidOfFn
PidOf finds process(es) with a specified name (regexp match) and return their pid(s).
var UseCgroupsV2 = atomic.NewBool(false)
var ( // VirtualCoreSchedCookie represents a virtual system resource for the core scheduling cookie. // It is virtual for denoting the operation on processes' core scheduling cookie, and it is not allowed to do // any real read or write on the provided filepath. VirtualCoreSchedCookie = NewCommonSystemResource("", VirtualCoreSchedCookieName, GetProcRootDir) )
Functions ¶
func CalcCPUThrottledRatio ¶
func CalcCPUThrottledRatio(curPoint, prePoint *CPUStatRaw) float64
func CalculateCatL3MaskValue ¶ added in v1.1.0
func CheckAndTryEnableResctrlCat ¶
func CheckAndTryEnableResctrlCat() error
CheckAndTryEnableResctrlCat checks if resctrl and l3_cat are enabled; if not, try to enable the features by mount resctrl subsystem; See MountResctrlSubsystem() for the detail. It returns whether the resctrl cat is enabled, and the error if failed to enable or to check resctrl interfaces
func CheckIfAllSupported ¶ added in v1.1.0
func CheckResctrlSchemataValid ¶ added in v1.4.0
func CheckResctrlSchemataValid() error
func CommonFileRead ¶
func CommonFileWrite ¶
func ConvertCPUSharesToWeight ¶ added in v1.1.0
func ConvertCPUWeightToShares ¶ added in v1.1.0
ConvertCPUWeightToShares converts the value of `cpu.weight` (cgroups-v2) into the value of `cpu.shares` (cgroups-v1)
func EnableCoreSchedIfSupported ¶ added in v1.4.0
EnableCoreSchedIfSupported checks if the core scheduling feature is enabled in the kernel sched_features. If kernel supported (available in the latest Anolis OS), it tries to enable the core scheduling feature. The core sched's kernel feature is known set in two places, if both of them are not found, the system is considered unsupported for the core scheduling:
- In `/proc/sys/kernel/sched_core`, the value `1` means the feature is enabled while `0` means disabled.
- (Older kernel) In `/sys/kernel/debug/sched_features`, the field `CORE_SCHED` means the feature is enabled while `NO_CORE_SCHED` means it is disabled.
func FileExists ¶
func GetCPUInfoPath ¶ added in v1.4.0
func GetCPUInfoPath() string
func GetCacheIds ¶ added in v1.4.1
GetCacheIds get cache ids from schemata file. e.g. schemata=`L3:0=fff;1=fff\nMB:0=100;1=100\n` -> [0, 1]
func GetCacheInfo ¶ added in v1.1.0
GetCacheInfo parses the output of `lscpu -e=CACHE` into l1l2 and l3 infos e.g. - input: "1:1:1:0" - output: "1", 0, nil
func GetCgroupFilePath ¶
GetCgroupFilePath gets the full path of the given cgroup dir and resource. @cgroupTaskDir kubepods.slice/kubepods-pod7712555c_ce62_454a_9e18_9ff0217b8941.slice/ @return /sys/fs/cgroup/cpu/kubepods.slice/kubepods-pod7712555c_ce62_454a_9e18_9ff0217b8941.slice/cpu.shares
func GetContainerPGIDs ¶ added in v1.4.0
func GetIsStartColdMemory ¶ added in v1.4.0
func GetIsStartColdMemory() bool
func GetIsSupportColdMemory ¶ added in v1.4.0
func GetIsSupportColdMemory() bool
func GetKidledColdBoundary ¶ added in v1.4.0
func GetKidledColdBoundary() int
func GetKubeletCommandline ¶ added in v1.1.0
func GetNUMAHugepagesDir ¶ added in v1.4.0
func GetNUMAHugepagesNrPath ¶ added in v1.4.0
func GetNUMAMemInfoPath ¶ added in v1.3.0
func GetPCIDeviceDir ¶ added in v1.4.0
func GetPCIDeviceDir() string
func GetPGIDForPID ¶ added in v1.4.0
func GetPGIDsForPIDs ¶ added in v1.4.0
GetPGIDsForPIDs gets the PGIDs for a cgroup's PIDs. It will consider the PID as PGID if its PGID does not exist anymore.
func GetPeriodTicks ¶ added in v1.1.0
func GetProcFilePath ¶ added in v1.1.0
func GetProcPIDStatPath ¶ added in v1.4.0
func GetProcRootDir ¶ added in v1.2.0
func GetProcRootDir() string
func GetProcSysFilePath ¶ added in v1.1.0
func GetResctrlGroupRootDirPath ¶
@groupPath BE @return /sys/fs/resctrl/BE
func GetResctrlL3CbmFilePath ¶
func GetResctrlL3CbmFilePath() string
@return /sys/fs/resctrl/info/L3/cbm_mask
func GetResctrlSchemataFilePath ¶
@groupPath BE @return /sys/fs/resctrl/BE/schemata
func GetResctrlTasksFilePath ¶
@groupPath BE @return /sys/fs/resctrl/BE/tasks
func GetRootCgroupSubfsDir ¶ added in v1.3.0
func GetSchedCore ¶ added in v1.4.0
func GetSchedGroupIdentity ¶ added in v1.4.1
func GetSysCPUSMTActivePath ¶ added in v1.4.0
func GetSysCPUSMTActivePath() string
func GetSysIntelPStateNoTurboPath ¶ added in v1.4.0
func GetSysIntelPStateNoTurboPath() string
func GetSysNUMADir ¶ added in v1.3.0
func GetSysNUMADir() string
func GetSysRootDir ¶ added in v1.2.0
func GetSysRootDir() string
func GetVendorIDByCPUInfo ¶ added in v1.2.0
GetVendorIDByCPUInfo returns vendor_id like AuthenticAMD from cpu info, e.g. vendor_id : AuthenticAMD vendor_id : GenuineIntel
func GoWithNewThread ¶ added in v1.4.0
func GoWithNewThread(f func() interface{}) interface{}
GoWithNewThread synchronously runs the function in a new goroutine bound to a new OS thread.
func InitCatGroupIfNotExist ¶ added in v1.1.0
func InitSupportConfigs ¶ added in v1.4.1
func InitSupportConfigs()
InitSupportConfigs initializes the system support status. e.g. the cgroup version, resctrl capability
func IsCgroupV2Resource ¶ added in v1.2.0
func IsCoreSchedFeatureEnabled ¶ added in v1.4.0
func IsCoreSchedSupported ¶ added in v1.4.1
IsCoreSchedSupported checks if the kernel supports the core scheduling. Currently, it relies on the interfaces provided by the Anolis OS.
func IsCoreSchedSysctlSupported ¶ added in v1.4.1
func IsCoreSchedSysctlSupported() bool
func IsGroupIdentitySysctlSupported ¶ added in v1.4.1
func IsGroupIdentitySysctlSupported() bool
func IsKidledSupport ¶ added in v1.4.0
func IsKidledSupport() bool
check kidled and set var isSupportColdSupport
func IsResourceUnsupportedErr ¶ added in v1.1.0
func IsSupportResctrl ¶ added in v1.1.0
func IsUsingCgroupsV2 ¶ added in v1.1.0
func IsUsingCgroupsV2() bool
IsUsingCgroupsV2 checks once if the CGroup V2 is in use. modify base: github.com/opencontainers/runc/libcontainer/cgroups/utils.go IsCgroup2UnifiedMode
func KubeletPortToPid ¶ added in v1.1.0
KubeletPortToPid Query pid by tcp port number with the help of go-netstat note: Due to the low efficiency of full traversal, we cache the result and verify each time
func MilliCPUToQuota ¶ added in v1.4.0
func MilliCPUToShares ¶ added in v1.4.0
func MountResctrlSubsystem ¶
MountResctrlSubsystem mounts resctrl fs under the sysFSRoot to enable the kernel feature on supported environment NOTE: Linux kernel (>= 4.10), Intel cpu and bare-mental host are required; Also, Intel RDT features should be enabled in kernel configurations and kernel commandline. For more info, please see https://github.com/intel/intel-cmt-cat/wiki/resctrl
func NewProcSysctl ¶ added in v1.1.0
func NewProcSysctl() utilsysctl.Interface
func ParseCPUAcctUsageV2 ¶ added in v1.1.0
func ParseCPUCFSPeriodV2 ¶ added in v1.1.0
func ParseCPUCFSQuotaV2 ¶ added in v1.1.0
func ParseCgroupProcs ¶ added in v1.4.0
ParseCgroupProcs parses the content in cgroup.procs. pattern: `7742\n10971\n11049\n11051...` TODO: refactor with readCgroupAndParseInt32Slice via Generics.
func ParseKVMap ¶ added in v1.1.0
ParseKVMap parses a file content into a KV map. e.g. `user 100\nsystem 20` -> `{"user": "100", "system": "20"}`
func ParseResctrlSchemataMap ¶ added in v1.1.0
ParseResctrlSchemataMap parses the content of resctrl schemata. e.g. schemata=`L3:0=fff;1=fff\nMB:0=100;1=100\n` -> `{"L3": {0: "fff", 1: "fff"}, "MB": {0: "100", 1: "100"}}`
func PathExists ¶
func ProcCmdLine ¶
CmdLine returns the command line args of a process.
func ReadCatL3CbmString ¶
ReadCatL3CbmString reads and returns the value of cat l3 cbm_mask
func ReadFileNoStat ¶
ReadFileNoStat uses io.ReadAll to read contents of entire file. This is similar to io.ReadFile but without the call to os.Stat, because many files in /proc and /sys report incorrect file sizes (either 0 or 4096). Reads a max file size of 512kB. For files larger than this, a scanner should be used.
func ReadResctrlTasksMap ¶
ReadResctrlTasksMap reads and returns the map of given resctrl group's task ids
func ResourceUnsupportedErr ¶ added in v1.1.0
func SetCoreSchedFeatureEnabled ¶ added in v1.4.0
SetCoreSchedFeatureEnabled checks if the core scheduling feature can be enabled in the kernel sched_features.
func SetIsStartColdMemory ¶ added in v1.4.0
func SetIsStartColdMemory(flag bool)
func SetIsSupportColdMemory ¶ added in v1.4.0
func SetIsSupportColdMemory(flag bool)
func SetKidledColdBoundary ¶ added in v1.4.0
func SetKidledColdBoundary(boudary int)
func SetKidledScanPeriodInSeconds ¶ added in v1.4.0
func SetKidledUseHierarchy ¶ added in v1.4.0
func SetSchedCore ¶ added in v1.4.0
func SetSchedGroupIdentity ¶ added in v1.1.0
func SetupCgroupPathFormatter ¶
func SetupCgroupPathFormatter(driver CgroupDriverType)
func SupportedIfFileExists ¶ added in v1.1.0
func SupportedIfFileExistsInKubepods ¶ added in v1.1.0
func SupportedIfFileExistsInRootCgroup ¶ added in v1.3.0
func ValidateResourceValue ¶ added in v1.1.0
func WorkingDirOf ¶ added in v1.1.0
return working dir of process
Types ¶
type BlkIORangeValidator ¶ added in v1.3.0
type BlkIORangeValidator struct {
// contains filtered or unexported fields
}
type CPUSetStrValidator ¶ added in v1.1.0
type CPUSetStrValidator struct{}
type CPUStatRaw ¶
func ParseCPUStatRaw ¶ added in v1.1.0
func ParseCPUStatRaw(content string) (*CPUStatRaw, error)
func ParseCPUStatRawV2 ¶ added in v1.1.0
func ParseCPUStatRawV2(content string) (*CPUStatRaw, error)
type CPUStatV2Raw ¶ added in v1.1.0
type CPUStatV2Raw struct { UsageUsec int64 UserUsec int64 SystemUSec int64 NrPeriods int64 NrThrottled int64 ThrottledUSec int64 }
func ParseCPUAcctStatRawV2 ¶ added in v1.1.0
func ParseCPUAcctStatRawV2(content string) (*CPUStatV2Raw, error)
type CgroupDriverType ¶
type CgroupDriverType string
func GetCgroupDriver ¶ added in v1.3.0
func GetCgroupDriver() CgroupDriverType
GetCgroupDriver gets the cgroup driver both from the cgroup directory names and kubelet configs. Check kubelet config can be slow, so it should be called infrequently.
func GetCgroupDriverFromCgroupName ¶ added in v1.3.0
func GetCgroupDriverFromCgroupName() CgroupDriverType
func GetCgroupDriverFromKubelet ¶ added in v1.3.0
func GetCgroupDriverFromKubelet(nodeName string) (CgroupDriverType, error)
func GetCgroupDriverFromKubeletPort ¶ added in v1.3.0
func GetCgroupDriverFromKubeletPort(port int) (CgroupDriverType, error)
GetCgroupDriverFromKubeletPort get Kubelet's cgroup driver from kubelet port.
- use KubeletPortToPid to get kubelet pid.
- If '--cgroup-driver' in args, that's it. else if '--config' not in args, is default driver('cgroupfs'). else go to step-3.
- If kubelet config is relative path, join with /proc/${pidof kubelet}/cwd. search 'cgroupDriver:' in kubelet config file, that's it.
func (CgroupDriverType) Validate ¶
func (c CgroupDriverType) Validate() bool
type CgroupResource ¶ added in v1.1.0
type CgroupResource struct { Type ResourceType FileName string Subfs string Supported *bool SupportMsg string CheckSupported func(r Resource, parentDir string) (isSupported bool, msg string) CheckOnce bool Validator ResourceValidator CgroupVersion CgroupVersion }
func (*CgroupResource) GetCgroupVersion ¶ added in v1.2.0
func (c *CgroupResource) GetCgroupVersion() CgroupVersion
func (*CgroupResource) IsSupported ¶ added in v1.1.0
func (c *CgroupResource) IsSupported(parentDir string) (bool, string)
func (*CgroupResource) IsValid ¶ added in v1.1.0
func (c *CgroupResource) IsValid(v string) (bool, string)
func (*CgroupResource) Path ¶ added in v1.1.0
func (c *CgroupResource) Path(parentDir string) string
func (*CgroupResource) ResourceType ¶ added in v1.1.0
func (c *CgroupResource) ResourceType() ResourceType
func (*CgroupResource) SetCgroupVersion ¶ added in v1.2.0
func (c *CgroupResource) SetCgroupVersion(cv CgroupVersion)
func (*CgroupResource) WithCheckOnce ¶ added in v1.3.0
func (c *CgroupResource) WithCheckOnce(isCheckOnce bool) Resource
func (*CgroupResource) WithCheckSupported ¶ added in v1.1.0
func (*CgroupResource) WithSupported ¶ added in v1.1.0
func (c *CgroupResource) WithSupported(isSupported bool, msg string) Resource
func (*CgroupResource) WithValidator ¶ added in v1.1.0
func (c *CgroupResource) WithValidator(validator ResourceValidator) Resource
type CgroupResourceFactory ¶ added in v1.1.0
type CgroupResourceFactory interface { New(filename string, subfs string) Resource // cgroup-v1 filename represents the resource type NewV2(t ResourceType, filename string) Resource }
func NewCgroupResourceFactory ¶ added in v1.1.0
func NewCgroupResourceFactory() CgroupResourceFactory
type CgroupResourceRegistry ¶ added in v1.1.0
type CgroupResourceRegistry interface { Add(v CgroupVersion, s ...Resource) Get(v CgroupVersion, t ResourceType) (Resource, bool) }
func NewCgroupResourceRegistry ¶ added in v1.1.0
func NewCgroupResourceRegistry() CgroupResourceRegistry
type CgroupResourceRegistryImpl ¶ added in v1.1.0
type CgroupResourceRegistryImpl struct {
// contains filtered or unexported fields
}
func (*CgroupResourceRegistryImpl) Add ¶ added in v1.1.0
func (r *CgroupResourceRegistryImpl) Add(v CgroupVersion, s ...Resource)
func (*CgroupResourceRegistryImpl) Get ¶ added in v1.1.0
func (r *CgroupResourceRegistryImpl) Get(v CgroupVersion, key ResourceType) (Resource, bool)
type CgroupVersion ¶ added in v1.1.0
type CgroupVersion int32
const ( CgroupVersionV1 CgroupVersion = 1 CgroupVersionV2 CgroupVersion = 2 )
func GetCurrentCgroupVersion ¶ added in v1.1.0
func GetCurrentCgroupVersion() CgroupVersion
type ColdPageInfoByKidled ¶ added in v1.4.0
type ColdPageInfoByKidled struct { Version string `json:"version"` PageScans uint64 `json:"page_scans"` SlabScans uint64 `json:"slab_scans"` ScanPeriodInSeconds uint64 `json:"scan_period_in_seconds"` UseHierarchy uint64 `json:"use_hierarchy"` Buckets []uint64 `json:"buckets"` Csei []uint64 `json:"csei"` Dsei []uint64 `json:"dsei"` Cfei []uint64 `json:"cfei"` Dfei []uint64 `json:"dfei"` Csui []uint64 `json:"csui"` Dsui []uint64 `json:"dsui"` Cfui []uint64 `json:"cfui"` Dfui []uint64 `json:"dfui"` Csea []uint64 `json:"csea"` Dsea []uint64 `json:"dsea"` Cfea []uint64 `json:"cfea"` Dfea []uint64 `json:"dfea"` Csua []uint64 `json:"csua"` Dsua []uint64 `json:"dsua"` Cfua []uint64 `json:"cfua"` Dfua []uint64 `json:"dfua"` Slab []uint64 `json:"slab"` }
the unit of Csei, Dsei, Cfei ... is byte the detailed description can be seen in https://github.com/alibaba/cloud-kernel/blob/linux-next/Documentation/vm/kidled.rst
func ParseMemoryIdlePageStats ¶ added in v1.4.0
func ParseMemoryIdlePageStats(content string) (*ColdPageInfoByKidled, error)
func (*ColdPageInfoByKidled) GetColdPageTotalBytes ¶ added in v1.4.0
func (i *ColdPageInfoByKidled) GetColdPageTotalBytes() uint64
boundary is the index of [1,2) [2,5) [5,15) [15,30) [30,60) [60,120) [120,240) [240,+inf). if boundary is equal to 3, it will compute sum([5*scan_period_scands,+inf)) of cold page cache
type Config ¶
type Config struct { CgroupRootDir string SysRootDir string SysFSRootDir string ProcRootDir string VarRunRootDir string VarLibKubeletRootDir string RunRootDir string RuntimeHooksConfigDir string ContainerdEndPoint string PouchEndpoint string DockerEndPoint string CrioEndPoint string DefaultRuntimeType string }
func NewDsModeConfig ¶
func NewDsModeConfig() *Config
func NewHostModeConfig ¶
func NewHostModeConfig() *Config
type CoreSched ¶ added in v1.4.0
type CoreSched struct{}
func (*CoreSched) Assign ¶ added in v1.4.0
func (s *CoreSched) Assign(pidTypeFrom CoreSchedScopeType, pidFrom uint32, pidTypeTo CoreSchedScopeType, pidsTo ...uint32) ([]uint32, error)
func (*CoreSched) Clear ¶ added in v1.4.0
func (s *CoreSched) Clear(pidType CoreSchedScopeType, pids ...uint32) ([]uint32, error)
func (*CoreSched) Create ¶ added in v1.4.0
func (s *CoreSched) Create(pidType CoreSchedScopeType, pid uint32) error
func (*CoreSched) Get ¶ added in v1.4.0
func (s *CoreSched) Get(pidType CoreSchedScopeType, pid uint32) (uint64, error)
type CoreSchedExtendedInterface ¶ added in v1.4.0
type CoreSchedExtendedInterface interface { CoreSchedInterface // Clear clears core sched cookie to the default cookie 0, and returns the list of failed pids. // It can be implemented with ShareTo(pidType, pid) where the current task's cookie is 0. // e.g. Clear(CoreSchedScopeThreadGroup, 10000, 20000) means reset the cookies of pid 10000 and pid 20000 to 0. Clear(pidType CoreSchedScopeType, pids ...uint32) ([]uint32, error) // Assign assigns core sched cookie of the pidFrom onto pidsTo, and returns the list of failed pidTos. // pidFrom only supports thread-level, while the pidsTo can be in other levels. // It can be implemented with ShareFrom(pidTypeFrom, pidFrom) and ShareTo(pidTypeTo, pidTo) where the current task's // cookie is locked between the two operations. // e.g. Assign(CoreSchedScopeThread, 10000, CoreSchedScopeProcessGroup, 10001, 20000) means set the cookies of the // process group 10001 and 20000 as the cookie of the thread 10000. Assign(pidTypeFrom CoreSchedScopeType, pidFrom uint32, pidTypeTo CoreSchedScopeType, pidsTo ...uint32) ([]uint32, error) }
CoreSchedExtendedInterface defines the operations of the Linux Core Scheduling including extended OPs. It implements simplified operations Clear and Assign by combining ShareTo and ShareFrom with an empty thread relay.
func NewCoreSchedExtended ¶ added in v1.4.0
func NewCoreSchedExtended() CoreSchedExtendedInterface
func NewFakeCoreSchedExtended ¶ added in v1.4.0
type CoreSchedExtendedResult ¶ added in v1.4.0
type CoreSchedInterface ¶ added in v1.4.0
type CoreSchedInterface interface { // Get gets core sched cookie of pid. // The default cookie ID is 0. It only supports thread-level. Get(pidType CoreSchedScopeType, pid uint32) (uint64, error) // Create creates a new unique cookie to pid. // The cookie ID is generated by the kernel and is unique for each group. Create(pidType CoreSchedScopeType, pid uint32) error // e.g. ShareTo(CoreSchedScopeThreadGroup, 10000) means set the cookie of the pid 10000 as the current thread's // cookie of the agent. ShareTo(pidType CoreSchedScopeType, pid uint32) error // It only supports thread-level. // e.g. ShareFrom(CoreSchedScopeThreadGroup, 10000) means set the current thread's cookie of the agent as the // cookie of the pid 10000. ShareFrom(pidType CoreSchedScopeType, pid uint32) error }
CoreSchedInterface defines the basic operations of the Linux Core Scheduling that targets on the PID-level by prctl(). https://docs.kernel.org/admin-guide/hw-vuln/core-scheduling.html
func NewCoreSched ¶ added in v1.4.0
func NewCoreSched() CoreSchedInterface
type CoreSchedScopeType ¶ added in v1.4.0
type CoreSchedScopeType uint
CoreSchedScopeType defines the type of the PID type operated in core sched.
const ( // CoreSchedScopeThread means the PID type operated in core sched is a thread. CoreSchedScopeThread CoreSchedScopeType = iota // CoreSchedScopeThreadGroup means the PID type operated in core sched is a thread group. CoreSchedScopeThreadGroup // CoreSchedScopeProcessGroup means the PID type operated in core sched is a process group. CoreSchedScopeProcessGroup )
type FakeCoreSchedExtended ¶ added in v1.4.0
type FakeCoreSchedExtended struct { PIDToCookie map[uint32]uint64 PIDToPGID map[uint32]uint32 PIDToTGID map[uint32]uint32 PIDToError map[uint32]bool CurPID uint32 NextCookieID uint64 }
FakeCoreSchedExtended implements the fake CoreSchedExtendedInterface for testing.
func (*FakeCoreSchedExtended) Assign ¶ added in v1.4.0
func (f *FakeCoreSchedExtended) Assign(pidTypeFrom CoreSchedScopeType, pidFrom uint32, pidTypeTo CoreSchedScopeType, pidsTo ...uint32) ([]uint32, error)
func (*FakeCoreSchedExtended) Clear ¶ added in v1.4.0
func (f *FakeCoreSchedExtended) Clear(pidType CoreSchedScopeType, pids ...uint32) ([]uint32, error)
func (*FakeCoreSchedExtended) Create ¶ added in v1.4.0
func (f *FakeCoreSchedExtended) Create(pidType CoreSchedScopeType, pid uint32) error
func (*FakeCoreSchedExtended) Get ¶ added in v1.4.0
func (f *FakeCoreSchedExtended) Get(pidType CoreSchedScopeType, pid uint32) (uint64, error)
func (*FakeCoreSchedExtended) SetCurPID ¶ added in v1.4.0
func (f *FakeCoreSchedExtended) SetCurPID(pid uint32)
func (*FakeCoreSchedExtended) SetNextCookieID ¶ added in v1.4.0
func (f *FakeCoreSchedExtended) SetNextCookieID(id uint64)
func (*FakeCoreSchedExtended) ShareFrom ¶ added in v1.4.0
func (f *FakeCoreSchedExtended) ShareFrom(pidType CoreSchedScopeType, pid uint32) error
func (*FakeCoreSchedExtended) ShareTo ¶ added in v1.4.0
func (f *FakeCoreSchedExtended) ShareTo(pidType CoreSchedScopeType, pid uint32) error
type FileTestUtil ¶
type FileTestUtil struct { // Temporary directory to store mock cgroup filesystem. TempDir string // whether to validate when writing cgroups resources ValidateResource bool // additional cleanup function for Config to be invoked in Cleanup() CleanupFn func(config *Config) // contains filtered or unexported fields }
func NewFileTestUtil ¶
func NewFileTestUtil(t testing.TB) *FileTestUtil
NewFileTestUtil creates a new test util for the specified subsystem. NOTE: this function should be called only for testing purposes.
func (*FileTestUtil) Cleanup ¶
func (c *FileTestUtil) Cleanup()
func (*FileTestUtil) CreateCgroupFile ¶
func (c *FileTestUtil) CreateCgroupFile(taskDir string, r Resource)
func (*FileTestUtil) CreateFile ¶
func (c *FileTestUtil) CreateFile(testFilePath string)
if filePath contain TempDir, createFile direct, else join with TempDir and create
func (*FileTestUtil) CreateProcSubFile ¶
func (c *FileTestUtil) CreateProcSubFile(fileRelativePath string)
func (*FileTestUtil) MkDirAll ¶
func (c *FileTestUtil) MkDirAll(testDir string)
if dir contain TempDir, mkdir direct, else join with TempDir and mkdir
func (*FileTestUtil) ReadCgroupFileContents ¶
func (c *FileTestUtil) ReadCgroupFileContents(taskDir string, r Resource) string
func (*FileTestUtil) ReadCgroupFileContentsInt ¶ added in v1.2.0
func (c *FileTestUtil) ReadCgroupFileContentsInt(taskDir string, r Resource) *int64
func (*FileTestUtil) ReadFileContents ¶
func (c *FileTestUtil) ReadFileContents(testFilePath string) string
if filePath contain TempDir, read direct, else join with TempDir and read
func (*FileTestUtil) ReadProcSubFileContents ¶
func (c *FileTestUtil) ReadProcSubFileContents(relativeFilePath string) string
func (*FileTestUtil) SetAnolisOSResourcesSupported ¶ added in v1.1.0
func (c *FileTestUtil) SetAnolisOSResourcesSupported(supported bool)
func (*FileTestUtil) SetCgroupsV2 ¶ added in v1.1.0
func (c *FileTestUtil) SetCgroupsV2(useCgroupsV2 bool)
func (*FileTestUtil) SetConf ¶ added in v1.4.0
func (c *FileTestUtil) SetConf(setFn, cleanupFn func(conf *Config))
func (*FileTestUtil) SetResourcesSupported ¶ added in v1.1.0
func (c *FileTestUtil) SetResourcesSupported(supported bool, resources ...Resource)
func (*FileTestUtil) SetValidateResource ¶ added in v1.3.0
func (c *FileTestUtil) SetValidateResource(enabled bool)
func (*FileTestUtil) WriteCgroupFileContents ¶
func (c *FileTestUtil) WriteCgroupFileContents(taskDir string, r Resource, contents string)
WriteCgroupFileContents is only intended for test functions. For specific read/write functionalities, please refer to the executor package.
func (*FileTestUtil) WriteFileContents ¶
func (c *FileTestUtil) WriteFileContents(testFilePath, contents string)
if filePath contain TempDir, write direct, else join with TempDir and write
func (*FileTestUtil) WriteProcSubFileContents ¶
func (c *FileTestUtil) WriteProcSubFileContents(relativeFilePath string, contents string)
type Formatter ¶ added in v1.3.0
type Formatter struct { ParentDir string QOSDirFn func(qos corev1.PodQOSClass) string PodDirFn func(qos corev1.PodQOSClass, podUID string) string // containerID format: "containerd://..." or "docker://...", return (containerd, HashID) ContainerDirFn func(id string) (string, string, error) PodIDParser func(basename string) (string, error) ContainerIDParser func(basename string) (string, error) }
func GetCgroupFormatter ¶ added in v1.3.0
func GetCgroupFormatter() Formatter
GetCgroupFormatter gets the cgroup formatter simply looking up the cgroup directory names.
func GetCgroupPathFormatter ¶ added in v1.3.0
func GetCgroupPathFormatter(driver CgroupDriverType) Formatter
type KidledConfig ¶ added in v1.4.0
func NewDefaultKidledConfig ¶ added in v1.4.0
func NewDefaultKidledConfig() *KidledConfig
type MemoryStatRaw ¶ added in v1.1.0
type MemoryStatRaw struct { Cache int64 RSS int64 InactiveFile int64 ActiveFile int64 InactiveAnon int64 ActiveAnon int64 Unevictable int64 }
func ParseMemoryStatRaw ¶ added in v1.1.0
func ParseMemoryStatRaw(content string) (*MemoryStatRaw, error)
func ParseMemoryStatRawV2 ¶ added in v1.1.0
func ParseMemoryStatRawV2(content string) (*MemoryStatRaw, error)
func (*MemoryStatRaw) Usage ¶ added in v1.1.0
func (m *MemoryStatRaw) Usage() int64
func (*MemoryStatRaw) UsageWithPageCache ¶ added in v1.4.0
func (m *MemoryStatRaw) UsageWithPageCache() int64
type NumaMemoryPages ¶ added in v1.2.0
func ParseMemoryNumaStat ¶ added in v1.2.0
func ParseMemoryNumaStat(content string) ([]NumaMemoryPages, error)
func ParseMemoryNumaStatV2 ¶ added in v1.2.0
func ParseMemoryNumaStatV2(content string) ([]NumaMemoryPages, error)
type PSIByResource ¶ added in v1.5.0
func GetPSIByResource ¶ added in v1.5.0
func GetPSIByResource(paths PSIPath) (*PSIByResource, error)
type ProcStat ¶ added in v1.4.0
ProcStat is the content of /proc/<pid>/stat. https://manpages.ubuntu.com/manpages/xenial/en/man5/proc.5.html
func ParseProcPIDStat ¶ added in v1.4.0
type ProcSysctl ¶ added in v1.1.0
type ProcSysctl struct{}
ProcSysctl implements Interface by reading and writing files under /proc/sys
type RangeValidator ¶
type RangeValidator struct {
// contains filtered or unexported fields
}
type ResctrlResource ¶ added in v1.1.0
type ResctrlResource struct { Type ResourceType FileName string Subdir string CheckSupported func(r Resource, parentDir string) (isSupported bool, msg string) Validator ResourceValidator }
func (*ResctrlResource) IsSupported ¶ added in v1.1.0
func (r *ResctrlResource) IsSupported(parentDir string) (bool, string)
func (*ResctrlResource) IsValid ¶ added in v1.1.0
func (r *ResctrlResource) IsValid(v string) (bool, string)
func (*ResctrlResource) Path ¶ added in v1.1.0
func (r *ResctrlResource) Path(parentDir string) string
func (*ResctrlResource) ResourceType ¶ added in v1.1.0
func (r *ResctrlResource) ResourceType() ResourceType
func (*ResctrlResource) WithCheckOnce ¶ added in v1.3.0
func (r *ResctrlResource) WithCheckOnce(isCheckOnce bool) Resource
func (*ResctrlResource) WithCheckSupported ¶ added in v1.1.0
func (*ResctrlResource) WithSupported ¶ added in v1.1.0
func (r *ResctrlResource) WithSupported(isSupported bool, msg string) Resource
func (*ResctrlResource) WithValidator ¶ added in v1.1.0
func (r *ResctrlResource) WithValidator(validator ResourceValidator) Resource
type ResctrlSchemataRaw ¶ added in v1.1.0
func NewResctrlSchemataRaw ¶ added in v1.1.0
func NewResctrlSchemataRaw(cacheids []int) *ResctrlSchemataRaw
func ReadResctrlSchemataRaw ¶ added in v1.1.0
func ReadResctrlSchemataRaw(schemataFile string, l3Num int) (*ResctrlSchemataRaw, error)
func (*ResctrlSchemataRaw) CacheIds ¶ added in v1.4.1
func (r *ResctrlSchemataRaw) CacheIds() []int
func (*ResctrlSchemataRaw) DeepCopy ¶ added in v1.1.0
func (r *ResctrlSchemataRaw) DeepCopy() *ResctrlSchemataRaw
func (*ResctrlSchemataRaw) Equal ¶ added in v1.1.0
func (r *ResctrlSchemataRaw) Equal(a *ResctrlSchemataRaw) (bool, string)
func (*ResctrlSchemataRaw) L3Number ¶ added in v1.1.0
func (r *ResctrlSchemataRaw) L3Number() int
func (*ResctrlSchemataRaw) L3String ¶ added in v1.1.0
func (r *ResctrlSchemataRaw) L3String() string
func (*ResctrlSchemataRaw) MBString ¶ added in v1.1.0
func (r *ResctrlSchemataRaw) MBString() string
func (*ResctrlSchemataRaw) ParseResctrlSchemata ¶ added in v1.1.0
func (r *ResctrlSchemataRaw) ParseResctrlSchemata(content string, l3Num int) error
ParseResctrlSchemata parses the resctrl schemata of given cgroup, and returns the l3_cat masks and mba masks. Set l3Num=-1 to use the read L3 number from the schemata. @content `L3:0=fff;1=fff\nMB:0=100;1=100\n` (may have additional lines (e.g. ARM MPAM)) @l3Num 2 @return {L3: {0: "fff", 1: "fff"}, MB: {0: "100", 1: "100"}}, nil
func (*ResctrlSchemataRaw) Prefix ¶ added in v1.1.0
func (r *ResctrlSchemataRaw) Prefix() string
func (*ResctrlSchemataRaw) Validate ¶ added in v1.4.0
func (r *ResctrlSchemataRaw) Validate() (bool, string)
func (*ResctrlSchemataRaw) ValidateL3 ¶ added in v1.4.0
func (r *ResctrlSchemataRaw) ValidateL3() (bool, string)
func (*ResctrlSchemataRaw) ValidateMB ¶ added in v1.4.0
func (r *ResctrlSchemataRaw) ValidateMB() (bool, string)
func (*ResctrlSchemataRaw) WithL3Mask ¶ added in v1.1.0
func (r *ResctrlSchemataRaw) WithL3Mask(mask string) *ResctrlSchemataRaw
func (*ResctrlSchemataRaw) WithL3Num ¶ added in v1.1.0
func (r *ResctrlSchemataRaw) WithL3Num(l3Num int) *ResctrlSchemataRaw
func (*ResctrlSchemataRaw) WithMB ¶ added in v1.2.0
func (r *ResctrlSchemataRaw) WithMB(valueOrPercent string) *ResctrlSchemataRaw
type Resource ¶ added in v1.1.0
type Resource interface { // ResourceType is the type of system resource. e.g. "cpu.cfs_quota_us", "cpu.cfs_period_us", "schemata" ResourceType() ResourceType // Path is the generated system file path according to the given parent directory. // e.g. "/host-cgroup/kubepods/kubepods-podxxx/cpu.shares" Path(dynamicPath string) string // IsSupported checks whether the system resource is supported in current platform IsSupported(dynamicPath string) (bool, string) // IsValid checks whether the given value is valid for the system resource's content IsValid(v string) (bool, string) // WithValidator sets the ResourceValidator for the resource WithValidator(validator ResourceValidator) Resource // WithSupported sets the Supported status of the resource when it is initialized. WithSupported(supported bool, msg string) Resource // WithCheckSupported sets the check function for the Supported status of given resource and parent directory. WithCheckSupported(checkSupportedFn func(r Resource, dynamicPath string) (isSupported bool, msg string)) Resource // WithCheckOnce sets the check function only checking once and then use the result as the Supported status. WithCheckOnce(isCheckOnce bool) Resource }
func GetCgroupResource ¶ added in v1.1.0
func GetCgroupResource(resourceType ResourceType) (Resource, error)
func NewCommonCgroupResource ¶ added in v1.1.0
func NewCommonCgroupResource(resourceType ResourceType, filename string, subfs string) Resource
func NewCommonResctrlResource ¶ added in v1.1.0
func NewCommonSystemResource ¶ added in v1.2.0
type ResourceType ¶ added in v1.1.0
type ResourceType string
func GetDefaultResourceType ¶ added in v1.1.0
func GetDefaultResourceType(subfs string, filename string) ResourceType
type ResourceValidator ¶ added in v1.1.0
ResourceValidator validates the resource value
type SystemResource ¶ added in v1.2.0
type SystemResource struct { Type ResourceType RootDir func() string RelativePath string FileName string Validator ResourceValidator Supported *bool SupportMsg string CheckSupported func(r Resource, dynamicPath string) (isSupported bool, msg string) CheckOnce bool }
func (*SystemResource) IsSupported ¶ added in v1.2.0
func (c *SystemResource) IsSupported(dynamicPath string) (bool, string)
func (*SystemResource) IsValid ¶ added in v1.2.0
func (c *SystemResource) IsValid(v string) (bool, string)
func (*SystemResource) Path ¶ added in v1.2.0
func (c *SystemResource) Path(dynamicPath string) string
func (*SystemResource) ResourceType ¶ added in v1.2.0
func (c *SystemResource) ResourceType() ResourceType
func (*SystemResource) WithCheckOnce ¶ added in v1.3.0
func (c *SystemResource) WithCheckOnce(isCheckOnce bool) Resource
func (*SystemResource) WithCheckSupported ¶ added in v1.2.0
func (*SystemResource) WithSupported ¶ added in v1.2.0
func (c *SystemResource) WithSupported(isSupported bool, msg string) Resource
func (*SystemResource) WithValidator ¶ added in v1.2.0
func (c *SystemResource) WithValidator(validator ResourceValidator) Resource
type VersionInfo ¶
type VersionInfo struct { // Open Anolis OS (kernel): https://github.com/alibaba/cloud-kernel IsAnolisOS bool }
Source Files ¶
- cgroup.go
- cgroup2.go
- cgroup_driver.go
- cgroup_driver_linux.go
- cgroup_resource.go
- common.go
- common_linux.go
- config.go
- core_sched.go
- core_sched_linux.go
- cpu_manager_linux.go
- kidled_util.go
- lscpu.go
- proc.go
- psi.go
- resctrl.go
- resctrl_linux.go
- resource.go
- system_file.go
- system_resource.go
- util_test_tool.go
- validator.go
- version.go