概述
linux 时间子系统 二 时间系统的组成
时间轮,jiffies与HZ
时间轮是linux kernel处理内核低精度定时器的机制,由周期的定时器中断驱动。定时器中断以配置的HZ参数为频率产生,在中断中更新系统时间jiffies,摘取到期的定时器执行,更新时间轮时间。
clock source
clock source 硬件计数器的一种抽象,它为系统提供一种时间线,通过时间线,每一个动作都可以确定现在执行时的时间点。一般的clocksource是一个单调递增(monotonic)计数器。它应该尽可能的提供高精度,并且要尽可能的稳定。作为clocksource的timer不能够因为执行读取动作而出现数据错误。
对系统时间的同步操作,不会影响到clocksource,同步操作只会生成一个时间偏移,通过时间偏移量可以得到当前时间。
clock events
clockevent和clocksource是两种完全不同的机制,虽然同一个硬件timer可以同时用来做clocksource和clockevents。
clock events管理下的硬件定时器会产生中断,在时间线上某点触发event完成它的工作。
clockevents 提供一种管理定时器中断的driver api,api管理所有注册的timer。这些api只有小部分的功能跟是硬件相关的,所以kernel可以以体系结构无关的方式使用timer。
利用clockevents机制,系统可以支持高精度定时器。当高精度定时器被申请时,需要做的工作就是选择一个合适的timer来支持高精度定时器。 系统可以提供高精度的定时中断,提供高精度的内核定时器来满足高的实时需求。
周期定时器tick现在也是用clock events来实现,它的功能仍然与旧的基于定时器中断的机制相同,都是更新jiffies,计算系统时间等。
https://lwn.net/Articles/223185/
Dynamic ticks
NO_HZ(减少调度时钟ticks)
时间子系统当中NO_HZ相关的配置能够减少调度时钟中断的数量。因为系统不会频繁被调度时钟打断,这样能够提高系统的工作效率,一方面能够降低能源消耗,另一方面较低的系统抖动对有高性能计算(HPC)和实时性要求的应用会有较大影响。
主要有三种需求需要管理调度时钟中断:
- 不控制调度时钟ticks: CONFIG_HZ_PERIODIC=y或者CONFIG_NO_HZ=n 表示使用稳定的周期ticks,ticks的频率固定为HZ配置。
- 在cpu进入idle状态时,不允许触发调度时钟tick:CONFIG_NO_HZ_IDLE=y 这是最通常的做法,也是默认的做法。
- 在idle和只运行一个任务时,不允许触发调度时钟tick:CONFIG_NO_HZ_FULL=y. 除非系统需要运行实时性应用,或者确定系统正在运行高负载计算集中型的应用,系统的这个选项一般是不打开的。
下边分别解释下三种情况:
不控制调度时钟tick
早期的kernel是不控制调度时钟tick的,调度时钟中断以HZ设定的频率到来,执行调度。这种方式在某些情况下被证明仍然是一种非常有效的方式。比如,在系统负载比较重的情况下,cpu只有很少的时间处于idle状态,只是频繁的进入idle停留很短的时间。这种负载下,因为有很多正在等待运行的任务,所以及时的调度tick是必要的。这种情况下,控制调度时钟tick不会有什么效果。
这种模式需要的配置是CONFIG_HZ_PERIODIC=y
如果系统处在低负载的情况下,当cpu长时间的处在idle状态时,周期性的调度tick会增加功耗,这对电池供电的设备影响很大。
如果系统运行着实时性应用或者计算集中型应用,那么周期的调度时钟会影响系统的性能。
cpu idle状态时禁止调度时钟tick
当cpu在idle状态时,不应该向其发送调度时钟中断。调度时钟中断的作用是在有多个任务需要处理时切换cpu,一个处在idle状态的cpu没有这样的需要。
CONFIG_NO_HZ_IDLE=y配置选项使得kernel不会将调度时钟中断发送给idle状态的cpu。这种配置对电池供电和大型的虚拟化系统有很大影响。CONFIG_HZ_PERIODIC=y选项会使得电池供电设备以2倍的速度消耗电量。运行很多os的虚拟机系统中PERIODIC配置会导致cpu过多的消耗在无关的调度时钟中断中。
不过idle时动态调整tick(dyntick-idle)也是有消耗的:
- 它会增加idle loop的代码量
- 在许多架构上,动态调整tick需要在时间系统增加很多代码
所以,实时性要求高的系统最好使用PERIODIC的配置。
控制处在idle状态的cpu不接收调度时钟的方式叫做dyntick-idle 模式或者nohz 模式。
在CONFIG_NO_HZ_IDLE=y配置下,默认情况下,启动参数中nohz=参数会关闭dyntick-idle模式,设置为nohz=on会打开dyntick-idle模式。
在只有一个任务时禁止调度时钟tick
High Resolution Timers
最后
以上就是玩命唇彩为你收集整理的linux 时间子系统 二 时间系统的组成linux 时间子系统 二 时间系统的组成的全部内容,希望文章能够帮你解决linux 时间子系统 二 时间系统的组成linux 时间子系统 二 时间系统的组成所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复