系统正常运行时间存储在/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
大多数(全部?)这些信息是从
- https://stackoverflow.com/a/63176716/10549313- 这归功于@firo;和
- 和https://stackoverflow.com/a/33612184/10549313- 功劳归@ZanLynx
然而,在这里添加可能也有意义