CPU 时间片
什么是 CPU 时间片
宏观上,我们可以启动多个应用程序,例如使用下载软件下载文件时,在浏览器中观看视频。
看起来这两个应用是同时运行的:一遍下载文件,一遍播放视频。
实则不然,因为一个 CPU 在某一个时间点只可能执行一个任务。
宏观上的“同时”运行实际上只是微观上的“交替”执行。
简单理解,操作系统会维护一个任务队列,CPU 总是从队首取出任务,执行一段时间,然后将这个没执行完的任务放到队尾并将状态缓存起来,然后从队列中取出下一个任务,周而复始。
CPU 执行每个任务的时间就是 CPU 时间片(CPU Period),执行暂停后切换到下一个任务执行开始时需要将上一个任务的状态缓存下来,这个缓存过程称之为 上下文切换(Context Switch)或者 进程切换(Process Switch),上下文切换也需要一定的时间。
操作系统需要平衡 CPU 时间片和上下文切换的开销,例如 Linux CPU 时间片为 100 ms,上下文切换开销为 5 ms 时,CPU 将浪费 5 * 100 / ( 5 + 100) = 4.76% 的时间在切换上。
由于切换开销基本上变化很小,时间片大小的设置就对 CPU 的效率很重要。
时间片太短会导致过多的进程切换,CPU 效率下降,但是交互响应会提升;时间片变长,CPU 效率变高,但是系统对简单请求的响应会变慢。
Linux 中 CPU 时间片单位通常是微秒(μs),默认值是 100,000,即 100 毫秒。
多核系统中的 CPU 时间片
CPU Period 指的是一个核执行一个任务的最大时间长度。
在多核系统中,需要集合 CPU Period 和 CPU Quota 来给应用指定多核资源。
CPU Quota 指的是进程在每个 CPU 时间片内可以使用的 CPU 时间总量,单位微秒。
假设 CPU 时间片大小为 100 毫秒,CPU Quota 大小为 200 毫秒,说明应用在一个时间片内可以执行两倍时间片的任务量,换个说法就是用了两个核。
Docker 的 CPU 资源分配
Docker 运行容器时可以通过 --cpu-period
和 --cpu-quota
来指定 CPU 时间片和允许使用的最大核数。
# period=100ms & quota=50ms: 一个时间片内该容器最多只能调用0.5个核的资源
docker run --cpu-period=100000 --cpu-quota=50000 ...
# period=100ms & quota=150ms: 一个时间片内该容器最多可以调用1.5个核的资源
docker run --cpu-period=100000 --cpu-quota=150000 ...
# 更简单的写法是直接指定核数
docker run --cpus="0.5" ...
怎么选择 --cpu-period
?
- 任务性质:计算密集型任务可以给大一点,IO 密集型任务可以给小点
- 系统负载:负载较高时给小点,不然会卡卡的;负载较低时可以给大点
- 考虑与内存、网络的平衡……
评论区