下图是cpu使用的分类

容器cpu资源的限制
容器通过cgroup来限制cpu资源的使用,而cgroup限制的是进程资源的使用。只包括用户态us、ni,以及内核态的sys。其他的部分如IO等待和中断是不会进行限制的。
cgroup通过在/sys/fs/cgroup/cpu建立树型结构来对cpu进行限制。其下的每个目录都是一个控制组,其中cpu相关的内容有
# ls cpu.*
cpu.cfs_period_us cpu.cfs_quota_us cpu.rt_period_us cpu.rt_runtime_us cpu.shares cpu.stat- cpu.cfs_period_us:linux进程调度CFS算法的一个调度周期。一般值为100000,即100ms
- cpu.cfs_quota_us:一个调度周期内,这个控制组下的进程允许运行的时间。与cpu.cfs_period_us的比值就是允许使用的cpu个数
- cpu.shares:前面两个参数设置了一个控制组下的进程能够使用的cpu的绝对值。这个参数则是在cpu占满了的情况下,在控制组之间按比例分配cpu。1024表示一个cpu,所以取值可以设置为1024的倍数。
容器cpu使用率的计算
在linux的/proc目录下统计了瞬时时间的系统、进程cpu获得的系统ticks,将一段时间的系统或进程获得的ticks与单个cpu在这段时间的ticks求比值,即可得到系统的cpu使用率,以及进程的cpu使用率。 top命令正是那从/proc下的文件去的值,并每隔一段时间进行计算来获得使用率的。
/proc/stat文件是整个节点的,不属于任何一个Namespace,所以在容器内部是没有办法通过top来获取整个容器的cpu使用率的。
容器的cpu使用率要从cgroup控制组下的cpuacct.stat中获得。
load average容器负载仍然高于cpu限制
load average记录了一段时间内cpu的负载。在linux当中: Load Average= 可运行队列进程平均数 + 休眠队列中不可打断的进程平均数。
简单来说就是正在运行的进程 + 等待资源的进程。在linux中就是显示为D的进程。容器的负载很高的情况下,就需要判断一下D进程的数目,所以最好也要监控一下。D进程很多说明容器使用的磁盘性能不够,造成很多进程等待资源,这个时候可以考虑更换高性能的硬盘。