如何将 CPU 负载记入日志
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 负载信息的文件。这些是 top
、uptime
、ps
和 proc/loadavg
文件。每一种都有着明显的优势。
uptime
和 proc/loadavg
提供了基本的见解,而 ps
提供了深入的过程级资源使用数据。top
命令位于两者之间,提供基本信息和过程级信息的混合。有了这些命令的知识,我们就可以有效地监控和记录任何 Linux 系统上的 CPU 负载。