本文翻译自:https://itsfoss.com/know-cpu-linux-corefreq/
如何在Linux
中检查CPU
信息?如何知道CPU
的真实速度?或者哪个进程当前被绑定到特定的核心上?下面就这些问题进行说明。
1.使用CoreFreq了解Linux系统中的CPU
CoreFreq
是一个用于收集Linux
系统上CPU
性能数据的工具。它采用开源许可,由法国开发者CyrIng
编写,源代码可在GitHub
上获取。
尽管CoreFreq
看似稳定,但仍应被视为实验性工具。截至目前,它仅可在Arch
软件仓库中获得,尚未为其他发行版打包。因此,如果想尝试使用它,可能需要自行编译。
最后,CoreFreq
与其他类似工具的不同之处在于,它旨在收集高精度数据。为实现这一目标,CoreFreq
需要尽可能接近硬件地监控CPU
。现在,让我们来看看它如何在Linux
机器上获取CPU
信息。
# CoreFreq
是如何工作的?
CoreFreq
由三部分组成:一个内核模块、一个守护进程和一个用户空间命令行界面(CLI
)。
按定义,内核模块将完全访问主机。它的职责是收集底层数据。
然后,这些数据由用户空间的守护进程收集。守护进程必须以
root
身份运行。最后,
CoreFreq
附带了一个终端界面,以易于阅读的人类可读格式报告数据。该CLI
工具是一个普通进程,最终用户可以使用它。
2.编译和运行CoreFreq
在运行CoreFreq
之前,必须先对其进行编译。这意味着,将程序员编写的源代码转换成计算机能够理解的形式。
编译CoreFreq
所需的步骤对于所有Linux
发行版来说大致相同,只是安装所需软件包的部分有所不同。在这里,给出CentOS/Red Hat
和Debian
的指令。
对于Red Hat/CentOS
,所需的工具是“开发工具”组的一部分,因此只需安装该组即可:
# specific to Red Hat, CentOS
sudo yum group install "Development Tools"
对于Debian
及其基于Debian
的发行版,需要安装几个单独的软件包:
# specific to Debian-based distributions
sudo apt-get install dkms git libpthread-stubs0-dev
dkms
是一个从源代码构建内核模块的工具。由于CoreFreq
是作为内核模块实现的,以便尽可能接近硬件地收集数据,因此它是必需的;git
是一个用于分布式开发的工具。在这里,我们仅使用它来下载最新CoreFreq
开发树的副本。libpthread-stubs0-dev
是构建CoreFreq
所需的库(实际上,在Linux上,它只包含pkg-config
数据)
系统上安装了所需的工具,接下来就可以下载CoreFreq
的源代码了:
# Distribution-agnostic part
git clone https://github.com/cyring/CoreFreq.git
请注意,git
将下载源代码的最新版本以及项目的所有修改历史记录。对于普通用户来说,这并无用处。
下面开始编译:
cd CoreFreq/
make && echo Done
几秒钟后,终端窗口中应该会出现Done
字样,表示编译成功。
此时,CoreFreq
的三个部分已经编译完成,准备启动。之前说过,该软件由三个部分组成——因此,实际上有三个软件可以启动来运行CoreFreq
。
2.1安装内核模块
由于技术原因,CoreFreq
使用相同的低级计数器,应该首先禁用NMI
看门狗。
在Debian
系统上,可以通过编辑/etc/default/grub
文件来添加nmi_watchdog=0
内核命令行参数,然后运行update-grub
来完成此操作:
sudoedit /etc/default/grub
update-grub
这里需要重新启动计算机以使新的内核参数生效。
为了安装内核模块,我们将使用标准的Linux
工具insmod
。它将模块加载到内核中并启动
它:
sudo insmod corefreqk.ko
可以使用lsmod
命令来检查CoreFreq
是否已安装:
lsmod | grep corefreq
corefreqk 45056 0
最后,可以通过检查dmesg
命令的输出,来确认CoreFreq
是否已识别出系统折处理器:
sudo dmesg | grep CoreFreq
[57413.945720] CoreFreq: Processor [06_1E] Architecture [Nehalem/Lynnfield] CPU [8/8]
2.2启动守护进程daemon
启动守护进程,它的目的是收集内核模块收集的数据(因为在内核中尽可能少地执行操作是一个良好的设计原则):
sudo ./corefreqd -i
此命令在守护进程运行时不会返回。因此,如果看到终端似乎挂起
了,请不要惊讶,它并没有挂起:守护进程只是在运行,准备接受客户端请求。上面使用了-i
标志,它是为了让守护进程在终端上显示更多关于当前情况的信息。
2.3启动客户端
打开一个新的终端,并导航到CoreFreq
目录。然后执行:
cd CoreFreq
./corefreq-cli
3.在Linux中探究您的CPU
除了处理器的静态特性(如型号名称或其功能)之外,一旦CoreFreq
运行起来,就可以开始实时探究CPU
的动态行为。例如,在上面的屏幕截图中,可以看到我的处理器的各个内核在138MHz
到334MHz
之间运行。(非常小的)负载在其间均匀分布。
此外,还可以看到每个内核在各种处理器C
状态(总和应为100%
)中花费的时间,以及在Turbo Boos
t模式下花费的时间。要了解这些概念,可以从这里看到这些精彩解释:https://haypo.github.io/intel-cpus.html。
下面,为了演示起见,在一个终端中启动了一个无限循环,以希望能够占用一个核心的100%
的负载:
# infinite loop
# eats 100% of the CPU--really?
while true; do : ; done
这里我们可以清楚地看到运行无限循环的shell
当前绑定到了哪个核心。这可以通过查看corefreq-cli
任务监视器来确认。
按
在上面的图片中看不到这一点,但如果运行它,会发现任务在几秒钟后从一个核心跳到另一个核心。
4.停止CoreFreq
要停止CoreFreq
,只需按启动时的相反顺序退出软件的三个部分。
在客户端终端中按
F4
或CTRL-C
退出客户端。在守护进程终端中按
CTRL-C
退出守护进程。使用命令
sudo rmmod corefreqk
卸载内核模块。
5.最后补充
在某些方面,CoreFreq
提供了在Linux
中可以使用top
、htop
、sensors
、lscpu
和其他一些工具收集的CPU
信息。但是,使用CoreFreq
,不仅可以在一个界面中获取所有信息,而且由于数据收集的方式,还可以获得更高的准确性。最后,据我所知,有些数据在其他任何工具中都无法获得(例如C状态比率?每周期指令数?)。
可能会发现这个工具主要面向的是试图微调计算密集型算法的开发人员,或者是急于检查通过超频硬件获得多少增益的游戏玩家。
但我必须承认,我个人总是觉得这类工具很有趣,因为它们让我们能够“触摸”到现代硬件的现实——这通常比我们通常想象的要复杂得多。例如,你们中有多少人知道CPU的各个内核可能会以不同的速度运行——或者可能处于不同的C模式?
无论如何,我确信你们中的一些人会发现这个工具的巧妙用途,或者会对自己的硬件做出有趣的发现。