Linux时间子系统之一:认识timer_list和timer_stats和使用
内核版本:v3.4.xxx
一、前言
内核提供了方便查看当前系统TickDevice、活动的Timer列表以及Timer使用的统计信息。
内核分别用两个节点来表示TimerList和Timer统计信息。
一个是/proc/timer_list,打印per_cpu的hrtimer_bases信息以及基于此的timer列表,包括三种时钟MONOTONIC/REALTIME/BOOTTIME;以及Broadcast Tick Device和Per CPU Tick Device信息。
另一个是/proc/timer_stats,需要echo 1 > /proc/timer_stats打开,echo 0 /proc/timer_stats关闭。cat /proc/timer_stats可以获取统计信息。
二、背景介绍
Per CPU TickDevice是维护当前CPU Tick和hrtimer的基础,只有工作在OneShot模式下才能实现hrtimer。在CPU进入cpuidle后,Per CPU TickDevice可能会被关闭,这时候可以打开Broadcast Tick作为唤醒源。超时后,就会将系统从cpuidle退出,进入正常工作模式打开Per CPU TickDevice。
hrtimer有三种时钟基准,这三种时钟基准对应不同的时间获取函数,但主要是基于TimeKeeping的统计。
三、认识timer_list
kernel/time/timer_list.c中init_timer_list_procfs创建/proc/timer_list节点。
|
static int timer_list_show(struct seq_file *m, void *v) SEQ_printf(m, "Timer List Version: v0.6\n");------------------------------------------------------------------(1) for_each_online_cpu(cpu)----------------------------------------------------------------------------------------(2) SEQ_printf(m, "\n"); return 0; |
(1)打印概况信息,hrtimer基准时钟个数和系统MONOTONIC时间。
(2)这里是per_cpu信息,按照hrtimer_cpu_base->hrtimer_clock_base->hrtimer层级关系打印。
(3)打印Broadcast TickDevice和per_cpu的TickDevice设备信息。
下面根据一个示例来分析:
|
Timer List Version: v0.6 cpu: 0-----------------------print_cpuCPU0的信息如下,从clock0到clock2 --依次是:序列号、hrtimer、timer状态、hrtimer超时函数、进程名/进程号 --超时绝对时间和相对时间。 -------------------------------------------------------------------hrtimer_cpu_base部分,参照结构体解释---------------------------------------------------------------------- ---------------------------------------------------------------------tick_sched部分,参照结构体解释----------------------------------------------------------------------------- Tick Device: mode: 1-----------------------Broadcast TickDevice Tick Device: mode: 1---------------------per_cpu TickDevice,详细信息参照clock_event_device结构体解释。 |
四、认识timer_stats
kernel/time/timer_stats.c中init_tstas_procfs创建了/proc/timer_stats节点。统计细心
在每次hrtimer超时函数中都会进行统计,必须打开CONFIG_TIMER_STATS才有效。
| __hrtimer_start_range_ns-->raise_softirq_irqoff-->HRTIMER_SOFTIRQ-->run_hrtimer_softirq-->hrtimer_interrupt-->__run_hrtimer-->timer_stats_account_hrtimer |
timer_stats_account_hrtimer是执行统计信息的主体,这里面有一个timer_stats_active开关。是通过echo [0|1] > /proc/timer_stats进行开关。
|
void timer_stats_update_stats(void *timer, pid_t pid, void *startf, if (likely(!timer_stats_active))----------------------------------------是否打开开关 lock = &per_cpu(tstats_lookup_lock, raw_smp_processor_id()); input.timer = timer;---------------------------------------------------填充entry结构体 raw_spin_lock_irqsave(lock, flags); entry = tstat_lookup(&input, comm);-------------------------------在tstat_hash_table中查找input,找到count递增;没找到新增一个entry插入hash表。 out_unlock: |
显示的地方在tstats_show,所有的统计信息存放在static struct entry entries[MAX_ENTRIES]结构体数组中,当前entry数目通过nr_entries来记录。
|
static int tstats_show(struct seq_file *m, void *v) mutex_lock(&show_mutex); time = ktime_sub(time_stop, time_start); period = ktime_to_timespec(time); seq_puts(m, "Timer Stats Version: v0.2\n"); for (i = 0; i < nr_entries; i++) {----------------------遍历entries数组,数组内容在每次hrtimer中断处理中进行更新。 print_name_offset(m, (unsigned long)entry->start_func); events += entry->count; ms += period.tv_sec * 1000; if (events && period.tv_sec) mutex_unlock(&show_mutex); return 0; |
一个实例分析:
|
Timer Stats Version: v0.2 --依次是:timer count、进程号、进程名称、超时函数、启动timer函数 |
五、使用
1.通过timer_stats可以知道系统的timer使用程度,一定程度上反映了进程的活跃状态。
2.timer_list可以知道系统TickDevice相关设备信息。
3.还可以知道timer状态,以及即将发生的Timer。
4.系统相关信息尤其是tick_sched(系统调度jiffies、idle、iowait等)和hrtimer_cpu_base(retries、hang)部分。
Linux时间子系统之一:认识timer_list和timer_stats和使用的更多相关文章
- Linux时间子系统专题汇总
关于Linux时间子系统有两个系列文章讲的非常好,分别是WowoTech和DroidPhone. 还有两本书分别是介绍: Linux用户空间时间子系统<Linux/UNIX系统编程手册>的 ...
- Linux时间子系统之(二):软件架构
专题文档汇总目录 Notes:从框架上讲解了时间子系统,从底向上包括CPU Local TImer.Global Counter.Clock Souce/Clock Events模块管理.Tick D ...
- Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现
转自:http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理.而随着内核的不断演进,大牛们已 ...
- Linux时间子系统之五:低分辨率定时器的原理和实现
专题文档汇总目录 Notes:低精度timer在内核中的数据结构以及API接口:低精度timer精巧高效的分组,使用cascade进行定时器移位,组内Timer FIFO:低精度Timer的初始化流程 ...
- Linux时间子系统之(一):时间的基本概念
专题文档汇总目录 Notes:Linux时间基准点:Linux时间和broken-down time(struct tm):不同精度的时间表示time_t.timeval.timespec. 原文地址 ...
- Linux时间子系统之(三):用户空间接口函数
专题文档汇总目录 Notes:用户空间时间相关接口函数: 类型 API 精度 说明 时间 time stime time_t 精度为秒级 逐渐要被淘汰.需要定义__ARCH_WANT_SYS_TIME ...
- Linux时间子系统之(四):timekeeping
专题文档汇总目录 Notes:timekeeping模块的狠心数据结构是timekeeper,它维护了系统不同类型时钟的时间值,并且介绍了获取不同类型时钟时间的函数. clocksource切换通过c ...
- Linux时间子系统之(五):POSIX Clock
专题文档汇总目录 Notes: 本章主要介绍了若干种类的静态时钟,这些时钟都可以通过k_clock表示,注册到posix_clocks中.这些都是静态时钟,可以分为三大类:各种REALTIME时钟.带 ...
- Linux时间子系统之(六):POSIX timer
专题文档汇总目录 Notes:首先讲解了POSIX timer的标识(唯一识别).POSIX Timer的组织(管理POSIX Timer).内核中如何抽象POSIX Timer:然后分析了POSIX ...
- Linux时间子系统之(十二):periodic tick
专题文档汇总目录 Notes:TickDevice模式,以及clocckevent设备.TickDevice设备的初始化,TickDevice是如何加入到系统中的.周期性Tick的产生. 原文地址:L ...
随机推荐
- Java-GenricServlet
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable { priva ...
- 第十一章 图像之2D(2)
Android游戏开发群:290051794 Libgdx游戏开发框架交流群:261954621 作者:宋志辉 出处:http://blog.csdn.net/song19891121 本文版权归作 ...
- Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!
Android群英传笔记--摘要,概述,新的出发点,温故而知新,可以为师矣! 当工作的越久,就越感到力不从心了,基础和理解才是最重要的,所以买了两本书,医生的<Android群英传>和主席 ...
- Github 错误合集:Failed connect to github.com:8080 || Failed connect to github.com:443; No error
文/skay 地址:http://blog.csdn.net/sk719887916/article/details/40541199 开发中遇到github无法pull和push代码问题,原来git ...
- 第一个Polymer应用 - (4)收尾工作
原文链接: Step 4: Finishing touches翻译日期: 2014年7月8日翻译人员: 铁锚在本节中,会在卡片上添加收藏按钮,并可以通过切换选项卡(tabs)连接到不同的 <po ...
- hadoop 测试框架
hadoop 0.21以前的版本中(这里拿0.20为例,其他版本可能有少许不同),所有的测试相关代码都是放置在${HADOOP_HOME}/src/test下,在该目录下,是按照不同的目录来区分针对不 ...
- 关于ruby gem无法连接到rubygems.org的解决方案
RubyGems 镜像 - 淘宝网 为什么有这个? 由于国内网络原因(你懂的),导致 rubygems.org 存放在 Amazon S3 上面的资源文件间歇性连接失败.所以你会与遇到 gem ins ...
- MySQL 表名区分大小写设置
1.关闭MySQL服务: 控制面板主页-管理工具-服务-MySQL服务 2.在服务器运行目录找到my.ini 或者my.cnf文件: 在[mysqld]下面增加一行添加 :lower_ ...
- Jquery Easing函数库
从jQuery API 文档中可以知道,jQuery自定义动画的函数.animate( properties [, duration] [, easing] [, complete] )有四个参数: ...
- 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework
前言 一直以来写的博文都是比较温婉型的博文,今天这篇博文算是一篇批判性博文,有问题欢迎探讨,如标题,你到底会不会用EntityFramework啊. 你到底会不会用EntityFramework啊 面 ...