Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
45d1a128
Commit
45d1a128
authored
Feb 23, 2018
by
Pengfei Ni
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update godeps
parent
b0a49e19
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
814 additions
and
0 deletions
+814
-0
Godeps.json
Godeps/Godeps.json
+0
-0
LICENSES
Godeps/LICENSES
+0
-0
BUILD
vendor/BUILD
+2
-0
BUILD
vendor/github.com/docker/docker/pkg/parsers/BUILD
+22
-0
parsers.go
vendor/github.com/docker/docker/pkg/parsers/parsers.go
+69
-0
BUILD
vendor/github.com/docker/docker/pkg/sysinfo/BUILD
+90
-0
README.md
vendor/github.com/docker/docker/pkg/sysinfo/README.md
+1
-0
numcpu.go
vendor/github.com/docker/docker/pkg/sysinfo/numcpu.go
+12
-0
numcpu_linux.go
vendor/github.com/docker/docker/pkg/sysinfo/numcpu_linux.go
+44
-0
numcpu_windows.go
...or/github.com/docker/docker/pkg/sysinfo/numcpu_windows.go
+37
-0
sysinfo.go
vendor/github.com/docker/docker/pkg/sysinfo/sysinfo.go
+144
-0
sysinfo_linux.go
vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_linux.go
+254
-0
sysinfo_solaris.go
...r/github.com/docker/docker/pkg/sysinfo/sysinfo_solaris.go
+121
-0
sysinfo_unix.go
vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_unix.go
+9
-0
sysinfo_windows.go
...r/github.com/docker/docker/pkg/sysinfo/sysinfo_windows.go
+9
-0
No files found.
Godeps/Godeps.json
View file @
45d1a128
This diff is collapsed.
Click to expand it.
Godeps/LICENSES
View file @
45d1a128
This diff is collapsed.
Click to expand it.
vendor/BUILD
View file @
45d1a128
...
@@ -147,7 +147,9 @@ filegroup(
...
@@ -147,7 +147,9 @@ filegroup(
"//vendor/github.com/docker/docker/pkg/jsonmessage:all-srcs",
"//vendor/github.com/docker/docker/pkg/jsonmessage:all-srcs",
"//vendor/github.com/docker/docker/pkg/longpath:all-srcs",
"//vendor/github.com/docker/docker/pkg/longpath:all-srcs",
"//vendor/github.com/docker/docker/pkg/mount:all-srcs",
"//vendor/github.com/docker/docker/pkg/mount:all-srcs",
"//vendor/github.com/docker/docker/pkg/parsers:all-srcs",
"//vendor/github.com/docker/docker/pkg/stdcopy:all-srcs",
"//vendor/github.com/docker/docker/pkg/stdcopy:all-srcs",
"//vendor/github.com/docker/docker/pkg/sysinfo:all-srcs",
"//vendor/github.com/docker/docker/pkg/system:all-srcs",
"//vendor/github.com/docker/docker/pkg/system:all-srcs",
"//vendor/github.com/docker/docker/pkg/term:all-srcs",
"//vendor/github.com/docker/docker/pkg/term:all-srcs",
"//vendor/github.com/docker/docker/pkg/tlsconfig:all-srcs",
"//vendor/github.com/docker/docker/pkg/tlsconfig:all-srcs",
...
...
vendor/github.com/docker/docker/pkg/parsers/BUILD
0 → 100644
View file @
45d1a128
load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = ["parsers.go"],
importpath = "github.com/docker/docker/pkg/parsers",
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
vendor/github.com/docker/docker/pkg/parsers/parsers.go
0 → 100644
View file @
45d1a128
// Package parsers provides helper functions to parse and validate different type
// of string. It can be hosts, unix addresses, tcp addresses, filters, kernel
// operating system versions.
package
parsers
import
(
"fmt"
"strconv"
"strings"
)
// ParseKeyValueOpt parses and validates the specified string as a key/value pair (key=value)
func
ParseKeyValueOpt
(
opt
string
)
(
string
,
string
,
error
)
{
parts
:=
strings
.
SplitN
(
opt
,
"="
,
2
)
if
len
(
parts
)
!=
2
{
return
""
,
""
,
fmt
.
Errorf
(
"Unable to parse key/value option: %s"
,
opt
)
}
return
strings
.
TrimSpace
(
parts
[
0
]),
strings
.
TrimSpace
(
parts
[
1
]),
nil
}
// ParseUintList parses and validates the specified string as the value
// found in some cgroup file (e.g. `cpuset.cpus`, `cpuset.mems`), which could be
// one of the formats below. Note that duplicates are actually allowed in the
// input string. It returns a `map[int]bool` with available elements from `val`
// set to `true`.
// Supported formats:
// 7
// 1-6
// 0,3-4,7,8-10
// 0-0,0,1-7
// 03,1-3 <- this is gonna get parsed as [1,2,3]
// 3,2,1
// 0-2,3,1
func
ParseUintList
(
val
string
)
(
map
[
int
]
bool
,
error
)
{
if
val
==
""
{
return
map
[
int
]
bool
{},
nil
}
availableInts
:=
make
(
map
[
int
]
bool
)
split
:=
strings
.
Split
(
val
,
","
)
errInvalidFormat
:=
fmt
.
Errorf
(
"invalid format: %s"
,
val
)
for
_
,
r
:=
range
split
{
if
!
strings
.
Contains
(
r
,
"-"
)
{
v
,
err
:=
strconv
.
Atoi
(
r
)
if
err
!=
nil
{
return
nil
,
errInvalidFormat
}
availableInts
[
v
]
=
true
}
else
{
split
:=
strings
.
SplitN
(
r
,
"-"
,
2
)
min
,
err
:=
strconv
.
Atoi
(
split
[
0
])
if
err
!=
nil
{
return
nil
,
errInvalidFormat
}
max
,
err
:=
strconv
.
Atoi
(
split
[
1
])
if
err
!=
nil
{
return
nil
,
errInvalidFormat
}
if
max
<
min
{
return
nil
,
errInvalidFormat
}
for
i
:=
min
;
i
<=
max
;
i
++
{
availableInts
[
i
]
=
true
}
}
}
return
availableInts
,
nil
}
vendor/github.com/docker/docker/pkg/sysinfo/BUILD
0 → 100644
View file @
45d1a128
load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = [
"sysinfo.go",
] + select({
"@io_bazel_rules_go//go/platform:android": [
"numcpu.go",
"sysinfo_unix.go",
],
"@io_bazel_rules_go//go/platform:darwin": [
"numcpu.go",
"sysinfo_unix.go",
],
"@io_bazel_rules_go//go/platform:dragonfly": [
"numcpu.go",
"sysinfo_unix.go",
],
"@io_bazel_rules_go//go/platform:freebsd": [
"numcpu.go",
"sysinfo_unix.go",
],
"@io_bazel_rules_go//go/platform:linux": [
"numcpu_linux.go",
"sysinfo_linux.go",
],
"@io_bazel_rules_go//go/platform:nacl": [
"numcpu.go",
"sysinfo_unix.go",
],
"@io_bazel_rules_go//go/platform:netbsd": [
"numcpu.go",
"sysinfo_unix.go",
],
"@io_bazel_rules_go//go/platform:openbsd": [
"numcpu.go",
"sysinfo_unix.go",
],
"@io_bazel_rules_go//go/platform:plan9": [
"numcpu.go",
"sysinfo_unix.go",
],
"@io_bazel_rules_go//go/platform:solaris": [
"numcpu.go",
"sysinfo_solaris.go",
],
"@io_bazel_rules_go//go/platform:windows": [
"numcpu_windows.go",
"sysinfo_windows.go",
],
"//conditions:default": [],
}),
cgo = True,
clinkopts = select({
"@io_bazel_rules_go//go/platform:solaris": [
"-llgrp",
],
"//conditions:default": [],
}),
importpath = "github.com/docker/docker/pkg/sysinfo",
visibility = ["//visibility:public"],
deps = [
"//vendor/github.com/docker/docker/pkg/parsers:go_default_library",
] + select({
"@io_bazel_rules_go//go/platform:linux": [
"//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library",
"//vendor/github.com/sirupsen/logrus:go_default_library",
"//vendor/golang.org/x/sys/unix:go_default_library",
],
"@io_bazel_rules_go//go/platform:windows": [
"//vendor/golang.org/x/sys/windows:go_default_library",
],
"//conditions:default": [],
}),
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
vendor/github.com/docker/docker/pkg/sysinfo/README.md
0 → 100644
View file @
45d1a128
SysInfo stores information about which features a kernel supports.
vendor/github.com/docker/docker/pkg/sysinfo/numcpu.go
0 → 100644
View file @
45d1a128
// +build !linux,!windows
package
sysinfo
import
(
"runtime"
)
// NumCPU returns the number of CPUs
func
NumCPU
()
int
{
return
runtime
.
NumCPU
()
}
vendor/github.com/docker/docker/pkg/sysinfo/numcpu_linux.go
0 → 100644
View file @
45d1a128
// +build linux
package
sysinfo
import
(
"runtime"
"unsafe"
"golang.org/x/sys/unix"
)
// numCPU queries the system for the count of threads available
// for use to this process.
//
// Issues two syscalls.
// Returns 0 on errors. Use |runtime.NumCPU| in that case.
func
numCPU
()
int
{
// Gets the affinity mask for a process: The very one invoking this function.
pid
,
_
,
_
:=
unix
.
RawSyscall
(
unix
.
SYS_GETPID
,
0
,
0
,
0
)
var
mask
[
1024
/
64
]
uintptr
_
,
_
,
err
:=
unix
.
RawSyscall
(
unix
.
SYS_SCHED_GETAFFINITY
,
pid
,
uintptr
(
len
(
mask
)
*
8
),
uintptr
(
unsafe
.
Pointer
(
&
mask
[
0
])))
if
err
!=
0
{
return
0
}
// For every available thread a bit is set in the mask.
ncpu
:=
0
for
_
,
e
:=
range
mask
{
if
e
==
0
{
continue
}
ncpu
+=
int
(
popcnt
(
uint64
(
e
)))
}
return
ncpu
}
// NumCPU returns the number of CPUs which are currently online
func
NumCPU
()
int
{
if
ncpu
:=
numCPU
();
ncpu
>
0
{
return
ncpu
}
return
runtime
.
NumCPU
()
}
vendor/github.com/docker/docker/pkg/sysinfo/numcpu_windows.go
0 → 100644
View file @
45d1a128
// +build windows
package
sysinfo
import
(
"runtime"
"unsafe"
"golang.org/x/sys/windows"
)
var
(
kernel32
=
windows
.
NewLazySystemDLL
(
"kernel32.dll"
)
getCurrentProcess
=
kernel32
.
NewProc
(
"GetCurrentProcess"
)
getProcessAffinityMask
=
kernel32
.
NewProc
(
"GetProcessAffinityMask"
)
)
func
numCPU
()
int
{
// Gets the affinity mask for a process
var
mask
,
sysmask
uintptr
currentProcess
,
_
,
_
:=
getCurrentProcess
.
Call
()
ret
,
_
,
_
:=
getProcessAffinityMask
.
Call
(
currentProcess
,
uintptr
(
unsafe
.
Pointer
(
&
mask
)),
uintptr
(
unsafe
.
Pointer
(
&
sysmask
)))
if
ret
==
0
{
return
0
}
// For every available thread a bit is set in the mask.
ncpu
:=
int
(
popcnt
(
uint64
(
mask
)))
return
ncpu
}
// NumCPU returns the number of CPUs which are currently online
func
NumCPU
()
int
{
if
ncpu
:=
numCPU
();
ncpu
>
0
{
return
ncpu
}
return
runtime
.
NumCPU
()
}
vendor/github.com/docker/docker/pkg/sysinfo/sysinfo.go
0 → 100644
View file @
45d1a128
package
sysinfo
import
"github.com/docker/docker/pkg/parsers"
// SysInfo stores information about which features a kernel supports.
// TODO Windows: Factor out platform specific capabilities.
type
SysInfo
struct
{
// Whether the kernel supports AppArmor or not
AppArmor
bool
// Whether the kernel supports Seccomp or not
Seccomp
bool
cgroupMemInfo
cgroupCPUInfo
cgroupBlkioInfo
cgroupCpusetInfo
cgroupPids
// Whether IPv4 forwarding is supported or not, if this was disabled, networking will not work
IPv4ForwardingDisabled
bool
// Whether bridge-nf-call-iptables is supported or not
BridgeNFCallIPTablesDisabled
bool
// Whether bridge-nf-call-ip6tables is supported or not
BridgeNFCallIP6TablesDisabled
bool
// Whether the cgroup has the mountpoint of "devices" or not
CgroupDevicesEnabled
bool
}
type
cgroupMemInfo
struct
{
// Whether memory limit is supported or not
MemoryLimit
bool
// Whether swap limit is supported or not
SwapLimit
bool
// Whether soft limit is supported or not
MemoryReservation
bool
// Whether OOM killer disable is supported or not
OomKillDisable
bool
// Whether memory swappiness is supported or not
MemorySwappiness
bool
// Whether kernel memory limit is supported or not
KernelMemory
bool
}
type
cgroupCPUInfo
struct
{
// Whether CPU shares is supported or not
CPUShares
bool
// Whether CPU CFS(Completely Fair Scheduler) period is supported or not
CPUCfsPeriod
bool
// Whether CPU CFS(Completely Fair Scheduler) quota is supported or not
CPUCfsQuota
bool
// Whether CPU real-time period is supported or not
CPURealtimePeriod
bool
// Whether CPU real-time runtime is supported or not
CPURealtimeRuntime
bool
}
type
cgroupBlkioInfo
struct
{
// Whether Block IO weight is supported or not
BlkioWeight
bool
// Whether Block IO weight_device is supported or not
BlkioWeightDevice
bool
// Whether Block IO read limit in bytes per second is supported or not
BlkioReadBpsDevice
bool
// Whether Block IO write limit in bytes per second is supported or not
BlkioWriteBpsDevice
bool
// Whether Block IO read limit in IO per second is supported or not
BlkioReadIOpsDevice
bool
// Whether Block IO write limit in IO per second is supported or not
BlkioWriteIOpsDevice
bool
}
type
cgroupCpusetInfo
struct
{
// Whether Cpuset is supported or not
Cpuset
bool
// Available Cpuset's cpus
Cpus
string
// Available Cpuset's memory nodes
Mems
string
}
type
cgroupPids
struct
{
// Whether Pids Limit is supported or not
PidsLimit
bool
}
// IsCpusetCpusAvailable returns `true` if the provided string set is contained
// in cgroup's cpuset.cpus set, `false` otherwise.
// If error is not nil a parsing error occurred.
func
(
c
cgroupCpusetInfo
)
IsCpusetCpusAvailable
(
provided
string
)
(
bool
,
error
)
{
return
isCpusetListAvailable
(
provided
,
c
.
Cpus
)
}
// IsCpusetMemsAvailable returns `true` if the provided string set is contained
// in cgroup's cpuset.mems set, `false` otherwise.
// If error is not nil a parsing error occurred.
func
(
c
cgroupCpusetInfo
)
IsCpusetMemsAvailable
(
provided
string
)
(
bool
,
error
)
{
return
isCpusetListAvailable
(
provided
,
c
.
Mems
)
}
func
isCpusetListAvailable
(
provided
,
available
string
)
(
bool
,
error
)
{
parsedProvided
,
err
:=
parsers
.
ParseUintList
(
provided
)
if
err
!=
nil
{
return
false
,
err
}
parsedAvailable
,
err
:=
parsers
.
ParseUintList
(
available
)
if
err
!=
nil
{
return
false
,
err
}
for
k
:=
range
parsedProvided
{
if
!
parsedAvailable
[
k
]
{
return
false
,
nil
}
}
return
true
,
nil
}
// Returns bit count of 1, used by NumCPU
func
popcnt
(
x
uint64
)
(
n
byte
)
{
x
-=
(
x
>>
1
)
&
0x5555555555555555
x
=
(
x
>>
2
)
&
0x3333333333333333
+
x
&
0x3333333333333333
x
+=
x
>>
4
x
&=
0x0f0f0f0f0f0f0f0f
x
*=
0x0101010101010101
return
byte
(
x
>>
56
)
}
vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_linux.go
0 → 100644
View file @
45d1a128
package
sysinfo
import
(
"fmt"
"io/ioutil"
"os"
"path"
"strings"
"github.com/opencontainers/runc/libcontainer/cgroups"
"github.com/sirupsen/logrus"
"golang.org/x/sys/unix"
)
func
findCgroupMountpoints
()
(
map
[
string
]
string
,
error
)
{
cgMounts
,
err
:=
cgroups
.
GetCgroupMounts
(
false
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"Failed to parse cgroup information: %v"
,
err
)
}
mps
:=
make
(
map
[
string
]
string
)
for
_
,
m
:=
range
cgMounts
{
for
_
,
ss
:=
range
m
.
Subsystems
{
mps
[
ss
]
=
m
.
Mountpoint
}
}
return
mps
,
nil
}
// New returns a new SysInfo, using the filesystem to detect which features
// the kernel supports. If `quiet` is `false` warnings are printed in logs
// whenever an error occurs or misconfigurations are present.
func
New
(
quiet
bool
)
*
SysInfo
{
sysInfo
:=
&
SysInfo
{}
cgMounts
,
err
:=
findCgroupMountpoints
()
if
err
!=
nil
{
logrus
.
Warnf
(
"Failed to parse cgroup information: %v"
,
err
)
}
else
{
sysInfo
.
cgroupMemInfo
=
checkCgroupMem
(
cgMounts
,
quiet
)
sysInfo
.
cgroupCPUInfo
=
checkCgroupCPU
(
cgMounts
,
quiet
)
sysInfo
.
cgroupBlkioInfo
=
checkCgroupBlkioInfo
(
cgMounts
,
quiet
)
sysInfo
.
cgroupCpusetInfo
=
checkCgroupCpusetInfo
(
cgMounts
,
quiet
)
sysInfo
.
cgroupPids
=
checkCgroupPids
(
quiet
)
}
_
,
ok
:=
cgMounts
[
"devices"
]
sysInfo
.
CgroupDevicesEnabled
=
ok
sysInfo
.
IPv4ForwardingDisabled
=
!
readProcBool
(
"/proc/sys/net/ipv4/ip_forward"
)
sysInfo
.
BridgeNFCallIPTablesDisabled
=
!
readProcBool
(
"/proc/sys/net/bridge/bridge-nf-call-iptables"
)
sysInfo
.
BridgeNFCallIP6TablesDisabled
=
!
readProcBool
(
"/proc/sys/net/bridge/bridge-nf-call-ip6tables"
)
// Check if AppArmor is supported.
if
_
,
err
:=
os
.
Stat
(
"/sys/kernel/security/apparmor"
);
!
os
.
IsNotExist
(
err
)
{
sysInfo
.
AppArmor
=
true
}
// Check if Seccomp is supported, via CONFIG_SECCOMP.
if
err
:=
unix
.
Prctl
(
unix
.
PR_GET_SECCOMP
,
0
,
0
,
0
,
0
);
err
!=
unix
.
EINVAL
{
// Make sure the kernel has CONFIG_SECCOMP_FILTER.
if
err
:=
unix
.
Prctl
(
unix
.
PR_SET_SECCOMP
,
unix
.
SECCOMP_MODE_FILTER
,
0
,
0
,
0
);
err
!=
unix
.
EINVAL
{
sysInfo
.
Seccomp
=
true
}
}
return
sysInfo
}
// checkCgroupMem reads the memory information from the memory cgroup mount point.
func
checkCgroupMem
(
cgMounts
map
[
string
]
string
,
quiet
bool
)
cgroupMemInfo
{
mountPoint
,
ok
:=
cgMounts
[
"memory"
]
if
!
ok
{
if
!
quiet
{
logrus
.
Warn
(
"Your kernel does not support cgroup memory limit"
)
}
return
cgroupMemInfo
{}
}
swapLimit
:=
cgroupEnabled
(
mountPoint
,
"memory.memsw.limit_in_bytes"
)
if
!
quiet
&&
!
swapLimit
{
logrus
.
Warn
(
"Your kernel does not support swap memory limit"
)
}
memoryReservation
:=
cgroupEnabled
(
mountPoint
,
"memory.soft_limit_in_bytes"
)
if
!
quiet
&&
!
memoryReservation
{
logrus
.
Warn
(
"Your kernel does not support memory reservation"
)
}
oomKillDisable
:=
cgroupEnabled
(
mountPoint
,
"memory.oom_control"
)
if
!
quiet
&&
!
oomKillDisable
{
logrus
.
Warn
(
"Your kernel does not support oom control"
)
}
memorySwappiness
:=
cgroupEnabled
(
mountPoint
,
"memory.swappiness"
)
if
!
quiet
&&
!
memorySwappiness
{
logrus
.
Warn
(
"Your kernel does not support memory swappiness"
)
}
kernelMemory
:=
cgroupEnabled
(
mountPoint
,
"memory.kmem.limit_in_bytes"
)
if
!
quiet
&&
!
kernelMemory
{
logrus
.
Warn
(
"Your kernel does not support kernel memory limit"
)
}
return
cgroupMemInfo
{
MemoryLimit
:
true
,
SwapLimit
:
swapLimit
,
MemoryReservation
:
memoryReservation
,
OomKillDisable
:
oomKillDisable
,
MemorySwappiness
:
memorySwappiness
,
KernelMemory
:
kernelMemory
,
}
}
// checkCgroupCPU reads the cpu information from the cpu cgroup mount point.
func
checkCgroupCPU
(
cgMounts
map
[
string
]
string
,
quiet
bool
)
cgroupCPUInfo
{
mountPoint
,
ok
:=
cgMounts
[
"cpu"
]
if
!
ok
{
if
!
quiet
{
logrus
.
Warn
(
"Unable to find cpu cgroup in mounts"
)
}
return
cgroupCPUInfo
{}
}
cpuShares
:=
cgroupEnabled
(
mountPoint
,
"cpu.shares"
)
if
!
quiet
&&
!
cpuShares
{
logrus
.
Warn
(
"Your kernel does not support cgroup cpu shares"
)
}
cpuCfsPeriod
:=
cgroupEnabled
(
mountPoint
,
"cpu.cfs_period_us"
)
if
!
quiet
&&
!
cpuCfsPeriod
{
logrus
.
Warn
(
"Your kernel does not support cgroup cfs period"
)
}
cpuCfsQuota
:=
cgroupEnabled
(
mountPoint
,
"cpu.cfs_quota_us"
)
if
!
quiet
&&
!
cpuCfsQuota
{
logrus
.
Warn
(
"Your kernel does not support cgroup cfs quotas"
)
}
cpuRealtimePeriod
:=
cgroupEnabled
(
mountPoint
,
"cpu.rt_period_us"
)
if
!
quiet
&&
!
cpuRealtimePeriod
{
logrus
.
Warn
(
"Your kernel does not support cgroup rt period"
)
}
cpuRealtimeRuntime
:=
cgroupEnabled
(
mountPoint
,
"cpu.rt_runtime_us"
)
if
!
quiet
&&
!
cpuRealtimeRuntime
{
logrus
.
Warn
(
"Your kernel does not support cgroup rt runtime"
)
}
return
cgroupCPUInfo
{
CPUShares
:
cpuShares
,
CPUCfsPeriod
:
cpuCfsPeriod
,
CPUCfsQuota
:
cpuCfsQuota
,
CPURealtimePeriod
:
cpuRealtimePeriod
,
CPURealtimeRuntime
:
cpuRealtimeRuntime
,
}
}
// checkCgroupBlkioInfo reads the blkio information from the blkio cgroup mount point.
func
checkCgroupBlkioInfo
(
cgMounts
map
[
string
]
string
,
quiet
bool
)
cgroupBlkioInfo
{
mountPoint
,
ok
:=
cgMounts
[
"blkio"
]
if
!
ok
{
if
!
quiet
{
logrus
.
Warn
(
"Unable to find blkio cgroup in mounts"
)
}
return
cgroupBlkioInfo
{}
}
weight
:=
cgroupEnabled
(
mountPoint
,
"blkio.weight"
)
if
!
quiet
&&
!
weight
{
logrus
.
Warn
(
"Your kernel does not support cgroup blkio weight"
)
}
weightDevice
:=
cgroupEnabled
(
mountPoint
,
"blkio.weight_device"
)
if
!
quiet
&&
!
weightDevice
{
logrus
.
Warn
(
"Your kernel does not support cgroup blkio weight_device"
)
}
readBpsDevice
:=
cgroupEnabled
(
mountPoint
,
"blkio.throttle.read_bps_device"
)
if
!
quiet
&&
!
readBpsDevice
{
logrus
.
Warn
(
"Your kernel does not support cgroup blkio throttle.read_bps_device"
)
}
writeBpsDevice
:=
cgroupEnabled
(
mountPoint
,
"blkio.throttle.write_bps_device"
)
if
!
quiet
&&
!
writeBpsDevice
{
logrus
.
Warn
(
"Your kernel does not support cgroup blkio throttle.write_bps_device"
)
}
readIOpsDevice
:=
cgroupEnabled
(
mountPoint
,
"blkio.throttle.read_iops_device"
)
if
!
quiet
&&
!
readIOpsDevice
{
logrus
.
Warn
(
"Your kernel does not support cgroup blkio throttle.read_iops_device"
)
}
writeIOpsDevice
:=
cgroupEnabled
(
mountPoint
,
"blkio.throttle.write_iops_device"
)
if
!
quiet
&&
!
writeIOpsDevice
{
logrus
.
Warn
(
"Your kernel does not support cgroup blkio throttle.write_iops_device"
)
}
return
cgroupBlkioInfo
{
BlkioWeight
:
weight
,
BlkioWeightDevice
:
weightDevice
,
BlkioReadBpsDevice
:
readBpsDevice
,
BlkioWriteBpsDevice
:
writeBpsDevice
,
BlkioReadIOpsDevice
:
readIOpsDevice
,
BlkioWriteIOpsDevice
:
writeIOpsDevice
,
}
}
// checkCgroupCpusetInfo reads the cpuset information from the cpuset cgroup mount point.
func
checkCgroupCpusetInfo
(
cgMounts
map
[
string
]
string
,
quiet
bool
)
cgroupCpusetInfo
{
mountPoint
,
ok
:=
cgMounts
[
"cpuset"
]
if
!
ok
{
if
!
quiet
{
logrus
.
Warn
(
"Unable to find cpuset cgroup in mounts"
)
}
return
cgroupCpusetInfo
{}
}
cpus
,
err
:=
ioutil
.
ReadFile
(
path
.
Join
(
mountPoint
,
"cpuset.cpus"
))
if
err
!=
nil
{
return
cgroupCpusetInfo
{}
}
mems
,
err
:=
ioutil
.
ReadFile
(
path
.
Join
(
mountPoint
,
"cpuset.mems"
))
if
err
!=
nil
{
return
cgroupCpusetInfo
{}
}
return
cgroupCpusetInfo
{
Cpuset
:
true
,
Cpus
:
strings
.
TrimSpace
(
string
(
cpus
)),
Mems
:
strings
.
TrimSpace
(
string
(
mems
)),
}
}
// checkCgroupPids reads the pids information from the pids cgroup mount point.
func
checkCgroupPids
(
quiet
bool
)
cgroupPids
{
_
,
err
:=
cgroups
.
FindCgroupMountpoint
(
"pids"
)
if
err
!=
nil
{
if
!
quiet
{
logrus
.
Warn
(
err
)
}
return
cgroupPids
{}
}
return
cgroupPids
{
PidsLimit
:
true
,
}
}
func
cgroupEnabled
(
mountPoint
,
name
string
)
bool
{
_
,
err
:=
os
.
Stat
(
path
.
Join
(
mountPoint
,
name
))
return
err
==
nil
}
func
readProcBool
(
path
string
)
bool
{
val
,
err
:=
ioutil
.
ReadFile
(
path
)
if
err
!=
nil
{
return
false
}
return
strings
.
TrimSpace
(
string
(
val
))
==
"1"
}
vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_solaris.go
0 → 100644
View file @
45d1a128
// +build solaris,cgo
package
sysinfo
import
(
"bytes"
"os/exec"
"strconv"
"strings"
)
/*
#cgo LDFLAGS: -llgrp
#include <unistd.h>
#include <stdlib.h>
#include <sys/lgrp_user.h>
int getLgrpCount() {
lgrp_cookie_t lgrpcookie = LGRP_COOKIE_NONE;
uint_t nlgrps;
if ((lgrpcookie = lgrp_init(LGRP_VIEW_OS)) == LGRP_COOKIE_NONE) {
return -1;
}
nlgrps = lgrp_nlgrps(lgrpcookie);
return nlgrps;
}
*/
import
"C"
// IsCPUSharesAvailable returns whether CPUShares setting is supported.
// We need FSS to be set as default scheduling class to support CPU Shares
func
IsCPUSharesAvailable
()
bool
{
cmd
:=
exec
.
Command
(
"/usr/sbin/dispadmin"
,
"-d"
)
outBuf
:=
new
(
bytes
.
Buffer
)
errBuf
:=
new
(
bytes
.
Buffer
)
cmd
.
Stderr
=
errBuf
cmd
.
Stdout
=
outBuf
if
err
:=
cmd
.
Run
();
err
!=
nil
{
return
false
}
return
(
strings
.
Contains
(
outBuf
.
String
(),
"FSS"
))
}
// New returns a new SysInfo, using the filesystem to detect which features
// the kernel supports.
//NOTE Solaris: If we change the below capabilities be sure
// to update verifyPlatformContainerSettings() in daemon_solaris.go
func
New
(
quiet
bool
)
*
SysInfo
{
sysInfo
:=
&
SysInfo
{}
sysInfo
.
cgroupMemInfo
=
setCgroupMem
(
quiet
)
sysInfo
.
cgroupCPUInfo
=
setCgroupCPU
(
quiet
)
sysInfo
.
cgroupBlkioInfo
=
setCgroupBlkioInfo
(
quiet
)
sysInfo
.
cgroupCpusetInfo
=
setCgroupCPUsetInfo
(
quiet
)
sysInfo
.
IPv4ForwardingDisabled
=
false
sysInfo
.
AppArmor
=
false
return
sysInfo
}
// setCgroupMem reads the memory information for Solaris.
func
setCgroupMem
(
quiet
bool
)
cgroupMemInfo
{
return
cgroupMemInfo
{
MemoryLimit
:
true
,
SwapLimit
:
true
,
MemoryReservation
:
false
,
OomKillDisable
:
false
,
MemorySwappiness
:
false
,
KernelMemory
:
false
,
}
}
// setCgroupCPU reads the cpu information for Solaris.
func
setCgroupCPU
(
quiet
bool
)
cgroupCPUInfo
{
return
cgroupCPUInfo
{
CPUShares
:
true
,
CPUCfsPeriod
:
false
,
CPUCfsQuota
:
true
,
CPURealtimePeriod
:
false
,
CPURealtimeRuntime
:
false
,
}
}
// blkio switches are not supported in Solaris.
func
setCgroupBlkioInfo
(
quiet
bool
)
cgroupBlkioInfo
{
return
cgroupBlkioInfo
{
BlkioWeight
:
false
,
BlkioWeightDevice
:
false
,
}
}
// setCgroupCPUsetInfo reads the cpuset information for Solaris.
func
setCgroupCPUsetInfo
(
quiet
bool
)
cgroupCpusetInfo
{
return
cgroupCpusetInfo
{
Cpuset
:
true
,
Cpus
:
getCPUCount
(),
Mems
:
getLgrpCount
(),
}
}
func
getCPUCount
()
string
{
ncpus
:=
C
.
sysconf
(
C
.
_SC_NPROCESSORS_ONLN
)
if
ncpus
<=
0
{
return
""
}
return
strconv
.
FormatInt
(
int64
(
ncpus
),
16
)
}
func
getLgrpCount
()
string
{
nlgrps
:=
C
.
getLgrpCount
()
if
nlgrps
<=
0
{
return
""
}
return
strconv
.
FormatInt
(
int64
(
nlgrps
),
16
)
}
vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_unix.go
0 → 100644
View file @
45d1a128
// +build !linux,!solaris,!windows
package
sysinfo
// New returns an empty SysInfo for non linux nor solaris for now.
func
New
(
quiet
bool
)
*
SysInfo
{
sysInfo
:=
&
SysInfo
{}
return
sysInfo
}
vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_windows.go
0 → 100644
View file @
45d1a128
// +build windows
package
sysinfo
// New returns an empty SysInfo for windows for now.
func
New
(
quiet
bool
)
*
SysInfo
{
sysInfo
:=
&
SysInfo
{}
return
sysInfo
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment