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

Wen*_*bin 6 linux linux-kernel

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

(uptime in seconds) = jiffies / HZ
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

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

$ grep ^jiffies /proc/timer_list
jiffies: 8833841974
jiffies: 8833841974
...
$ cat /proc/uptime
4539183.14 144549693.77
Run Code Online (Sandbox Code Playgroud)

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

Zan*_*ynx 5

您正在尝试做的是 Linux 过去的工作方式 - 10 年前。

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

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

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