//现象 ①top命令无法输出查询结果 ②系统crow定时器任务没有执行 ③高精度定时器打印了负值(now值正确,只是所有定时器的硬超时时间未刷新)
https://blog.csdn.net/cc289123557/article/details/53870460
https://www.cnblogs.com/sky-heaven/p/5404620.html
深入理解Linux内核之主调度器(上)_Linux内核远航者的博客-CSDN博客
疑问:
2.(会不会是时钟源的精度变得很差的了原因?)当有新的clocksource被注册时,除了会挂在全局链表clocksource_list外,还会同时挂在一个watchdog链表上:watchdog_list。定时器周期性地(0.5秒)检查watchdog_list上的clocksource,WATCHDOG_THRESHOLD的值定义为0.0625秒,如果在0.5秒内,clocksource的偏差大于这个值就表示这个clocksource是不稳定的,定时器的回调函数通过clocksource_watchdog_kthread线程标记该clocksource,并把它的rate修改为0,表示精度极差
3.时钟被切换到高精度模式之后,还会被切换到低精度时钟模式???
4.高精度时钟没有被删除,是因为系统卡住了??
//ktime_get 实际获取CLOCK_MONOTONIC时间,不统计设备休眠时间;ktime_get_real相对UTC;
//jiffies是内核的低精度定时器的计时单位,所以内核配置的HZ数决定了低精度定时器的精度,如果HZ数被设定为1000,那么,低精度定时器(timer_list)的精度就是1ms=1/1000秒
//posix timer:若干种类的静态时钟。这些时钟都可以通过k_clock表示,注册到posix_clocks中。这些都是静态时钟,可以分为三大类:各种REALTIME时钟、带_ALARM唤醒功能的时钟以及进程线程相关时钟
时钟时间(墙上时钟时间wall clock time):从进程从开始运行到结束,时钟走过的时间,这其中包含了进程在阻塞和等待状态的时间。 用户CPU时间:就是用户的进程获得了CPU资源以后,在用户态执行的时间。 系统CPU时间:用户进程获得了CPU资源以后,在内核态的执行时间。
进程的三种状态为阻塞、就绪、运行。 时钟时间 = 阻塞时间 + 就绪时间 +运行时间
用户CPU时间 = 运行状态下用户空间的时间
系统CPU时间 = 运行状态下系统空间的时间。
用户CPU时间+系统CPU时间=运行时间。
ktime_get获取的时间是不统计设备休眠时间的
ktime_get_boottime获取的时间和ktime_get最大的不同是其包含了设备进入休眠的时间
ktime_get_real获取的时间的起点不是设备的启动时间点了,而是相对UTC的
1、文件汇整linux kernel 时间子系统的源文件:
文件名 | 描述 |
time.c timeconv.c |
time.c文件是一个向用户空间提供时间接口的模块。具体包括:time, stime, gettimeofday, settimeofday,adjtimex。除此之外,该文件还提供一些时间格式转换的接口函数(其他内核模块使用),例如jiffes和微秒之间的转换,日历时间(Gregorian date)和xtime时间的转换。xtime的时间格式就是到linux epoch的秒以及纳秒值。 timeconv.c中包含了从calendar time到broken-down time之间的转换函数接口。 |
timer.c |
传统的低精度timer模块,基本tick的。 alarm系统调用,以及低精度timer API |
timer_list.c timer_stats.c |
向用户空间提供的调试接口。在用户空间,可以通过/proc/timer_list接口可以获得内核中的时间子系统的相关信息。例如:系统中的当前正在使用的clock source设备、clock event设备和tick device的信息。通过/proc/timer_stats可以获取timer的统计信息。 |
hrtimer.c | 高精度timer模块(高精度timer的通用框架,提供给itimer/POSIX timers/nanosleep/kernel内定时) |
itimer.c | interval timer模块(setitimer和getitimer两个系统调用) |
posix-timers.c posix-cpu-timers.c posix-clock.c |
POSIX timer模块和POSIX clock模块 posix-timers.c系统调用: timer_create/timer_gettime/timer_getoverrun/timer_settime/timer_delete (CLOCK_REALTIME/CLOCK_MONOTONIC/CLOCK_MONOTONIC_RAW/CLOCK_REALTIME_COARSE/CLOCK_MONOTONIC_COARSE/CLOCK_BOOTTIME) clock_settime/clock_gettime/clock_adjtime/clock_getres clock_nanosleep posix-cpu-timers.c(CLOCK_PROCESS_CPUTIME_ID/CLOCK_THREAD_CPUTIME_ID) |
alarmtimer.c | alarmtimer模块(也属于POSIX timer模块,CLOCK_REALTIME_ALARM/CLOCK_BOOTTIME_ALARM) |
clocksource.c jiffies.c |
clocksource.c是通用clocksource driver。其实也可以把system tick也看成一个特定的clocksource,其代码在jiffies.c文件中 clocksource.c clocksource的注册,以及suspend/resum管理。和clocksource sysfs相关节点,/sys/devices/system/clocksource/clocksource0。 jiffies.c注册一个clocksource_jiffies作为clocksource。 |
timekeeping.c timekeeping_debug.c |
timekeeping模块 主要维护timekeeper变量 |
ntp.c | NTP模块 |
clockevent.c |
clockevent模块 管理clockevent设备,注册、模式设置等。 |
tick-common.c tick-oneshot.c tick-sched.c |
这三个文件属于tick device layer。 tick-common.c文件是periodic tick模块,用于管理周期性tick事件。 tick-oneshot.c文件是for高精度timer的,用于管理高精度tick时间。 tick-sched.c是用于dynamic tick的。 |
tick-broadcast.c tick-broadcast-hrtimer.c |
broadcast tick模块。 broadcast tick用于进入cpudile之后唤醒cpu。 |
sched_clock.c | 通用sched clock模块。这个模块主要是提供一个sched_clock的接口函数,调用该函数可以获取当前时间点到系统启动之间的纳秒值。 底层的HW counter其实是千差万别的,有些平台可以提供64-bit的HW counter,因此,在那样的平台中,我们可以不使用这个通用sched clock模块(不配置CONFIG_GENERIC_SCHED_CLOCK这个内核选项),而在自己的clock source chip driver中直接提供sched_clock接口。 使用通用sched clock模块的好处是:该模块扩展了64-bit的counter,即使底层的HW counter比特数目不足(有些平台HW counter只有32个bit)。 |
每个cpu上定义了一个hrtimer_cpu_base的全局变量,用于管理属于自己的hrtimer
<include/linux/hrtimer.h> struct hrtimer_cpu_base { /* hrtimer_cpu_base每个cpu只有一个,存在并发访问,lock是用来保护该结构体的自旋锁 */ raw_spinlock_t lock; /* 所属的cpu编号 */ unsigned int cpu; /* 表示clock_base数组中哪些时钟基准下的红黑树中存在hrtimer */ unsigned int active_bases; unsigned int clock_was_set_seq; /* 标识是否处在高精度模式下 */ unsigned int hres_active : 1, /* 标识是否正在执行hrtimer_interrupt回调函数 */ in_hrtirq : 1, /* 标识是否上一次执行hrtimer_interrupt出现了错误 */ hang_detected : 1, /* 标识是否正在执行软中断处理程序hrtimer_run_softirq */ softirq_activated : 1; #ifdef CONFIG_HIGH_RES_TIMERS /* 标识一共执行了多少次hrtimer_interrupt回调函数 */ unsigned int nr_events; /* 标识在执行hrtimer_interrupt时对定时事件设备编程错误后重试的次数 */ unsigned short nr_retries; /* 标识在执行hrtimer_interrupt时发生错误的次数 */ unsigned short nr_hangs; /* 出现错误后,在hrtimer_interrupt中停留的最长时间 */ unsigned int max_hang_time; #endif #ifdef CONFIG_PREEMPT_RT spinlock_t softirq_expiry_lock; atomic_t timer_waiters; #endif /* 该CPU上即将到期hrtimer的到期时间,包括硬hrtimer和软hrtimer */ ktime_t expires_next; /* 该CPU上即将到期的hrtimer,包括硬hrtimer和软hrtimer */ struct hrtimer *next_timer; /* 该CPU上即将到期的软hrtimer的到期时间 */ ktime_t softirq_expires_next; /* 该CPU上即将到期的软hrtimer */ struct hrtimer *softirq_next_timer; /* hrtimer的到期时间可以基于不同的时钟类型,每个类型都对应一个hrtimer_clock_base结构体 */ struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES]; } ____cacheline_aligned;
//不同精度的时间表示Notes:
//hrtimer_start()在当前cpu上使能一个hrtimer,它调用__hrtimer_start_range_ns()完成这个任务
//clock source用于为linux内核提供一个时间基线,如果你用linux的date命令获取当前时间,内核会读取当前的clock source
//Linux时间子系统之一:认识timer_list和timer_stats和使用 - ArnoldLu - 博客园 (cnblogs.com) //timer_list的详细备注
Linux时间子系统专题汇总 - ArnoldLu - 博客园 (cnblogs.com) now ((34条消息) Linux时间子系统之八:动态时钟框架(CONFIG_NO_HZ、tickless)_DroidPhone的博客-CSDN博客)
一文入门linux内核高精度定时器hrtimer机制 - 知乎 (zhihu.com)
https://blog.csdn.net/m0_74282605/article/details/127936139 (timer浅析)
https://blog.csdn.net/lxl584685501/article/details/46529847 !POSIX.timer可扩展定时器
https://blog.csdn.net/tyyj90/article/details/126129306 (nanosleep函数调用)
https://blog.csdn.net/liebao_han/article/details/119335630 (sleep 1 用户态睡眠,strace打印函数调用)
(32条消息) 深入理解Linux内核之进程睡眠(下)_hrtimer_nanosleep_Linux内核远航者的博客-CSDN博客
Linux时间子系统之(十五):clocksource (wowotech.net)
//timerfd 会引起程序的阻塞问题和极度占用cpu问题
(34条消息) Linux定时函数timerfd的使用问题以及解决办法_爱就是恒久忍耐的博客-CSDN博客
// https://blog.csdn.net/u014787262/article/details/123888538 (获取系统时间的调用 demo)
//Linux内核高精度定时器hrtimer的使用_Kunaly的博客-CSDN博客
如果定时器无需指定一个到期范围,可以在设定回调函数后直接使用hrtimer_start激活该定时器: int hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode); 如果需要指定到期范围,则可以使用hrtimer_start_range_ns激活定时器: hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, unsigned long range_ns, const enum hrtimer_mode mode); 要取消一个hrtimer,使用hrtimer_cancel: int hrtimer_cancel(struct hrtimer *timer); 以下两个函数用于推后定时器的到期时间: extern u64 hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval); /* Forward a hrtimer so it expires after the hrtimer's current now */ static inline u64 hrtimer_forward_now(struct hrtimer *timer, ktime_t interval) { return hrtimer_forward(timer, timer->base->get_time(), interval); }
clocksource,clock_event_device,它们有何区别?看名字,好像都是给系统提供时钟的设备,实际上,clocksource不能被编程,没有产生事件的能力,它主要被用于timekeeper来实现对真实时间进行精确的统计,而clock_event_device则是可编程的,它可以工作在周期触发或单次触发模式,系统可以对它进行编程,以确定下一次事件触发的时间,clock_event_device主要用于实现普通定时器和高精度定时器,同时也用于产生tick事件,供给进程调度子系统使用;
hrtimer系统需要通过timekeeper获取当前的时间,计算与到期时间的差值,并根据该差值,设定该cpu的tick_device(clock_event_device)的下一次的到期时间,时间一到,在clock_event_device的事件回调函数中处理到期的hrtimer;
一旦开启了hrtimer,tick_device所关联的clock_event_device的事件回调函数会被修改为:hrtimer_interrupt,并且会被设置成工作于CLOCK_EVT_MODE_ONESHOT单触发模式;
//hrtimer_nanosleep的函数调用 https://blog.csdn.net/SunnyBeiKe/article/details/7022330
//在高精度模式下的高精度定时器:在do_nanosleep中,请求睡眠的进程会主动schedule(),主动让出CPU
hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,const enum hrtimer_mode mode, const clockid_t clockid)//rqtp要暂停的时间,rmtp距下次唤醒的时间
if (rt_task(current)) //如果当前进程是rt任务,那么时间松弛度是0
hrtimer_init_on_stack
__hrtimer_init
__hrtimer_init_sleeper
__hrtimer_init
sl->timer.function = hrtimer_wakeup//核心为设置超时回调函数
hrtimer_set_expires_range_ns//设置到hrtimer的期时间
do_nanosleep
hrtimer_sleeper_start_expires
hrtimer_start_range_ns
__hrtimer_start_range_ns
remove_hrtimer
hrtimer_reprogram
tick_program_event
clockevents_program_event
clockevent_state_shutdown
//中断
hrtimer_interrupt
__hrtimer_run_queues
__run_hrtimer
//在低精度模式下的高精度定时器
update_process_times
run_local_timers
hrtimer_run_queues
raise_softirq(TIMER_SOFTIRQ)
//!!! https://www.cnblogs.com/kylinos/p/9378781.html
3.4 定时器的处理
高精度定时器系统有3个入口可以对到期的定时器进行处理,分别是
1 没有切换到高精度模式时,在每个jiffies的tick事件中断中进行查询和处理。
2 在HRTIMER_SOFTIRQ软中断中进行查询和处理。
3 切换到高精度模式以后,在每个clock_event_device的到期事件的中断中进行查询和处理。
// !!! https://rootw.github.io/2018/02/%E9%AB%98%E7%B2%BE%E5%BA%A6%E5%AE%9A%E6%97%B6%E5%99%A8/
如果当前定时器是红黑树中最早到期的定时器,则重新设置clock event device的oneshot计数。注,高精度定时器正常工作时,会将clock event device的工作模式切换到oneshot
/内核正常启动后首先工作在低精度模式,然而在时钟中断的处理中,内核会检测是否具备切换到高精度的条件,如果各条件均满足,则切换到高精度模式工作。时钟中断中在处理低精度时钟时,通过hrtimer_run_pending()完成切换动作;
linux/kernel/timer.c:
static void run_timer_softirq(struct softirq_action *h)
{
struct tvec_base *base = __this_cpu_read(tvec_bases);
hrtimer_run_pending();
if (time_after_eq(jiffies, base->timer_jiffies))
__run_timers(base);
}
void hrtimer_run_pending(void)
{
if (hrtimer_hres_active()) /*如果已经切换到高精度模式则返回*/
return;
if (tick_check_oneshot_change(!hrtimer_is_hres_enabled())) /*判断是否具备切换到高精度的条件,如时钟源精度是否满足、是否支持oneshot模式*/
hrtimer_switch_to_hres();
}
// .iowait_sleeptime: 311053240339 nsecs
cat /proc/timer_list
Timer List Version: v0.8 HRTIMER_MAX_CLOCK_BASES: 8 now at 322301767847547 nsecs cpu: 0 clock 0: .base: ffff0022fe0ada00 .index: 0 .resolution: 1 nsecs .get_time: ktime_get .offset: 0 nsecs active timers: #0: <ffff0022fe0adfb8>, tick_sched_timer, S:01 # expires at 322301772000000-322301772000000 nsecs [in 4152453 to 4152453 nsecs] #1: <ffff800011723de0>, hrtimer_wakeup, S:01 # expires at 322302140380482-322302140380482 nsecs [in 372532935 to 372532935 nsecs] clock 1: .base: ffff0022fe0ada40 .index: 1 .resolution: 1 nsecs .get_time: ktime_get_real .offset: 1685177986378387320 nsecs active timers: clock 2: .base: ffff0022fe0ada80 .index: 2 .resolution: 1 nsecs .get_time: ktime_get_boottime .offset: 0 nsecs active timers: clock 3: .base: ffff0022fe0adac0 .index: 3 .resolution: 1 nsecs .get_time: ktime_get_clocktai .offset: 1685177986378387320 nsecs active timers: clock 4: .base: ffff0022fe0adb00 .index: 4 .resolution: 1 nsecs .get_time: ktime_get .offset: 0 nsecs active timers: #0: <ffff0022208bca00>, timerfd_tmrproc, S:01 # expires at 1-1 nsecs [in -322301767847546 to -322301767847546 nsecs] #1: <ffff002235f9c200>, timerfd_tmrproc, S:01 # expires at 1-1 nsecs [in -322301767847546 to -322301767847546 nsecs] #2: <ffff800013b13de0>, hrtimer_wakeup, S:01 # expires at 220466884532380-220466884582380 nsecs [in -101834883315167 to -101834883265167 nsecs] #3: <ffff002222b3a1c8>, posix_timer_fn, S:01 # expires at 220466890225659-220466890225659 nsecs [in -101834877621888 to -101834877621888 nsecs] #4: <ffff800010923de0>, hrtimer_wakeup, S:01 # expires at 220466892556423-220466892606423 nsecs [in -101834875291124 to -101834875241124 nsecs] #5: <ffff8000109e3de0>, hrtimer_wakeup, S:01 # expires at 220466892563463-220466892613463 nsecs [in -101834875284084 to -101834875234084 nsecs] #6: <ffff8000109f3de0>, hrtimer_wakeup, S:01 # expires at 220466892574783-220466892624783 nsecs [in -101834875272764 to -101834875222764 nsecs] #7: <ffff002222b3a0a0>, posix_timer_fn, S:01 # expires at 220466903630313-220466903630313 nsecs [in -101834864217234 to -101834864217234 nsecs] #8: <ffff8000109d3de0>, hrtimer_wakeup, S:01 # expires at 220466952474123-220466952524123 nsecs [in -101834815373424 to -101834815323424 nsecs] #9: <ffff00221dff1200>, timerfd_tmrproc, S:01 # expires at 220467359803519-220467359803519 nsecs [in -101834408044028 to -101834408044028 nsecs] #10: <ffff00221d77f158>, pm_suspend_timer_fn, S:01 # expires at 220466815840916-220467565840916 nsecs [in -101834952006631 to -101834202006631 nsecs] #11: <ffff80001b8cbde0>, hrtimer_wakeup, S:01 # expires at 220467630780407-220467630830407 nsecs [in -101834137067140 to -101834137017140 nsecs] #12: <ffff80001175bde0>, hrtimer_wakeup, S:01 # expires at 220467739681469-220467739731469 nsecs [in -101834028166078 to -101834028116078 nsecs] #13: <ffff800012feb990>, hrtimer_wakeup, S:01 # expires at 220468035546920-220468040508918 nsecs [in -101833732300627 to -101833727338629 nsecs] #14: <ffff80001b833de0>, hrtimer_wakeup, S:01 # expires at 220468757677913-220468757727913 nsecs [in -101833010169634 to -101833010119634 nsecs] #15: <ffff80001b7e3de0>, hrtimer_wakeup, S:01 # expires at 220469215250557-220469215300557 nsecs [in -101832552596990 to -101832552546990 nsecs] #16: <ffff80001b77bde0>, hrtimer_wakeup, S:01 # expires at 220469523336301-220469523386301 nsecs [in -101832244511246 to -101832244461246 nsecs] #17: <ffff80001a273de0>, hrtimer_wakeup, S:01 # expires at 220470874780304-220470874830304 nsecs [in -101830893067243 to -101830893017243 nsecs] #18: <ffff80001b89bde0>, hrtimer_wakeup, S:01 # expires at 220476456284356-220476456334356 nsecs [in -101825311563191 to -101825311513191 nsecs] #19: <ffff800013f5b860>, hrtimer_wakeup, S:01 # expires at 220476612625718-220476642625717 nsecs [in -101825155221829 to -101825125221830 nsecs] #20: <ffff00221ce7a1f8>, it_real_fn, S:01 # expires at 220487491100124-220487491100124 nsecs [in -101814276747423 to -101814276747423 nsecs] #21: <ffff00221cc58200>, watchdog_timer_expired, S:01 # expires at 220509328025290-220509328025290 nsecs [in -101792439822257 to -101792439822257 nsecs] #22: <ffff800010913de0>, hrtimer_wakeup, S:01 # expires at 220514692687320-220514692737320 nsecs [in -101787075160227 to -101787075110227 nsecs] #23: <ffff00222510ae00>, timerfd_tmrproc, S:01 # expires at 220532488772000-220532488772000 nsecs [in -101769279075547 to -101769279075547 nsecs] #24: <ffff80001d0d3ca0>, hrtimer_wakeup, S:01 # expires at 220555745411289-220555745411289 nsecs [in -101746022436258 to -101746022436258 nsecs] #25: <ffff80001e5d3ca0>, hrtimer_wakeup, S:01 # expires at 220615840174755-220615840174755 nsecs [in -101685927672792 to -101685927672792 nsecs] #26: <ffff0022219a4cb8>, it_real_fn, S:01 # expires at 220763033380345-220763033380345 nsecs [in -101538734467202 to -101538734467202 nsecs] #27: <ffff0022219a21f8>, it_real_fn, S:01 # expires at 220765723875125-220765723875125 nsecs [in -101536043972422 to -101536043972422 nsecs] #28: <ffff800016e9bca0>, hrtimer_wakeup, S:01 # expires at 221460960318094-221460960318094 nsecs [in -100840807529453 to -100840807529453 nsecs] #29: sched_clock_timer, sched_clock_poll, S:01 # expires at 224300380066253-224300380066253 nsecs [in -98001387781294 to -98001387781294 nsecs] #30: <ffff800012f03860>, hrtimer_wakeup, S:01 # expires at 231234748781645-231234778781644 nsecs [in -91067019065902 to -91066989065903 nsecs] #31: <ffff8000109cbb50>, hrtimer_wakeup, S:01 # expires at 231236697432844-231236697432844 nsecs [in -91065070414703 to -91065070414703 nsecs] #32: <ffff800010933860>, hrtimer_wakeup, S:01 # expires at 238417384761269-238417387271610 nsecs [in -83884383086278 to -83884380575937 nsecs] #33: <ffff0021572eccb8>, it_real_fn, S:01 # expires at 238534874394949-238534874394949 nsecs [in -83766893452598 to -83766893452598 nsecs] #34: <ffff002238341400>, timerfd_tmrproc, S:01 # expires at 254612488772000-254612488772000 nsecs [in -67689279075547 to -67689279075547 nsecs] #35: <ffff800012093b50>, hrtimer_wakeup, S:01 # expires at 291740851490277-291740851490277 nsecs [in -30560916357270 to -30560916357270 nsecs] #36: <ffff800010a0b860>, hrtimer_wakeup, S:01 # expires at 319065756668646-319065781668583 nsecs [in -3236011178901 to -3235986178964 nsecs] #37: <ffff800010a23860>, hrtimer_wakeup, S:01 # expires at 319070136904335-319070138667818 nsecs [in -3231630943212 to -3231629179729 nsecs] #38: <ffff0022229839b8>, it_real_fn, S:01 # expires at 319188373396295-319188373396295 nsecs [in -3113394451252 to -3113394451252 nsecs] #39: <ffff80001339b990>, hrtimer_wakeup, S:01 # expires at 319203694796810-319203697018809 nsecs [in -3098073050737 to -3098070828738 nsecs] #40: <ffff800010c4b860>, hrtimer_wakeup, S:01 # expires at 319204188674498-319204213674435 nsecs [in -3097579173049 to -3097554173112 nsecs] #41: <ffff8000112fb860>, hrtimer_wakeup, S:01 # expires at 319204956670962-319204981670894 nsecs [in -3096811176585 to -3096786176653 nsecs] #42: <ffff800011433860>, hrtimer_wakeup, S:01 # expires at 319205448642459-319205473642385 nsecs [in -3096319205088 to -3096294205162 nsecs] #43: <ffff8000114cb860>, hrtimer_wakeup, S:01 # expires at 319205652654571-319205677654507 nsecs [in -3096115192976 to -3096090193040 nsecs] #44: <ffff8000114f3860>, hrtimer_wakeup, S:01 # expires at 319206468684859-319206493684796 nsecs [in -3095299162688 to -3095274162751 nsecs] #45: <ffff002156b61878>, it_real_fn, S:01 # expires at 321400752699832-321400752699832 nsecs [in -901015147715 to -901015147715 nsecs] #46: <ffff0022208bf000>, timerfd_tmrproc, S:01 # expires at 322052488772000-322052488772000 nsecs [in -249279075547 to -249279075547 nsecs] #47: <ffff002239465000>, timerfd_tmrproc, S:01 # expires at 322052488772000-322052488772000 nsecs [in -249279075547 to -249279075547 nsecs] #48: <ffff00211eed2e00>, timerfd_tmrproc, S:01 # expires at 322052488772000-322052488772000 nsecs [in -249279075547 to -249279075547 nsecs] #49: <ffff002235f9e600>, timerfd_tmrproc, S:01 # expires at 322052488772000-322052488772000 nsecs [in -249279075547 to -249279075547 nsecs] #50: <ffff00222fc18000>, timerfd_tmrproc, S:01 # expires at 322053988772000-322053988772000 nsecs [in -247779075547 to -247779075547 nsecs] #51: <ffff800010a4bcc0>, hrtimer_wakeup, S:01 # expires at 322056152946712-322056155446711 nsecs [in -245614900835 to -245612400836 nsecs] #52: <ffff00222258f800>, timerfd_tmrproc, S:01 # expires at 322058738772000-322058738772000 nsecs [in -243029075547 to -243029075547 nsecs] #53: <ffff800012f53860>, hrtimer_wakeup, S:01 # expires at 322331280568641-322331310568640 nsecs [in 29512721094 to 29542721093 nsecs] clock 5: .base: ffff0022fe0adb40 .index: 5 .resolution: 1 nsecs .get_time: ktime_get_real .offset: 1685177986378387320 nsecs active timers: #0: <ffff0022356a5000>, timerfd_tmrproc, S:01 # expires at 1685512232488772000-1685512232488772000 nsecs [in 11944342537133 to 11944342537133 nsecs] #1: <ffff00222fc1b800>, timerfd_tmrproc, S:01 # expires at 9223372036854775807-9223372036854775807 nsecs [in 7537871748708540940 to 7537871748708540940 nsecs] #2: <ffff00222c4c0800>, timerfd_tmrproc, S:01 # expires at 9223372036854775807-9223372036854775807 nsecs [in 7537871748708540940 to 7537871748708540940 nsecs] clock 6: .base: ffff0022fe0adb80 .index: 6 .resolution: 1 nsecs .get_time: ktime_get_boottime .offset: 0 nsecs active timers: #0: <ffff002234fca200>, timerfd_tmrproc, S:01 # expires at 220478238772000-220478238772000 nsecs [in -101823529075547 to -101823529075547 nsecs] #1: <ffff002238343400>, timerfd_tmrproc, S:01 # expires at 254533488772000-254533488772000 nsecs [in -67768279075547 to -67768279075547 nsecs] #2: <ffff002222bf2a00>, timerfd_tmrproc, S:01 # expires at 321985238772000-321985238772000 nsecs [in -316529075547 to -316529075547 nsecs] clock 7: .base: ffff0022fe0adbc0 .index: 7 .resolution: 1 nsecs .get_time: ktime_get_clocktai .offset: 1685177986378387320 nsecs active timers: .expires_next : 322301772000000 nsecs .hres_active : 1 .nr_events : 465592958 .nr_retries : 6442 .nr_hangs : 0 .max_hang_time : 0 .nohz_mode : 2 .last_tick : 322301672000000 nsecs .tick_stopped : 0 .idle_jiffies : 4375467714 .idle_calls : 565396731 .idle_sleeps : 425655798 .idle_entrytime : 322301765134472 nsecs .idle_waketime : 322301668003587 nsecs .idle_exittime : 322301765134472 nsecs .idle_sleeptime : 269393725698432 nsecs .iowait_sleeptime: 311053240339 nsecs .last_jiffies : 4375467714 .next_timer : 322301772000000 .idle_expires : 322301772000000 nsecs jiffies: 4375467739 cpu: 1 clock 0: .base: ffff0022fe0c1a00 .index: 0 .resolution: 1 nsecs .get_time: ktime_get .offset: 0 nsecs active timers: #0: <ffff0022fe0c1fb8>, tick_sched_timer, S:01 # expires at 322406832000000-322406832000000 nsecs [in 7440219 to 7440219 nsecs] clock 1: .base: ffff0022fe0c1a40 .index: 1 .resolution: 1 nsecs .get_time: ktime_get_real .offset: 1685177986378387320 nsecs active timers: clock 2: .base: ffff0022fe0c1a80 .index: 2 .resolution: 1 nsecs .get_time: ktime_get_boottime .offset: 0 nsecs active timers: clock 3: .base: ffff0022fe0c1ac0 .index: 3 .resolution: 1 nsecs .get_time: ktime_get_clocktai .offset: 1685177986378387320 nsecs active timers: clock 4: .base: ffff0022fe0c1b00 .index: 4 .resolution: 1 nsecs .get_time: ktime_get .offset: 0 nsecs active timers: clock 5: .base: ffff0022fe0c1b40 .index: 5 .resolution: 1 nsecs .get_time: ktime_get_real .offset: 1685177986378387320 nsecs active timers: clock 6: .base: ffff0022fe0c1b80 .index: 6 .resolution: 1 nsecs .get_time: ktime_get_boottime .offset: 0 nsecs active timers: clock 7: .base: ffff0022fe0c1bc0 .index: 7 .resolution: 1 nsecs .get_time: ktime_get_clocktai .offset: 1685177986378387320 nsecs active timers: .expires_next : 322406832000000 nsecs .hres_active : 1 .nr_events : 5865163 .nr_retries : 0 .nr_hangs : 0 .max_hang_time : 0 .nohz_mode : 2 .last_tick : 322406828000000 nsecs .tick_stopped : 1 .idle_jiffies : 4375494003 .idle_calls : 7304414 .idle_sleeps : 7145044 .idle_entrytime : 322406824031102 nsecs .idle_waketime : 322406700002750 nsecs .idle_exittime : 322406824024822 nsecs .idle_sleeptime : 322180705400214 nsecs .iowait_sleeptime: 0 nsecs .last_jiffies : 4375494003 .next_timer : 322406832000000 .idle_expires : 322406832000000 nsecs jiffies: 4375494003