zzxworld

Linux 系统使用命令查看 CPU 信息

Linux 系统使用命令查看 CPU 信息

在 Linux 系统上查看 CPU 信息的方法有很多,从查看 CPU 的硬件信息到使用率等,能通过好几个途径来实现同样的需求,本文以一些实际需求为例,分享了如何通过相关命令来获得想要的 CPU 信息。

查看 CPU 个数

现代 CPU 都是多核的,每个核相当于是一个单独的 CPU。那么在 Linux 系统上如何查到自己的 CPU 是几核,或者说有几个呢?

如果使用的是桌面版 Linux,可以找一个叫「系统监视器」的软件,通过这个软件可以很直观的看到。

gnome system monitor

通过这种方式虽然看起来很直观,但结果不一定准确。多核 CPU 这个所谓的「核」其实有两种:分别是「物理核」和「虚拟核」。虚拟核是由物理核模拟出来的,严格意义上来说不能算数。

那在 Linux 系统上如何查看 CPU 的物理核个数呢?这就需要使用命令了。首先要推荐使用的是 lscpu 命令:

lscpu

命令会输出很多和 CPU 相关的信息,和内核相关的主要是下面这几个:

...
    Thread(s) per core:  2
    Core(s) per socket:  4
    Socket(s):           1
...

Thread 表示线程,Core 表示核,Socket 表示主板上 CPU 的个数。根据上面的信息可以看出,我主板上就一块 CPU,它有 4 个物理核,每个核有 2 个线程。操作系统上显示的是包含虚拟核的 CPU,而数量就是这三个数相乘。这样就能明白为什么在系统监视器中显示的是 8 个 CPU 了。

除了 lscpu 命令,直接查看 /proc/cpuinfo 文件也能获得相关信息。

cat /proc/cpuinfo

在输出信息中找 cpu cores 开头的行,它后面的数字就是物理核数量。在我的电脑上显示如下:

cpu cores   : 4

查看 CPU 硬件信息

还是推荐使用 lscpu 命令,输出的信息中品牌,型号,时钟频率,L1, L2, L3 缓存大小等信息都一目了然。

另外一个选择就是 cat /proc/cpuinfo,它里面也包含了 CPU 的一些硬件信息,不过相对来说更简略一些,而且是以虚拟核的方式分段显示的。

查看 CPU 使用率

桌面环境下还是推荐使用「系统监视器」程序,它能以图表方式观测一段时间内 CPU 的使用波动情况和使用率。另外它还提供了进程管理界面,按 CPU 排序后可以方便的了解目前占用 CPU 较多的程序。关于它的界面可以翻到最上面查看 CPU 个数的部分了解。

对于终端环境,top 命令是个不错的选择。运行此命令后,会显示如下界面:

Screenshot top

这个界面中有三块内容可以用来了解 CPU 的使用情况。

第一部分是最顶端的靠右边的 load average: 0.84, 0.65, 0.61。它反应了系统的负载压力,也可以用来衡量 CPU 的总体使用情况。其中的三组数字分别代表了系统在过去一分钟五分钟十五分钟内所承担的计算压力。

对于单核 CPU,这个数字越接近 0 意味着压力越小,越靠近 1 表示系统越繁忙,负载较大。如果是多核 CPU,需要乘以 CPU 数量来观测。比如系统认为我的电脑有 8 个 CPU,目前显示的 0.84 可以理解为当前的负载并不高,CPU 的使用率也很低。而当这里负载显示接近或者超过 8 的时候,就可以认为系统负荷较大了。

第二部分内容是第三行以 %Cpu 开头的内容。这部分以百分比数字显示了当前系统 CPU 的整体情况。其中后面每组数字所代表的意义分别如下:

  • %us:用户空间程序的使用率。
  • %sy:系统空间的使用率。
  • %ni:通过进程调度的程序使用率。
  • %id:空闲的比率。
  • %wa:处于 IO 等待状态的比率。
  • %hi:处理硬中断的比率。
  • %si:处理软中断的比率。
  • %st:实时比率。

这其中只要关注 %id 比率就能反推出系统当前的 CPU 使用率了。

当 CPU 使用率较高时,就需要进一步了解是哪些程序导致的,这是接下来要介绍的 top 命令的第三部分内容:进程列表。进程列表的 %CPU 列显示了各软件当前使用的 CPU 比率。使用 Shift+p 快捷键可以让进程按 CPU 占用率从高到低排列,这样可以快速筛查出占用 CPU 较多的程序。

使用 ps 命令也可以完成筛选高 CPU 使用率进程的目的:

ps aux | sort -nrk 3,3 | head -n 10

上面的命令先使用 ps 命令列出当前所有运行的进程信息,然后通过 sort 命令按 CPU 使用率那一列的数字进行排序,最后用 head 命令只取最前面的 10 条数据。