如何在终端中检查中文输入频率?

29

我看过这个链接,但是脚本似乎无法运行。 请问有没有简单的方法可以在Linux终端中检查“HZ”?


也许这会有所帮助:http://www.advenage.com/topics/linux-timer-interrupt-frequency.php - Shawn Chin
scai在一些答案中放置了一个重要的评论,涉及CONFIG_HZ和USER_HZ的混淆。根据这个评论,我更新了我的答案,并添加了一个关于终端使用历史和含义的注释。 - reichhart
6个回答

35

对于这个问题,没有统一的答案,因为在某些情况下,您的内核可能编译为"tickless"并且根本不使用常规计时器中断。但是,如果您使用传统内核和传统发行版,则可以在/boot下找到当前内核的.config文件,并使用类似于grep 'CONFIG_HZ=' /boot/config-$(uname -r)的命令进行查找。


适用于Ubuntu 16.04。 - Jingguo Yao
1
你实际上没有检查正在运行的内核 - 只是一个配置文件,可能是当前运行的内核之一。在某些虚拟化环境中,这种方法行不通。 - reichhart
因此,“在传统内核和传统发行版上”。通常内核的kconfig在运行时不可用。因此,“没有统一的答案”。 - Andy Ross

17

可以这样确定 HZ 的值:

$ getconf CLK_TCK
100

使用getconf可以获取运行内核的编译时选项。请注意,HZ是可配置的:

$ man 7 time

HZ的值因内核版本和硬件平台而异。在i386上,情况如下:在2.4.x及以下的内核上,HZ为100,jiffy值为0.01秒;从2.6.0开始,HZ提高到1000,jiffy为0.001秒。自内核2.6.13以来,HZ值是内核配置参数,可以是100、250(默认值)或1000,分别产生0.01、0.004或0.001秒的jiffies值。自内核2.6.20以来,还有另外一个频率可用:300,它可以被常见的视频帧速率(PAL,25 HZ;NTSC,30 HZ)整除。

times(2)系统调用是一种特殊情况。它报告的时间粒度由内核常量USER_HZ定义。用户空间应用程序可以使用sysconf(_SC_CLK_TCK)确定此常量的值。

通常情况下,在使用getconf查询变量名时可能需要删除man页面中显示的_SC_部分。


6
这让我得到了100,但运行grep 'CONFIG_HZ=' /boot/config-$(uname -r)得到了250。你有什么想法吗? - devoured elysium
11
getconf CLK_TCKsysconf(_SC_CLK_TCK) 返回的是 USER_HZCLOCKS_PER_SEC,它似乎总是100,与内核配置无关。这与 CONFIG_HZHZ 不同,后者取决于内核配置。这就是为什么 getconf CLK_TCK 不会返回 CONFIG_HZ 值的原因。 - scai
好的,实际上OP没有说他想要什么样的HZ。我目前只知道一个想要一些HZ的原因,那就是解释来自/proc/stats的数字。为此,您需要USER_HZ。 - Gunther Schadow
1
@GunterSchadow OP没有说,但这个答案的作者在第一句话中说了:“HZ的值可以这样确定:”由于随后的方法实际上并没有确定HZ的值,因此这个答案是不正确的。-1。 - TypeIA

7

有许多不同的方法可以获得关于您的设置的提示。 在一些单核系统上,这个技巧很方便:

/ # cat /proc/interrupts | grep -i time; sleep 10; cat /proc/interrupts | grep time
 16:   10404858      INTC  68 Level     gp_timer
 16:   10514798      INTC  68 Level     gp_timer

它显示了在10秒的睡眠期间有多少个时钟周期。这里大约有100,000个。除以10得到大约10,000 HZ。

在多核系统上,这可能会变得混乱,因为它将是每个核心的列表。

另一个选择是检查是否可以获取原始内核配置。它将存储在

/proc/config.gz

解压文件并打开它。搜索看起来类似于以下部分的内容:
CONFIG_HZ_FIXED=0
# CONFIG_HZ_100 is not set
# CONFIG_HZ_200 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
# CONFIG_HZ_500 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ_10000=y
CONFIG_HZ=10000
CONFIG_SCHED_HRTICK=y

仅作提醒,10,000远超过正常设置。这是实验性的设置。


adb pull /proc/config.gz 的操作正常。谢谢。 - user1421092
我想编辑,但是建议的编辑队列已满。第二个选项的方法是使用 gunzip /proc/config.gz -c | grep CONFIG_HZ - thesecretmaster

5

更新:根据scai的评论编辑了答案。

在Bash中,“HZ”计算的示例代码如下:

$ awk '{print$22/'$(tail -n 1 /proc/uptime|cut -d. -f1)"}" /proc/self/stat
100

意思是:获取uptime的第22个值,然后将其除以“self”进程的启动时间。
这只会提供USER_HZ变量,它始终为100,而不是内核的CONFIG_HZ变量。
注意:在古代只有一个HZ变量。我想“#define USER_HZ 100”是随着分裂引入的。我也猜测在终端/ shell使用中,您需要USER_HZ而不是CONFIG_HZ。
请查看slm的答案和简单命令,特别是来自time(7)的解释USER_HZ的摘录。

字段22是进程开始时间的时钟滴答数。向下滚动到/proc/(pid)/stat - user1530335
/proc/uptime 包含系统运行时间的信息。第一个数字是系统已经运行的总秒数。实质上,reichhart 表示 CONFIG_HZ 将是 自启动以来的时钟滴答数 (ticks) / 自启动以来的时间 (seconds) 单位为 ticks / seconds。在大多数情况下,这应该是每秒 100 个滴答。 - user1530335
1
我尝试了这个并得到了 HZ=100 的结果,但如果我使用 extract-ikconfig,那么我会看到 CONFIG_HZ=300。这些描述的是不同的东西吗? - marshall.ward
不,它应该是一样的。根据https://github.com/torvalds/linux/blob/master/scripts/extract-ikconfig,这个工具将从内核映像中提取设置。我能给你的唯一解释是,你正在检查与你当前运行的不同的内核映像。我的“解决方案”很简单:你可以自己检查/proc/uptime和/proc/XXXX/stat(XXXX最近启动),然后手动计算。 - reichhart
2
不,它们不应该是一样的。这是两个不同的时钟。您提出的计算返回USER_HZ,即CLOCKS_PER_SEC,它似乎始终为100,独立于内核配置。这与依赖于内核配置的CONFIG_HZ,即HZ不*相同。 - scai
@scai:非常感谢您指出这一点!我已经更新了答案。 - reichhart

0

0
你要查找的内容在正在运行的内核配置文件 /proc/config.gz 中(如果启用的话,在大多数系统上它是启用的)。
因此,你可以使用以下命令来检查最终的时钟频率:
zcat /proc/config.gz | grep CONFIG_HZ

2
你可以使用zgrep代替zcat+grep:zgrep CONFIG_HZ /proc/config.gz - scai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接