0. cgroups
跑一个耗cpu的脚本
x=0while [ True ];do x=$x+1done;
top可以看到这个脚本基本占了100%的cpu资源
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 30142 root 20 0 104m 2520 1024 R 99.7 0.1 14:38.97 sh
下面用cgroups控制这个进程的cpu资源
mkdir -p /cgroup/cpu/foo/ #新建一个控制组foo
echo 50000 > /cgroup/cpu/foo/cpu.cfs_quota_us #将cpu.cfs_quota_us设为50000,相对于cpu.cfs_period_us的100000是50%echo 30142 > /cgroup/cpu/foo/tasks
然后top的实时统计数据如下,cpu占用率将近50%,看来cgroups关于cpu的控制起了效果
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 30142 root 20 0 105m 2884 1024 R 49.4 0.2 23:32.53 sh
cpu控制组foo下面还有其他的控制,还可以做更多其他的关于cpu的控制
[root@localhost ~]# ls /cgroup/cpu/foo/cgroup.event_control cgroup.procs cpu.cfs_period_us cpu.cfs_quota_us cpu.rt_period_us cpu.rt_runtime_us cpu.shares cpu.stat notify_on_release tasks
1. docker
docker run --help | grep cgroup --cgroup-parent string Optional parent cgroup for the container
这个参数指定的cgroup的配置文件的位置,指定位置run后
# docker run --cgroup-parent "/" nginxlocalhost:/sys/fs/cgroup/cpu # lscgroup.clone_children cpuacct.stat cpu.cfs_quota_us cpu.stat notify_on_release user.slicecgroup.event_control cpuacct.usage cpu.rt_period_us docker release_agentcgroup.procs cpuacct.usage_percpu cpu.rt_runtime_us f296b0316c259262e78110174f3b4a7329b026af99a14730f11cc0f215be9741 system.slicecgroup.sane_behavior cpu.cfs_period_us cpu.shares foo taskslocalhost:/sys/fs/cgroup/cpu # docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf296b0316c25 nginx "/entrypoint.sh" 2 minutes ago Up 2 minutes berserk_mclean
其中 f296b0316c25
这个目录就是创建的这个容器的cgroup控制目录
如果--cgroup-parent
没有设置为/
, 那么控制目录应该在 /sys/fs/cgroup/cpu/docker/
下
2. kubernetes控制
kubelet也提供了这个参数,用于定义pod的容器启动的cgroup控制
定义pod
localhost:/tmp/manifest # cat aa.manifest # Copy of pod.yaml without file extension for testapiVersion: v1kind: Podmetadata: name: nginx labels: name: nginxspec: containers: - name: nginx image: nginx ports: - containerPort: 80
用kubelet裸启动
kubelet --cgroup-root=/ --config /tmp/manifest/localhost:/sys/fs/cgroup/cpu/docker # docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1adc2179227f nginx "nginx -g 'daemon off" 1 seconds ago Up Less than a second k8s_nginx.156efd59_nginx-localhost_default_0539f3e7389c317750cd6a23a5509685_8a29cc5d902c8aa23657 gcr.io/google_containers/pause-amd64:3.0 "/pause" 4 seconds ago Up 3 seconds k8s_POD.b2390301_nginx-localhost_default_0539f3e7389c317750cd6a23a5509685_24406b11
观察cgroup的根目录位置
localhost:/sys/fs/cgroup/cpu # ls1adc2179227fa461ac349357b7fde73fdd47636b868aa5403875d79ca33d584b cgroup.procs cpuacct.usage_percpu cpu.rt_runtime_us foo tasks902c8aa236578d11bc8d97f4a7cfb72465fad1fdca0a6752735191d5638b5460 cgroup.sane_behavior cpu.cfs_period_us cpu.shares notify_on_release user.slicecgroup.clone_children cpuacct.stat cpu.cfs_quota_us cpu.stat release_agentcgroup.event_control cpuacct.usage cpu.rt_period_us docker system.slice
看到1adc了,同时也可以 pause容器的ID, 证明了这个选项起作用了。