一、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. ctf命令执行刷题

    web29 error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i" ...

  2. trollcave-v1-2

    trollcave-v1-2 目录 trollcave-v1-2 1 信息收集 1.1 端口扫描 1.2 后台目录扫描 1.3 收集网站相关信息 1.3.1 收集网站用户名与角色信息 1.3.2 收集 ...

  3. Postgres的count统计误区

    数据库统计数据量时常常用的是count(1)或者count(*),这两者区别不大,在postgres里面统计数据总量时,要注意count(column_name)与count(*)的区别,有些场景下会 ...

  4. Xilinx XPM使用说明--XPM_MEMORY_SDPRAM

    XPM_MEMORY_SDPRAM 参数化宏:简单的双端口RAM 介绍 此宏用于实例化简单双端口RAM.端口A用于从存储器执行写入操作,端口B可用于从存储器读取. 下面介绍XPM_MEMORY实例的基 ...

  5. gcc 内联汇编简介

    啊 啊 在内联汇编中,标识寄存器的一个%变成了两个% 啊 如图是内联汇编的模板 assembler template 是汇编代码 output operands TODO input operands ...

  6. WPF标题栏自定义

    1.废话不多说直接上代码 <Window.Resources> <Style x:Key="btnTitleMaxMin" TargetType="Bu ...

  7. Python 常用小例子

    作者原文 https://mp.weixin.qq.com/s/eFYDW20YPynjsW_jcp-QWw 内置函数(63个) 1 abs() 绝对值或复数的模 In [1]: abs(-6) Ou ...

  8. K8存储之ConfigMap、Secret

    ConfigMap ConfigMap是一种API对象,用来将非加密数据保存到键值对中.可以用作环境变量.命令行参数或者存储卷中的配置文件. ConfigMap供容器使用的典型用法如下: 生成为容器内 ...

  9. Kubernetes v1.22 编译 kubeadm 修改证书有效期到 100 年

    此方法支持以下 kubeadm版本 v1.22到v1.25 kubeadm 默认证书为一年,一年过期后,会导致 api service 不可用,使用过程中会出现:x509: certificate h ...

  10. Mysql数据库基础第四章DDL(数据定义语言):库表的管理、数据类型与约束条件

    Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...