为什么我不能将 jiffies 与正常运行时间相匹配?

why can't I match jiffies to uptime?

据我所知,Linux内核中的"jiffies"是开机后的滴答数,一秒内的滴答数由"HZ"定义,所以在理论:

(uptime in seconds) = jiffies / HZ

但根据我的测试,上述情况并非如此。例如:

$ uname -r
2.6.32-504.el6.x86_64
$ grep CONFIG_HZ /boot/config-2.6.32-504.el6.x86_64
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000

所以 "HZ" 是 1000,现在看看 jiffies 和正常运行时间:

$ grep ^jiffies /proc/timer_list
jiffies: 8833841974
jiffies: 8833841974
...
$ cat /proc/uptime
4539183.14 144549693.77

正如我们所见,"jiffies" 与正常运行时间有很大不同。我已经在很多盒子上进行了测试,none 的 jiffies 甚至接近正常运行时间。我做错了什么?

您尝试做的是 Linux 10 年前的工作方式。

从那以后就变得更复杂了。我知道的一些并发症是:

  • 存在 -5 分钟的偏移量,以便内核始终测试快速翻转。
  • 内核命令行可以设置一个快速跳跃值,因此 1000 Hz 内核可以 运行 250、100 或 10。
  • NoHZ 的各种尝试根本不使用计时器刻度,仅依赖计时器环和 HPET。
  • 我相信有一些虚拟来宾扩展会禁用 tick,并在需要 tick 时询问主机管理程序。例如 Xen 或 UML 构建。

这就是为什么内核具有旨在告诉您时间的函数。使用它们或弄清楚它们在做什么并复制它。

好吧,我遇到了同样的问题。经过一些研究,我终于找到了 jiffies 与 uptime 相比看起来这么大的原因。

仅仅是因为

#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))

如果HZ为1000,INITIAL_JIFFIES的实际值为0xfffb6c20,不是0xffffffffffffb6c20。

因此,如果您希望通过 jiffies 计算正常运行时间;你必须做

(jiffies - 0xfffb6c20)/HZ