为什么 jiffies/HZ 与正常运行时间不匹配?

为什么 jiffies/HZ 与正常运行时间不匹配?

系统正常运行时间存储在/proc/uptime.如您所知,Linux 内核有一个jiffies变量,该变量随着参数指定的每个定时器中断而递增HZ。我HZ通过以下命令获取了值:

$ zcat /proc/config.gz | grep CONFIG_HZ=

CONFIG_HZ=300

在我的机器中,它等于 300。所以我将给出jiffies的值/proc/timer_list除以这个数字。

# cat /proc/timer_list | grep -E "^jiffies" | head -n1 && cat /proc/uptime 

jiffies: 4356505571
516409.13 1432145.01

我本来以为会得到相同的数字,但结果却截然不同。我的意思4356505571/300=14521685.23是应该非常接近516409.13,但事实并非如此!

背后是否有什么jiffies我不知道的想法?

答案1

一些/许多(但不是全部)现代内核向 jiffies 添加了偏移量 - 这是一个非常大的偏移量,基本上它是4294967295 - (300 * HZ)

300 * HZ是 5 分钟的偏移量这样内核总是测试 jiffy 翻转

所以,对于 300Hz 来说4294877295

从该值中减去该值jiffies,然后除以 HZ 应该会产生正确的结果

4356505571 - 4294877295 = 61628276

61628275 / 300 = 205427.587

哪个仍然与问题中的值不匹配

然而,在评论中,OP说90秒后,jiffies是4294904295

4294904295 - 4294877295 = 27000

27000 / 300 = 90.000

把它变成一个简单的公式

uptime = (jiffies - (4294967295 - (300 * HZ))) / HZ

或者

uptime = (jiffies - 4294967295) / HZ - 300

注意:我的所有 Linux 系统都使用偏移量 - 除了我的 OpenWRT 路由器 - 尽管最新版本中的内核版本为 5.4,但 jiffies 与正常运行时间的关系就像 OP 预期的那样:

uptime = jiffies / HZ

大多数(全部?)这些信息是从

然而,在这里添加可能也有意义

相关内容