编程

如何将 CPU 负载记入日志

61 2024-05-10 17:39:00

1. 介绍

我们生活在一个计算机富足的时代,随之而来的是游戏和生产力工具等资源匮乏的应用。然而,由于我们大多数人的资源有限,因此必须注意系统的性能和资源使用情况。了解 CPU(中央处理器)负载是监控我们的系统并通过优化系统确保平稳运行的关键。
在 Linux 系统上,有几种方法可以测量 CPU 负载。让我们首先正式了解 CPU 负载是什么,然后探索最常见的命令来检查和查看 Linux 系统的当前 CPU 使用情况。

2. 什么是 CPU 负载?

CPU 负载是衡量计算机 CPU 使用的处理能力的指标,表示在给定时间使用的 CPU 负载的百分比。这就像观察 CPU 有多忙,百分比越高表示工作负载越重。
从技术上讲,CPU 负载表示 CPU 在特定时间段内处理的平均计算工作量,包括活动任务和在队列中等待 CPU 时间的任务。例如,80% 的 CPU 负载表明当前正在使用 80% 的 CPU 容量,只有 20% 可用于其他任务。
了解 CPU 负载可以帮助我们评估系统性能,并确定 CPU 是否处于紧张状态,从而表明潜在的瓶颈或需要升级以确保高效的任务处理。

3. top 命令

top 命令是一个实时系统监控工具,它展示了有关进程和资源使用情况的信息,如 CPU、内存和交换空间。它提供了系统性能的动态和交互式视图。
我们可以包含各种选项来自定义命令的输出或行为。top 命令中最重要的选项之一是 -b 或批处理模式,这将对我们有所帮助。此模式使命令以非交互方式运行。我们还可以将此命令与 –n 选项配对使用,该选项指定 top 命令运行的迭代次数,并打印指标,直到停止。
让我们看看一个非交互式运行 top 命令并将输出保存在文件中以供稍后分析的实际示例:

$ top -n 1 -b > top.log
$ cat top.log
top - 23:29:20 up 5 min,  0 users,  load average: 0.00, 0.00, 0.00
Tasks:   5 total,   1 running,   4 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7626.2 total,   7228.9 free,    267.7 used,    129.6 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   7165.4 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    1 root      20   0    1804   1192   1104 S   0.0   0.0   0:00.01 init
    ...
    9 monsi     20   0   11508   8260   3308 S   0.0   0.1   0:00.06 bash
    ...

如我们所见,其输出包括运行进程的详细信息,如 PID(进程ID)、用户、CPU%、MEM% 和命令。正如我们所看到的,我们为这个例子运行的终端的 PID 为 9,它是一个占用很少 CPU 和内存的 bash 终端。
默认情况下,进程按 CPU 使用情况进行排序,最占用资源的进程列在最前面。这里的大部分信息都是不言自明的。让我们试着详细理解 %Cpu(s)  行中的缩写:

  • us: 用户空间进程
  • sy: 系统/内核空间进程
  • ni: 具有用户定义优先级的进程
  • id:  CPU 空闲时间
  • wa: I/O 操作的等待时间
  • hi: 硬件中断
  • si: 软件中断
  • st: 从虚拟机窃取的时间

所以,如果我们需要知道并记录任何时间点的 CPU 负载信息,top 可能会很有用。

4. uptime 命令

uptime 命令显示系统的当前正常运行时间,指示系统自上次重新启动以来运行的时间。它还提供了关于过去 1、5 和 15 分钟内的平均系统负载的信息。因此,这个命令对于了解过去几分钟的 CPU 负载历史非常有用。
让我们看一个记录 uptime 信息的实际示例:

$ uptime
23:49:21 up 25 min,  0 users,  load average: 0.00, 0.00, 0.00

此输出表示系统自上次重新启动以来已运行了 25 分钟,并且当前没有用户登录。负载平均值显示为三个用逗号分隔的数字,分别表示过去 1、5 和 15 分钟的平均系统负载。此例中,所有三个负载平均值均为 0.00,表明系统未处于显著负载下。
由于正常 uptime 时间的输出只有一行长,我们可以通过利用 shell 中的 while 循环结构,将此命令用作连续日志记录解决方案

$ while true; do uptime >> uptime.log; sleep 1; done
[pressed q to quit]
$ cat uptime.log
23:50:10 up 26 min,  0 users,  load average: 0.00, 0.00, 0.00
23:50:11 up 26 min,  0 users,  load average: 0.00, 0.00, 0.00
23:50:12 up 26 min,  0 users,  load average: 0.00, 0.00, 0.00
...

第一个命令的 while 循环结构由条件 true 组成,该条件总是等于 true,因此循环无限期运行。
在循环中,uptime>>uptime.log 将 uptime 命令的输出追加到文件 uptime.log 中,sleep 1 在循环重复之前暂停执行1秒。最后,通过打印 uptime.log 文件,我们可以看到它在每秒钟之后都会保存 uptime 命令的输出和 CPU 负载信息。

5. ps 命令

ps 命令用于查看有关系统上运行的活动进程的信息。它提供了对进程 ID、CPU 使用率、内存消耗和其他相关指标的详细见解。
让我们了解一下用于查看 CPU 负载的ps 命令的语法:

ps -e -o pid,ppid,%cpu,%mem,args --sort=%cpu

这里,-e-A 选项指示 ps 打印所有进程的信息。-o 选项允许我们使用用户定义的格式。这一点我们可以在命令的下一部分中看到。在这里,我们定义了五条关键信息的格式:

  • pid: 进程标识符
  • ppid: 父进程标识符
  • %cpu: 每个进程占用的 CPU 负载百分比
  • %mem: 每个进程使用的内存百分比
  • args: 与每个进程关联的命令及其参数

让我们看看这个命令的输出示例:

$ ps -eo pid,ppid,%cpu,%mem,args > ps.log
$ cat ps
  PID  PPID %CPU %MEM COMMAND
    1     0  0.0  0.0 /init
    7     1  0.0  0.0 /init
    8     7  0.0  0.0 /init
    9     8  0.0  0.1 -bash
    ...

从输出中,我们可以看到它显示了进程、它们的 pid 和 ppid 信息以及 CPU 负载。从这个例子中,我们可以再次看到,这个例子中的 CPU 并没有使用太多。我们还可以看到启动这些进程的命令名。我们也可以使用上一节的方法,并使用 while 循环来连续打印 CPU 负载。

6. proc/loadavg 文件

在 Linux 中,/proc/loadavg 文件是监视系统负载的宝贵资源。它提供了关于不同时间间隔内的平均系统负载的实时信息。系统管理员和用户可以使用此文件来测量系统性能并确定 CPU 负载。该文件由 Linux 内核维护,每 5 秒更新一次。
让我们打印该文件以查看其内容:

$ cat /proc/loadavg
0.00 0.00 0.00 1/177 230

我们可以看到,该文件通常由五个用空格分隔的值组成。这表示不同时间段内的平均系统负载。
更具体地说,前三个值 0.00 0.00 0.00 分别表示过去 1 分钟、5 分钟和 15 分钟的平均系统负载。第四个值 1/177 表示当前运行的进程数占进程总数的比例。第五个值 230 表示最近创建的进程的 PID。

7. 结论

本文中,我们探讨了在 Linux 中记录 CPU 负载和其他系统负载详细信息的不同方法。在 Linux 中查看 CPU 负载并不总是那么简单,而且有多种方法可以检索和存储这些信息。
我们已经了解了三个 Linux 命令和一个用于获取 CPU 负载信息的文件。这些是 topuptimepsproc/loadavg 文件。每一种都有着明显的优势。
uptimeproc/loadavg 提供了基本的见解,而 ps 提供了深入的过程级资源使用数据。top 命令位于两者之间,提供基本信息和过程级信息的混合。有了这些命令的知识,我们就可以有效地监控和记录任何 Linux 系统上的 CPU 负载。