一、tick简介

tick就是一个周期性的中断,周期通过 CONFIG_HZ 进行配置,一般常取值为100Hz、250Hz、1000Hz。Tick 每秒窃取CPU 100 到 1000 次,导致Icache、dcache 定期被丢弃。

低频(100 Hz)主要注重吞吐量、更少的中断、更少的 CPU 被盗、更少的缓存垃圾,而高频(1000 Hz)则更注重延迟、计时器和调度程序粒度、cputime 精度。 hrtimer 的出现降低了低频缺点对 poll(), epoll()...的使用的影响。

外受tick频率影响的还有:
Timekeeping (walltime, xtime, gettimeofday())
Jiffies: relative, internal clock
timer wheel: struct timer_list。
Posix CPU timers (itimer, timer_settime, RLIM_CPU, ...)
Cputime stats
Scheduler (local and global fairness, bandwidth, load/time accounting...)
RCU

二、Dynticks idle

在 idle 状态下周期的 tick 中断将 CPU 唤醒是对功耗有害的,在内核中通过 CONFIG_NO_HZ(旧内核版本 CONFIG_NO_HZ_IDLE) 来使能 dynamtic tick,下面函数是进入 tick idle 模式(CPU idle后不在其上产生周期tick中断)和退
出 tick idle 模式。进入 tick idle 模式后CPU可进入更深的 C-states。

void tick_nohz_idle_enter(void); //kernel/time/tick-sched.c
void tick_nohz_idle_exit(void); //kernel/time/tick-sched.c

Dynticks idle 在2007年合入到 Linux-2.6.21 版本中。

tick示意图:

idle后tick示意图:

三、Full dynticks

即使在繁忙的 CPU 上也需要停止 tick。在 Linux-3.10 中合入。目的是为了减少周期tick需要付出各种代价和要求。将tick的周期性驱动改为事件驱动(Poll driven -> Event driven)。

1. Full dynticks:Cputime accounting

配置 CONFIG_TICK_CPU_ACCOUNTING 进行使能,通过探测进行驱动的,监听 Syscall entry/exit、Exception entry/exit (traps, faults, ...)、Irqs entry/exit 来进行计数。

若配置的是 CONFIG_VIRT_CPU_ACCOUNTING_GEN(应该是与上面互斥的),相同的监听,但是计算的是jiffie时间值:

2. Full dynticks: RCU

(1) 静止状态 = CPU未使用RCU。所有CPU上报静态后宽限期结束,宽限期是一个所有 CPU 都参与的全局状态机。其中就有通过在 tick 中轮询静止状态。

(2) 扩展静止状态 = CPU不使用RCU且不对静止状态进行轮询。这是全局状态机的被动部分,无静态请求(即:不需要tick),对 dynticks 有用,Idle = 扩展静止状态,以强制节能。

(3) 用户空间RCU(未来可能会用起来),Userspace = extended quiescent(CONFIG_RCU_USER_QS),Dynticks可能存在于用户空间中。

3. Full dynticks: Timekeeping

Tickless busy CPU 可以使用 jiffies/walltime。不像dyntick idle需要timekeeping。需要1个周期性timekeeper:电源问题。现在用来自 Paul Mckenney 的很酷的新 CONFIG_NO_HZ_FULL_SYSIDLE 解决了。

4. Full dynticks: single task

如果不止一个任务运行(抢占),则需要局部公平。当 CPU 上只有单个任务时停止tick。未来:hrtick ?

5. Full dynticks: 1 Hz hack

调度程序还需要做一些工作:负载均衡、各种状态统计、负载平均等...。最多保持1Hz,直到解决。

四、实验

在tick idle状态中,CPU没有 arch_timer 中断了,但是还有其他中断产生。

参考:
Documentation/timers/NO_HZ.txt
(Nearly) full tickless operation in 3.10 – http://lwn.net/Articles/549580/
“The 2012 realtime minisummit” (LWN, CPU isolation discussion) – http://lwn.net/Articles/520704/
“NoHZ tasks” (LWN) – http://lwn.net/Articles/420544/

调度器46—tick模式的更多相关文章

  1. linux调度器源码分析 - 运行(四)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 之前的文章已经将调度器的数据结构.初始化.加入进程都进行了分析,这篇文章将主要说明调度器是如何在程序稳定运 ...

  2. 1. 企业级调度器LVS初识、工作模式详解

    想学习更多相关知识请看博主的个人博客 1. LVS官网 LVS 时全球最流程的四层负载均衡开源软件. LVS 官网:http://www.linuxvirtualserver.org/ 2.Linux ...

  3. Erlang/OTP 17.0-rc1 新引入的"脏调度器"浅析

    最近在做一些和 NIF 有关的事情,看到 OTP 团队发布的 17 rc1 引入了一个新的特性“脏调度器”,为的是解决 NIF 运行时间过长耗死调度器的问题.本文首先简单介绍脏调度器机制的用法,然后简 ...

  4. [原创]cocos2d-x研习录-第三阶 特性之调度器

    在游戏中,经常会周期执行一些检测.操作或更新一些数据等,我们称之为调度.Cocos2D-x中将调度封装为类CCScheduler,方便在游戏开发中使用.我们一起来学习一下,CCScheduler具有哪 ...

  5. Cocos2d-X3.0 刨根问底(六)----- 调度器Scheduler类源码分析

    上一章,我们分析Node类的源码,在Node类里面耦合了一个 Scheduler 类的对象,这章我们就来剖析Cocos2d-x的调度器 Scheduler 类的源码,从源码中去了解它的实现与应用方法. ...

  6. 工作流调度器azkaban(以及各种工作流调度器比对)

    1:工作流调度系统的作用: (1):一个完整的数据分析系统通常都是由大量任务单元组成:比如,shell脚本程序,java程序,mapreduce程序.hive脚本等:(2):各任务单元之间存在时间先后 ...

  7. FreeRTOS 任务与调度器(2)

    在上一篇我们介绍了FreeRTOS任务的一些基本操作和功能,今天我们会介绍一个很好很强大的功能——任务通知 任务通知可以在不同任务之间传递信息,它可以取代二值信号量.计数信号量.事件标志组.深度为1的 ...

  8. CFS调度器

    一.前言 随着内核版本的演进,其源代码的膨胀速度也在递增,这让Linux的学习曲线变得越来越陡峭了.这对初识内核的同学而言当然不是什么好事情,满腔热情很容易被当头浇灭.我有一个循序渐进的方法,那就是先 ...

  9. 【TencentOS tiny】深度源码分析(2)——调度器

    温馨提示:本文不描述与浮点相关的寄存器的内容,如需了解自行查阅(毕竟我自己也不懂) 调度器的基本概念 TencentOS tiny中提供的任务调度器是基于优先级的全抢占式调度,在系统运行过程中,当有比 ...

  10. FreeRTOS调度器

    FreeRTOS----调度器 调度器的启动流程分析 当创建完任务之后,会调用vTaskStartScheduler()函数,启动任务调度器: void vTaskStartScheduler( vo ...

随机推荐

  1. Apache Hudi 流转批 场景实践

    背景 在某些业务场景下,我们需要一个标志来衡量hudi数据写入的进度,比如:Flink 实时向 Hudi 表写入数据,然后使用这个 Hudi 表来支持批量计算并通过一个 flag 来评估它的分区数据是 ...

  2. 解决ssh连接远程主机出现“REMOTE HOST IDENTIFICATION HAS CHANGED”问题

    Win通过ssh连接远程主机 命令提示符方式 ssh username@ip 此后输入你的密码 通过VSCode Remote-SSH 在VSCode拓展中搜索"Remote-SSH&quo ...

  3. Quill编辑器实现原理初探

    简介 从事前端开发的同学,对富文本编辑器都不是很陌生.但是大多数富文本编辑器都是开箱即用,很少会对其实现原理进行深入的探讨.假如静下心去细细品味,会发现想要做好一款富文本编辑器,需要对整个前端生态有较 ...

  4. vue3中inject无法获取provide传递的最新的值

    // 爷组件  import { defineComponent, reactive, toRefs, onMounted, provide ,computed} from 'vue';  const ...

  5. 简述traceroute命令的原理

    原理 traceroute命令是一种用于显示数据包从源主机到目的主机经过的路由器和网络设备的路径的工具.traceroute命令的原理是利用IP数据报的生存时间(TTL)字段和因特网控制报文协议(IC ...

  6. vue 从后往前循环数组的简洁写法

  7. VUE学习-自定义修饰符

    自定义修饰符 组件 const myComponent = { template: `<input type="text" :value="modelValue&q ...

  8. vue项目去掉网页滚动条

    点击查看代码 <template> <div id="app"> <router-view /> </div> </templ ...

  9. 【个人笔记】从本地源部署 Office 2016 专业增强版

    ## 0. 大大的说明 本文使用的 Office 2016 为 Office 2016 专业增强版零售版. 零售版需要使用 Office 部署工具才可以自定义安装组件,而 VOL 版本无需部署工具即可 ...

  10. LWC-002_Composition

    Composition (lwc.dev) Set a Property on a Child Component # Send an Event from a Child to an Owner   ...