跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 系统分析和微调指南 / 系统监控 / 系统监控实用程序
适用范围 SUSE Linux Enterprise Server 15 SP6

2 系统监控实用程序

您可以使用各种程序、工具和实用程序来检查系统的状态。本章介绍其中的一部分以及它们最重要且最常用的参数。

注意
注意: 使用 supportconfig 收集和分析系统信息

除了下面介绍的实用程序外,SUSE Linux Enterprise Server 还包含 supportconfig,此工具可创建有关系统的报告,例如:当前内核版本、硬件、已安装软件包、分区设置,等等。这些报告用于向 SUSE 支持人员提供创建支持票据时所需的信息。但是,还可根据这些报告分析已知问题,以帮助快速解决问题。为此,SUSE Linux Enterprise Server 提供了一个设备和一个命令行工具用于进行 Supportconfig 分析 (SCA)。有关详细信息,请参见第 47 章 “收集系统信息以供支持所用

对于所述的每条命令,将提供相关输出的示例。在示例中,第一行是命令本身(在 tux > 或 root # 之后)。使用方括号 ([...]) 表示省略,必要时对较长的行进行换行。较长的行的换行符由反斜线 (\) 表示。

> command -x -y
output line 1
output line 2
output line 3 is annoyingly long, so long that \
    we need to break it
output line 4
[...]
output line 98
output line 99

我们尽量使说明简洁明了,以便包含尽可能多的实用程序。您可以在手册页中找到所有命令的更多信息。大多数命令还可识别参数 --help,该参数可生成可能参数的简要列表。

2.1 多用途工具

大部分 Linux 系统监控工具只会监控系统的某个方面,不过,也有几个工具的使用范围更广。要了解概况并确定想要进一步检查系统的哪个部分,请先使用这些工具。

2.1.1 vmstat

vmstat 可收集有关进程、内存、I/O、中断和 CPU 的信息:

vmstat [options] [delay [count]]

如果在不指定延迟和计数值的情况下调用此工具,它将显示自上次重引导以来的平均值。如果结合使用延迟值(以秒为单位)调用,它将显示给定时间段(以下示例中为两秒)的值。计数值指定 vmstat 应执行的更新次数。如果不指定此值,此工具会一直运行,直到用户手动将其停止。

例 2.1︰ 低负载计算机上的 vmstat 输出
> vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0  44264  81520    424 935736    0    0    12    25   27   34  1  0 98   0  0
 0  0  44264  81552    424 935736    0    0     0     0   38   25  0  0 100  0  0
 0  0  44264  81520    424 935732    0    0     0     0   23   15  0  0 100  0  0
 0  0  44264  81520    424 935732    0    0     0     0   36   24  0  0 100  0  0
 0  0  44264  81552    424 935732    0    0     0     0   51   38  0  0 100  0  0
例 2.2︰ 高负载计算机(CPU 密集型)上的 vmstat 输出
> vmstat 2
procs -----------memory----------- ---swap-- -----io---- -system-- -----cpu------
 r  b   swpd   free   buff   cache   si   so    bi    bo   in   cs us sy id wa st
32  1  26236 459640 110240 6312648    0    0  9944     2 4552 6597 95  5  0  0  0
23  1  26236 396728 110336 6136224    0    0  9588     0 4468 6273 94  6  0  0  0
35  0  26236 554920 110508 6166508    0    0  7684 27992 4474 4700 95  5  0  0  0
28  0  26236 518184 110516 6039996    0    0 10830     4 4446 4670 94  6  0  0  0
21  5  26236 716468 110684 6074872    0    0  8734 20534 4512 4061 96  4  0  0  0
提示
提示:输出的第一行

vmstat 输出的第一行始终显示自上次重引导以来的平均值。

各列显示以下信息:

r

显示处于可运行状态的进程数。这些进程正在执行,或正在等待有可用的 CPU 槽。如果此列中的进程数目持续高于可用 CPU 数目,可能表示 CPU 算力不足。

b

显示正在等待除 CPU 以外资源的进程数。如果此列中的数字较大,可能表示出现了 I/O 问题(网络或磁盘)。

swpd

当前使用的交换空间量 (KB)。

free

未使用的内存量 (KB)。

inact

最近未使用的可回收的内存。仅当结合使用参数 -a(建议使用)调用 vmstat 时,此列才可见。

active

最近已使用的且正常情况下不会回收的内存。仅当结合使用参数 -a(建议使用)调用 vmstat 时,此列才可见。

buff

RAM 中包含文件系统元数据的文件缓冲区缓存 (KB)。结合使用参数 -a 调用 vmstat 时,此列不可见。

cache

RAM 中包含实际文件内容的页缓存 (KB)。结合使用参数 -a 调用 vmstat 时,此列不可见。

si / so

每秒从交换空间移到 RAM (si) 或者从 RAM 移到交换空间 (so) 的数据量 (KB)。如果 so 值在很长一段时间内都较大,可能表示应用程序正在泄漏内存,并且泄漏的内存正在换出。如果 si 值在很长一段时间内都较大,可能表示在很长时间内处于非活动状态的应用程序现在恢复了活动状态。如果 siso 值在很长一段时间内都较大,则证明存在交换震荡,并可能表示需要在系统中安装更多 RAM,因为没有足够的内存可以容纳工作集。

bi

每秒从块设备收到的块数(例如,磁盘读取)。交换也会影响此处显示的值。块大小根据文件系统而异,但可以使用 stat 实用程序来确定。如果需要吞吐量数据,则可使用 iostat。

bo

每秒向块设备发送的块数(例如,磁盘写入)。交换也会影响此处显示的值。

in

每秒中断数。如果此值较大,可能表示 I/O 级别(网络和/或磁盘)较高,但也有可能是出于其他原因触发了此状态,例如,其他活动触发了处理器间中断。请务必同时检查 /proc/interrupts 以识别中断的来源。

cs

每秒环境切换次数。这是内核将内存中一个程序的可执行代码替换为另一程序的可执行代码的次数。

us

执行应用程序代码的 CPU 用量百分比。

sy

执行内核代码的 CPU 用量百分比。

id

CPU 空闲时间百分比。如果此值在很长一段时间内都为零,表示您的 CPU 正在满负荷工作。这不一定是糟糕的迹象 — 最好参考 rb 列中的值来确定您的计算机是否具备足够的 CPU 算力。

wa

如果“wa”时间不为零,表示由于正在等待 I/O 而损失了吞吐量。此问题可能不可避免,例如,如果发生首次读取某个文件而后台写回无法跟上读取进度等情况时。此外,还可能表示存在硬件瓶颈(网络或硬盘)。最后,这可能表示需要微调虚拟内存管理器(请参见第 15 章 “微调内存管理子系统)。

st

从虚拟机挪用的 CPU 时间百分比。

有关更多选项,请参见 vmstat --help

2.1.2 dstat

dstat 可以取代 vmstatiostatnetstatifstat 等工具。dstat 实时显示有关系统资源的信息。例如,您可结合来自 IDE 控制器的中断数比较磁盘用量,或结合磁盘吞吐量(以相同的间隔)比较网络带宽。

默认情况下,其输出将显示在易于阅读的表格中。或者,可以生成 CSV(适合用作电子表格导入格式)输出。

dstat 以 Python 编写,可以通过插件来增强其功能。

下面是一般语法:

dstat [-afv] [OPTIONS..] [DELAY [COUNT]]

所有选项和参数都是可选的。如果未指定任何参数,dstat 将显示有关 CPU(-c--cpu)、磁盘(-d--disk)、网络(-n--net)、分页(-g--page),以及系统的中断和环境切换(-y--sys)的统计数据;它无休止地每秒刷新一次输出:

# dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw
  0   0 100   0   0   0|  15k   44k|   0     0 |   0    82B| 148   194
  0   0 100   0   0   0|   0     0 |5430B  170B|   0     0 | 163   187
  0   0 100   0   0   0|   0     0 |6363B  842B|   0     0 | 196   185
-a--all

等于 -cdngy(默认值)

-f--full

扩展 -C-D-I-N-S 发现列表

-v--vmstat

等于 -pmgdsc-D total

DELAY

每次更新的延迟秒数

COUNT

在退出之前要显示的更新次数

默认延迟为 1,计数为未指定(无限制)。

有关详细信息,请参见 dstat 的手册页及其网页(网址为 http://dag.wieers.com/home-made/dstat/)。

2.1.3 系统活动信息:sar

sar 可以生成关于几乎所有重要系统活动的各种报告,其中包括 CPU、内存、IRQ 用量、I/O 和网络。它还可以实时生成报告。sar 命令从 /proc 文件系统收集数据。

注意
注意:sysstat 软件包

sar 命令是 sysstat 软件包的一部分。请使用 YaST 或 zypper in sysstat 命令安装该软件包。sysstat.service 在默认情况下不会启动,必须使用以下命令来启用并启动它:

> sudo systemctl enable --now sysstat

2.1.3.1 使用 sar 生成报告

要实时生成报告,请调用 sar 并指定间隔(秒)和计数。要从文件生成报告,请使用选项 -f 指定文件名,而不要指定间隔和计数。如果未指定文件名、间隔和计数,sar 将尝试从 /var/log/sa/saDD 生成报告,其中 DD 表示当天。这是 sadc(系统活动数据收集器)将其数据写入到的默认位置。您可使用多个 -f 选项查询多个文件。

sar 2 10                         # real time report, 10 times every 2 seconds
sar -f ~/reports/sar_2014_07_17  # queries file sar_2014_07_17
sar                              # queries file from today in /var/log/sa/
cd /var/log/sa && \
sar -f sa01 -f sa02              # queries files /var/log/sa/0[12]

下面提供了有用的 sar 调用示例及其解释。有关每列含义的详细信息,请参见 sarman (1)

注意
注意:服务停止时的 sysstat 报告

sysstat 服务停止时(例如,在重引导或关机期间),该工具仍会通过自动运行 /usr/lib64/sa/sa1 -S ALL 1 1 命令收集最后一分钟的统计数据。收集的二进制数据存储在系统活动数据文件中。

2.1.3.1.1 CPU 使用率报告:sar

如果不结合使用任何选项调用 sar,它会显示有关 CPU 使用率的基本报告。在多处理器计算机上,将汇总所有 CPU 的结果。使用选项 -P ALL 还可查看各个 CPU 的统计数据。

# sar 10 5
Linux 6.4.0-150600.9-default (jupiter)         03/11/2024        _x86_64_        (2 CPU)

17:51:29        CPU     %user     %nice   %system   %iowait    %steal     %idle
17:51:39        all     57,93      0,00      9,58      1,01      0,00     31,47
17:51:49        all     32,71      0,00      3,79      0,05      0,00     63,45
17:51:59        all     47,23      0,00      3,66      0,00      0,00     49,11
17:52:09        all     53,33      0,00      4,88      0,05      0,00     41,74
17:52:19        all     56,98      0,00      5,65      0,10      0,00     37,27
Average:        all     49,62      0,00      5,51      0,24      0,00     44,62

%iowait 显示 CPU 在等待 I/O 请求时处于空闲状态的时间百分比。如果此值在很长一段时间内都远大于零,则表示 I/O 系统(网络或硬盘)存在瓶颈。如果 %idle 值在很长一段时间内都为零,则表示您的 CPU 正在满负荷工作。

2.1.3.1.2 内存使用率报告:sar -r

使用选项 -r 生成系统内存 (RAM) 的总体情况说明。

# sar -r 10 5
Linux 6.4.0-150600.9-default (jupiter)         03/11/2024        _x86_64_        (2 CPU)

17:55:27 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
17:55:37    104232   1834624    94.62        20   627340  2677656   66.24   802052  828024    1744
17:55:47     98584   1840272    94.92        20   624536  2693936   66.65   808872  826932    2012
17:55:57     87088   1851768    95.51        20   605288  2706392   66.95   827260  821304    1588
17:56:07     86268   1852588    95.55        20   599240  2739224   67.77   829764  820888    3036
17:56:17    104260   1834596    94.62        20   599864  2730688   67.56   811284  821584    3164
Average:     96086   1842770    95.04        20   611254  2709579   67.03   815846  823746    2309

kbcommit%commit 列显示当前工作负载可能需要的最大内存量(RAM 和交换空间)的近似值。kbcommit 显示以 KB 为单位的绝对数字,%commit 则显示百分比。

2.1.3.1.3 分页统计报告:sar -B

使用选项 -B 可显示内核分页统计数据。

# sar -B 10 5
Linux 6.4.0-150600.9-default (jupiter)         03/11/2024        _x86_64_        (2 CPU)

18:23:01 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
18:23:11   366.80     11.60  542.50     1.10  4354.80      0.00      0.00      0.00   0.00
18:23:21     0.00    333.30 1522.40     0.00 18132.40      0.00      0.00      0.00   0.00
18:23:31    47.20    127.40 1048.30     0.10 11887.30      0.00      0.00      0.00   0.00
18:23:41    46.40      2.50  336.10     0.10  7945.00      0.00      0.00      0.00   0.00
18:23:51     0.00    583.70 2037.20     0.00 17731.90      0.00      0.00      0.00   0.00
Average:    92.08    211.70 1097.30     0.26 12010.28      0.00      0.00      0.00   0.00

majflt/s(每秒重大错误数)列显示已将多少页从磁盘加载到内存中。错误可能因文件访问或错误导致。有时出现许多重大错误是正常的。例如,在应用程序启动期间就可能会出现这种情况。如果在应用程序的整个有效期内都出现重大错误,可能表示主内存不足,尤其是同时还要执行大量的直接扫描 (pgscand/s) 时。

%vmeff 列显示扫描的页数 (pgscand/s),相对于从主内存缓存或交换缓存 (pgsteal/s) 中重复使用的页数。此值用于测量页回收的效率。正常值接近 100(正在重复使用已换出的每个非活动页)或 0(未扫描任何页)。该值不应降到 30 以下。

2.1.3.1.4 块设备统计报告:sar -d

使用选项 -d 可显示块设备(硬盘、光盘驱动器、USB 存储设备等)。请务必使用附加选项 -p(美观打印)来使 DEV 列更易于阅读。

# sar -d -p 10 5
 Linux 6.4.0-150600.9-default (jupiter)         03/11/2024        _x86_64_        (2 CPU)

18:46:09 DEV   tps rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
18:46:19 sda  1.70    33.60      0.00     19.76      0.00      0.47      0.47      0.08
18:46:19 sr0  0.00     0.00      0.00      0.00      0.00      0.00      0.00      0.00

18:46:19 DEV   tps rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
18:46:29 sda  8.60   114.40    518.10     73.55      0.06      7.12      0.93      0.80
18:46:29 sr0  0.00     0.00      0.00      0.00      0.00      0.00      0.00      0.00

18:46:29 DEV   tps rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
18:46:39 sda 40.50  3800.80    454.90    105.08      0.36      8.86      0.69      2.80
18:46:39 sr0  0.00     0.00      0.00      0.00      0.00      0.00      0.00      0.00

18:46:39 DEV   tps rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
18:46:49 sda  1.40     0.00    204.90    146.36      0.00      0.29      0.29      0.04
18:46:49 sr0  0.00     0.00      0.00      0.00      0.00      0.00      0.00      0.00

18:46:49 DEV   tps rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
18:46:59 sda  3.30     0.00    503.80    152.67      0.03      8.12      1.70      0.56
18:46:59 sr0  0.00     0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average: DEV   tps rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average: sda 11.10   789.76    336.34    101.45      0.09      8.07      0.77      0.86
Average: sr0  0.00     0.00      0.00      0.00      0.00      0.00      0.00      0.00

比较所有磁盘的 tpsrd_sec/swr_sec/sAverage 值。如果 svctm%util 列中的值一直较大,可能表示 I/O 子系统是瓶颈。

如果计算机使用多个磁盘,则最好是以交错方式在等速、等容量的磁盘之间均匀分布 I/O。需要考虑到存储系统是否有多层。此外,如果有多个存储路径,请在平衡存储空间的使用方式时,考虑链接饱和度的范围应为多少。

2.1.3.1.5 网络统计报告:sar -n KEYWORD

选项 -n 可让您生成多份网络相关报告。与 -n 一起指定以下关键字之一:

  • DEV:生成所有网络设备的统计报告

  • EDEV:生成所有网络设备的错误统计报告

  • NFS:生成 NFS 客户端的统计报告

  • NFSD:生成 NFS 服务器的统计报告

  • SOCK:生成有关套接字的统计报告

  • ALL:生成所有网络统计报告

2.1.3.2 可视化 sar 数据

sar 报告不一定总能让用户轻松分析。使用能将 sar 数据可视化的 Java 应用程序 kSar,创建易于阅读的图表。它甚至还可以生成 PDF 报告。kSar 可接受实时生成的数据以及文件中的既往数据。kSar 通过 BSD 许可证授权,可从 https://sourceforge.net/projects/ksar/ 获取。

2.2 系统信息

2.2.1 设备负载信息:iostat

要监控系统设备负载,请使用 iostat。此工具生成的报告可用于在挂接到系统的物理磁盘之间更好地进行负载平衡。

要使用 iostat,请安装软件包 sysstat

第一份 iostat 报告显示自引导系统以来收集的统计信息。后续报告则涵盖上一份报告之后的时间。

> iostat
Linux 6.4.0-150600.9-default (jupiter)         03/11/2024        _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          17.68    4.49    4.24    0.29    0.00   73.31

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sdb               2.02        36.74        45.73    3544894    4412392
sda               1.05         5.12        13.47     493753    1300276
sdc               0.02         0.14         0.00      13641         37

以这种方式调用 iostat 可帮助您确定吞吐量是否与预期不符,但不会解释原因。通过调用 iostat -x 生成的扩展报告可以更好地解答此类问题。例如,扩展报告中额外包含有关平均队列大小和平均等待时间的信息。如果使用 -z 开关排除空闲块设备,还可以更轻松地评估数据。在 iostat 的手册页 (man 1 iostat) 中可以找到显示的每个列标题的定义。

您还可以指定应按指定的间隔监控的特定设备。例如,要按三秒间隔为设备 sda 生成五份报告,请使用:

> iostat -p sda 3 5

要显示网络文件系统 (NFS) 的统计数据,可以使用下列两个类似的实用程序:

  • nfsiostat-sysstat 已随附于软件包 sysstat 中。

  • nfsiostat 已随附于软件包 nfs-client 中。

注意
注意:在多路径设置中使用 iostat

iostat 命令可能不会显示 nvme list-subsys 列出的所有控制器。默认情况下,iostat 会过滤掉所有没有 I/O 的块设备。要使 iostat 显示所有设备,请使用以下命令:

>  iostat -p ALL

2.2.2 处理器活动监控:mpstat

实用程序 mpstat 检查每个可用处理器的活动。如果您的系统仅有一个处理器,将报告全局平均统计数据。

计时参数的工作方式与 iostat 命令相同。输入 mpstat 2 5 会以两秒间隔列显所有处理器的五份报告。

# mpstat 2 5
Linux 6.4.0-150600.9-default (jupiter)         03/11/2024        _x86_64_        (2 CPU)

13:51:10  CPU   %usr  %nice  %sys  %iowait  %irq  %soft  %steal  %guest  %gnice   %idle
13:51:12  all   8,27   0,00  0,50     0,00  0,00   0,00    0,00    0,00    0,00   91,23
13:51:14  all  46,62   0,00  3,01     0,00  0,00   0,25    0,00    0,00    0,00   50,13
13:51:16  all  54,71   0,00  3,82     0,00  0,00   0,51    0,00    0,00    0,00   40,97
13:51:18  all  78,77   0,00  5,12     0,00  0,00   0,77    0,00    0,00    0,00   15,35
13:51:20  all  51,65   0,00  4,30     0,00  0,00   0,51    0,00    0,00    0,00   43,54
Average:  all  47,85   0,00  3,34     0,00  0,00   0,40    0,00    0,00    0,00   48,41

mpstat 数据中可以看到:

  • %usr%sys 之比。例如,比值 10:1 表示工作负载主要是运行应用程序代码,分析重点应该是应用程序。比值 1:10 表示工作负载主要在内核方面受到限制,值得考虑微调内核。或者,确定应用程序为何在内核方面受到限制,以及是否可以缓解这种情况。

  • 即使在系统负载总体较轻的情况下,是否仍有一部分 CPU 几乎被完全使用。少量热点 CPU 可能表示工作负载未并行化,在处理器更少但更快的计算机上执行可能更有利。

2.2.3 处理器频率监控:turbostat

turbostat 显示 AMD64/Intel 64 处理器的频率、负载、温度和算力。此工具能够以两种模式运行:如果使用某个命令调用,将派生命令进程,命令完成时将显示统计数据。如果不使用命令运行,它每隔五秒会显示一次更新的统计数据。使用 turbostat 需要加载内核模块 msr

> sudo turbostat find /etc -type d -exec true {} \;
0.546880 sec
     CPU Avg_MHz   Busy% Bzy_MHz TSC_MHz
       -     416   28.43    1465    3215
       0     631   37.29    1691    3215
       1     416   27.14    1534    3215
       2     270   24.30    1113    3215
       3     406   26.57    1530    3214
       4     505   32.46    1556    3214
       5     270   22.79    1184    3214

输出可能会因 CPU 类型而异。要显示温度和算力等更多细节,请使用 --debug 选项。有关更多命令行选项以及字段说明的解释,请参见 man 8 turbostat

2.2.4 任务监控:pidstat

如果您需要查看特定任务对您系统施加的负载,请使用 pidstat 命令。此命令会列显每个选定任务的活动,或列显 Linux 内核管理的所有任务的活动(如果未指定任务)。您还可以设置要显示的报告数,以及时间间隔。

例如,pidstat -C firefox 2 3 会列显命令名称包含字符串firefox的任务的负载统计数据。每隔两秒会列显三份报告。

# pidstat -C firefox 2 3
Linux 6.4.0-150600.9-default (jupiter)         03/11/2024        _x86_64_        (2 CPU)

14:09:11      UID       PID    %usr %system  %guest    %CPU   CPU  Command
14:09:13     1000       387   22,77    0,99    0,00   23,76     1  firefox

14:09:13      UID       PID    %usr %system  %guest    %CPU   CPU  Command
14:09:15     1000       387   46,50    3,00    0,00   49,50     1  firefox

14:09:15      UID       PID    %usr %system  %guest    %CPU   CPU  Command
14:09:17     1000       387   60,50    7,00    0,00   67,50     1  firefox

Average:      UID       PID    %usr %system  %guest    %CPU   CPU  Command
Average:     1000       387   43,19    3,65    0,00   46,84     -  firefox

类似地,可以使用 pidstat -d 来评估任务正在执行多少 I/O、任务在执行这些 I/O 时是否处于休眠状态,以及任务停滞的时钟节拍数。

2.2.5 内核环形缓冲区:dmesg

Linux 内核在环形缓冲区中保存某些消息。要查看这些消息,请输入命令 dmesg -T

较旧事件将记录在 systemd 日记中。有关日记的详细信息,请参见第 21 章 “journalctl:查询 systemd 日记

2.2.6 打开的文件的列表:lsof

要查看为具有进程 ID PID 的进程打开的所有文件的列表,请使用 -p。例如,要查看当前 shell 使用的所有文件,请输入:

# lsof -p $$
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
bash    8842 root  cwd    DIR   0,32      222  6772 /root
bash    8842 root  rtd    DIR   0,32      166   256 /
bash    8842 root  txt    REG   0,32   656584 31066 /bin/bash
bash    8842 root  mem    REG   0,32  1978832 22993 /lib64/libc-2.19.so
[...]
bash    8842 root    2u   CHR  136,2      0t0     5 /dev/pts/2
bash    8842 root  255u   CHR  136,2      0t0     5 /dev/pts/2

使用了特殊外壳变量 $$,它的值是外壳的进程 ID。

-i 结合使用时,lsof 还会列出当前打开的互联网文件:

# lsof -i
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
wickedd-d  917 root    8u  IPv4  16627      0t0  UDP *:bootpc
wickedd-d  918 root    8u  IPv6  20752      0t0  UDP [fe80::5054:ff:fe72:5ead]:dhcpv6-client
sshd      3152 root    3u  IPv4  18618      0t0  TCP *:ssh (LISTEN)
sshd      3152 root    4u  IPv6  18620      0t0  TCP *:ssh (LISTEN)
master    4746 root   13u  IPv4  20588      0t0  TCP localhost:smtp (LISTEN)
master    4746 root   14u  IPv6  20589      0t0  TCP localhost:smtp (LISTEN)
sshd      8837 root    5u  IPv4 293709      0t0  TCP jupiter.suse.de:ssh->venus.suse.de:33619 (ESTABLISHED)
sshd      8837 root    9u  IPv6 294830      0t0  TCP localhost:x11 (LISTEN)
sshd      8837 root   10u  IPv4 294831      0t0  TCP localhost:x11 (LISTEN)

2.2.7 内核和 udev 事件序列查看器:udevadm monitor

udevadm monitor 侦听内核 uevent 以及 udev 规则发出的事件,并将事件的设备路径 (DEVPATH) 列显到控制台。当连接 USB 记忆棒时会出现一系列事件:

注意
注意:监控 udev 事件

只允许 root 用户通过运行 udevadm 命令监控 udev 事件。

UEVENT[1138806687] add@/devices/pci0000:00/0000:00:1d.7/usb4/4-2/4-2.2
UEVENT[1138806687] add@/devices/pci0000:00/0000:00:1d.7/usb4/4-2/4-2.2/4-2.2
UEVENT[1138806687] add@/class/scsi_host/host4
UEVENT[1138806687] add@/class/usb_device/usbdev4.10
UDEV  [1138806687] add@/devices/pci0000:00/0000:00:1d.7/usb4/4-2/4-2.2
UDEV  [1138806687] add@/devices/pci0000:00/0000:00:1d.7/usb4/4-2/4-2.2/4-2.2
UDEV  [1138806687] add@/class/scsi_host/host4
UDEV  [1138806687] add@/class/usb_device/usbdev4.10
UEVENT[1138806692] add@/devices/pci0000:00/0000:00:1d.7/usb4/4-2/4-2.2/4-2.2
UEVENT[1138806692] add@/block/sdb
UEVENT[1138806692] add@/class/scsi_generic/sg1
UEVENT[1138806692] add@/class/scsi_device/4:0:0:0
UDEV  [1138806693] add@/devices/pci0000:00/0000:00:1d.7/usb4/4-2/4-2.2/4-2.2
UDEV  [1138806693] add@/class/scsi_generic/sg1
UDEV  [1138806693] add@/class/scsi_device/4:0:0:0
UDEV  [1138806693] add@/block/sdb
UEVENT[1138806694] add@/block/sdb/sdb1
UDEV  [1138806694] add@/block/sdb/sdb1
UEVENT[1138806694] mount@/block/sdb/sdb1
UEVENT[1138806697] umount@/block/sdb/sdb1

2.3 流程

2.3.1 进程间通讯:ipcs

命令 ipcs 生成当前正在使用的 IPC 资源的列表:

# ipcs
------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 65536      tux        600        524288     2          dest
0x00000000 98305      tux        600        4194304    2          dest
0x00000000 884738     root       600        524288     2          dest
0x00000000 786435     tux        600        4194304    2          dest
0x00000000 12058628   tux        600        524288     2          dest
0x00000000 917509     root       600        524288     2          dest
0x00000000 12353542   tux        600        196608     2          dest
0x00000000 12451847   tux        600        524288     2          dest
0x00000000 11567114   root       600        262144     1          dest
0x00000000 10911763   tux        600        2097152    2          dest
0x00000000 11665429   root       600        2336768    2          dest
0x00000000 11698198   root       600        196608     2          dest
0x00000000 11730967   root       600        524288     2          dest

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0xa12e0919 32768      tux        666        2

2.3.2 进程列表:ps

命令 ps 生成进程的列表。书写大多数参数时一定不能带减号。请参见 ps --help 获取简要帮助,或者参见手册页获取详细帮助。

要列出所有进程以及用户和命令行信息,请使用 ps axu

> ps axu
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3  34376  4608 ?        Ss   Jul24   0:02 /usr/lib/systemd/systemd
root         2  0.0  0.0      0     0 ?        S    Jul24   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Jul24   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   Jul24   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    Jul24   0:00 [kworker/u2:0]
root         7  0.0  0.0      0     0 ?        S    Jul24   0:00 [migration/0]
[...]
tux      12583  0.0  0.1 185980  2720 ?        Sl   10:12   0:00 /usr/lib/gvfs/gvfs-mtp-volume-monitor
tux      12587  0.0  0.1 198132  3044 ?        Sl   10:12   0:00 /usr/lib/gvfs/gvfs-gphoto2-volume-monitor
tux      12591  0.0  0.1 181940  2700 ?        Sl   10:12   0:00 /usr/lib/gvfs/gvfs-goa-volume-monitor
tux      12594  8.1 10.6 1418216 163564 ?      Sl   10:12   0:03 /usr/bin/gnome-shell
tux      12600  0.0  0.3 393448  5972 ?        Sl   10:12   0:00 /usr/lib/gnome-settings-daemon-3.0/gsd-printer
tux      12625  0.0  0.6 227776 10112 ?        Sl   10:12   0:00 /usr/lib/gnome-control-center-search-provider
tux      12626  0.5  1.5 890972 23540 ?        Sl   10:12   0:00 /usr/bin/nautilus --no-default-window
[...]

要检查有多少个 sshd 进程正在运行,请将选项 -p 与命令 pidof 一起使用,这会列出给定进程的进程 ID。

> ps -p $(pidof sshd)
  PID TTY      STAT   TIME COMMAND
 1545 ?        Ss     0:00 /usr/sbin/sshd -D
 4608 ?        Ss     0:00 sshd: root@pts/0

可以根据需要设置进程列表的格式。选项 L 返回所有关键字的列表。输入以下命令可以生成所有进程按内存使用量排序的列表:

> ps ax --format pid,rss,cmd --sort rss
  PID   RSS CMD
  PID   RSS CMD
    2     0 [kthreadd]
    3     0 [ksoftirqd/0]
    4     0 [kworker/0:0]
    5     0 [kworker/0:0H]
    6     0 [kworker/u2:0]
    7     0 [migration/0]
    8     0 [rcu_bh]
[...]
12518 22996 /usr/lib/gnome-settings-daemon-3.0/gnome-settings-daemon
12626 23540 /usr/bin/nautilus --no-default-window
12305 32188 /usr/bin/Xorg :0 -background none -verbose
12594 164900 /usr/bin/gnome-shell
有用的 ps 调用
ps aux--sort COLUMN

COLUMN 对输出进行排序。请将 COLUMN 替换为

pmem(表示物理内存比率)
pcpu(表示 CPU 比率)
rss(表示常驻集大小,即不交换的物理内存)
ps axo pid,%cpu,rss,vsz,args,wchan

显示每个进程、其 PID、CPU 用量、内存大小(常驻和虚拟)、名称及其系统调用。

ps axfo pid,args

显示进程树。

2.3.3 进程树:pstree

命令 pstree 生成树状进程列表:

> pstree
systemd---accounts-daemon---{gdbus}
        |                 |-{gmain}
        |-at-spi-bus-laun---dbus-daemon
        |                 |-{dconf worker}
        |                 |-{gdbus}
        |                 |-{gmain}
        |-at-spi2-registr---{gdbus}
        |-cron
        |-2*[dbus-daemon]
        |-dbus-launch
        |-dconf-service---{gdbus}
        |               |-{gmain}
        |-gconfd-2
        |-gdm---gdm-simple-slav---Xorg
        |     |                 |-gdm-session-wor---gnome-session---gnome-setti+
        |     |                 |                 |               |-gnome-shell+++
        |     |                 |                 |               |-{dconf work+
        |     |                 |                 |               |-{gdbus}
        |     |                 |                 |               |-{gmain}
        |     |                 |                 |-{gdbus}
        |     |                 |                 |-{gmain}
        |     |                 |-{gdbus}
        |     |                 |-{gmain}
        |     |-{gdbus}
        |     |-{gmain}
[...]

参数 -p 将进程 ID 添加到给定的名称。要让命令行也显示出来,请使用 -a 参数:

2.3.4 进程表:top

命令 toptable of processes(进程表)的英文缩写)显示每隔两秒刷新的进程列表。要停止该程序,请按 Q 键。参数 -n 1 可在显示一次进程列表后停止该程序。下面是 top -n 1 命令的示例输出:

> top -n 1
Tasks: 128 total,   1 running, 127 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.4 us,  1.2 sy,  0.0 ni, 96.3 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   1535508 total,   699948 used,   835560 free,      880 buffers
KiB Swap:  1541116 total,        0 used,  1541116 free.   377000 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    1 root      20   0  116292   4660   2028 S 0.000 0.303   0:04.45 systemd
    2 root      20   0       0      0      0 S 0.000 0.000   0:00.00 kthreadd
    3 root      20   0       0      0      0 S 0.000 0.000   0:00.07 ksoftirqd+
    5 root       0 -20       0      0      0 S 0.000 0.000   0:00.00 kworker/0+
    6 root      20   0       0      0      0 S 0.000 0.000   0:00.00 kworker/u+
    7 root      rt   0       0      0      0 S 0.000 0.000   0:00.00 migration+
    8 root      20   0       0      0      0 S 0.000 0.000   0:00.00 rcu_bh
    9 root      20   0       0      0      0 S 0.000 0.000   0:00.24 rcu_sched
   10 root      rt   0       0      0      0 S 0.000 0.000   0:00.01 watchdog/0
   11 root       0 -20       0      0      0 S 0.000 0.000   0:00.00 khelper
   12 root      20   0       0      0      0 S 0.000 0.000   0:00.00 kdevtmpfs
   13 root       0 -20       0      0      0 S 0.000 0.000   0:00.00 netns
   14 root       0 -20       0      0      0 S 0.000 0.000   0:00.00 writeback
   15 root       0 -20       0      0      0 S 0.000 0.000   0:00.00 kintegrit+
   16 root       0 -20       0      0      0 S 0.000 0.000   0:00.00 bioset
   17 root       0 -20       0      0      0 S 0.000 0.000   0:00.00 crypto
   18 root       0 -20       0      0      0 S 0.000 0.000   0:00.00 kblockd

默认情况下,输出将按 CPU 用量(列 %CPU,快捷方式为 ShiftP)排序。使用以下组合键可以更改排序字段:

ShiftM:常驻内存 (RES)
ShiftN:进程 ID (PID)
ShiftT:时间 (TIME+)

要使用任何其他字段进行排序,请按 F 并从列表中选择一个字段。要切换排序顺序,请使用 ShiftR

参数 -U UID 只监控与特定用户关联的进程。请将 UID 替换为用户的用户 ID。使用 top -U $(id -u) 显示当前用户的进程

2.3.5 IBM Z 超级管理程序监控器:hyptop

hyptop 通过 debugfs 使用内核基础架构来提供 IBM Z 超级管理程序环境的动态实时视图。它适用于 z/VM 或 LPAR 超级管理程序。例如,它可以根据可用的数据,显示活动 LPAR 或 z/VM Guest 的 CPU 与内存消耗量。它提供类似于 top 命令的基于 curses 的用户界面。hyptop 提供两个窗口:

  • sys_list:列出当前超级管理程序正在运行的系统

  • sys:更详细地显示一个系统

您可以在交互模式(默认)下或使用 -b 选项在批模式下运行 hyptop。在交互模式下,可以按 ? (在启动 hyptop 后)获取帮助。

LPAR 下的 sys_list 窗口输出:

12:30:48 | CPU-T: IFL(18) CP(3) UN(3)     ?=help
system  #cpu    cpu   mgm    Cpu+  Mgm+   online
(str)    (#)    (%)   (%)    (hm)  (hm)    (dhm)
H05LP30   10 461.14 10.18 1547:41  8:15 11:05:59
H05LP33    4 133.73  7.57  220:53  6:12 11:05:54
H05LP50    4  99.26  0.01  146:24  0:12 10:04:24
H05LP02    1  99.09  0.00  269:57  0:00 11:05:58
TRX2CFA    1   2.14  0.03    3:24  0:04 11:06:01
H05LP13    6   1.36  0.34    4:23  0:54 11:05:56
TRX1      19   1.22  0.14   13:57  0:22 11:06:01
TRX2      20   1.16  0.11   26:05  0:25 11:06:00
H05LP55    2   0.00  0.00    0:22  0:00 11:05:52
H05LP56    3   0.00  0.00    0:00  0:00 11:05:52
         413 823.39 23.86 3159:57 38:08 11:06:01

z/VM 下的“sys_list”窗口输出:

12:32:21 | CPU-T: UN(16)                          ?=help
system   #cpu    cpu    Cpu+   online memuse memmax wcur
(str)     (#)    (%)    (hm)    (dhm)  (GiB)  (GiB)  (#)
T6360004    6 100.31  959:47 53:05:20   1.56   2.00  100
T6360005    2   0.44    1:11  3:02:26   0.42   0.50  100
T6360014    2   0.27    0:45 10:18:41   0.54   0.75  100
DTCVSW1     1   0.00    0:00 53:16:42   0.01   0.03  100
T6360002    6   0.00  166:26 40:19:18   1.87   2.00  100
OPERATOR    1   0.00    0:00 53:16:42   0.00   0.03  100
T6360008    2   0.00    0:37 30:22:55   0.32   0.75  100
T6360003    6   0.00 3700:57 53:03:09   4.00   4.00  100
NSLCF1      1   0.00    0:02 53:16:41   0.03   0.25  500
EREP        1   0.00    0:00 53:16:42   0.00   0.03  100
PERFSVM     1   0.00    0:53  2:21:12   0.04   0.06    0
TCPIP       1   0.00    0:01 53:16:42   0.01   0.12 3000
DATAMOVE    1   0.00    0:05 53:16:42   0.00   0.03  100
DIRMAINT    1   0.00    0:04 53:16:42   0.01   0.03  100
DTCVSW2     1   0.00    0:00 53:16:42   0.01   0.03  100
RACFVM      1   0.00    0:00 53:16:42   0.01   0.02  100
           75 101.57 5239:47 53:16:42  15.46  22.50 3000

LPAR 下的 sys 窗口输出:

14:08:41 | H05LP30 | CPU-T: IFL(18) CP(3) UN(3)                  ? = help
cpuid   type    cpu   mgm visual.
(#)    (str)    (%)   (%) (vis)
0        IFL  96.91  1.96 |############################################ |
1        IFL  81.82  1.46 |#####################################        |
2        IFL  88.00  2.43 |########################################     |
3        IFL  92.27  1.29 |##########################################   |
4        IFL  83.32  1.05 |#####################################        |
5        IFL  92.46  2.59 |##########################################   |
6        IFL   0.00  0.00 |                                             |
7        IFL   0.00  0.00 |                                             |
8        IFL   0.00  0.00 |                                             |
9        IFL   0.00  0.00 |                                             |
             534.79 10.78

z/VM 下的 sys 窗口输出:

15:46:57 | T6360003 | CPU-T: UN(16)                  ? = help
cpuid     cpu visual
(#)       (%) (vis)
0      548.72 |#########################################    |
        548.72

2.3.6 顶层式 I/O 监控器:iotop

iotop 实用程序按进程或线程显示 I/O 使用情况表。

注意
注意:安装 iotop

默认未安装 iotop。您需要以 root 身份使用 zypper in iotop 手动安装它。

iotop 显示采样期间每个进程读取和写入的 I/O 带宽的列。它还会显示该进程在换入时以及等待 I/O 时所花时间的百分比。对于每个进程,都会显示 I/O 优先级(类/级别)。此外,还会在界面顶部显示采样期间读取和写入的总 I/O 带宽。

  • 使用 键可更改排序。

  • 使用 R 键可反转排序顺序。

  • 使用 O 键可在显示所有进程和线程(默认视图)与仅显示执行 I/O 的进程和线程之间切换。(此功能类似于在命令行上添加 --only。)

  • 使用 P 键可在显示线程(默认视图)与显示进程之间切换。(此功能类似于 --only。)

  • 使用 A 键可在显示当前 I/O 带宽(默认视图)与显示自 iotop 启动以来的累计 I/O 操作数目之间切换。(此功能类似于 --accumulated。)

  • 使用 I 键可更改某个线程或者某个进程的线程的优先级。

  • Q 键会退出 iotop

  • 按任何其他键会强制刷新。

下面是当 findemacs 正在运行时命令 iotop --only 的示例输出:

# iotop --only
Total DISK READ: 50.61 K/s | Total DISK WRITE: 11.68 K/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
 3416 be/4 tux         50.61 K/s    0.00 B/s  0.00 %  4.05 % find /
  275 be/3 root        0.00 B/s    3.89 K/s  0.00 %  2.34 % [jbd2/sda2-8]
 5055 be/4 tux          0.00 B/s    3.89 K/s  0.00 %  0.04 % emacs

还可以在批模式 (-b) 下使用 iotop,其输出将存储在文件中以供日后分析。有关完整的选项集,请参见手册页 (man 8 iotop)。

2.3.7 修改进程的资源优先级:nicerenice

内核按照进程的 nice 级别(也称为资源优先级)决定哪些进程需要的 CPU 时间比其他进程更多。进程的nice级别越高,它占用的 CPU 时间较之其他进程就越少。Nice 级别的范围从 -20(最低 nice 级别)到 19。负值只能由 root 用户设置。

当运行持续时间较长且会使用大量 CPU 时间的非时间关键型进程时,调整资源优先级会很有用。例如,在同时执行其他任务的系统上编译内核时。将此类进程的nice级别调高可确保其他任务(例如 Web 服务器)获得更高的优先级。

调用不带任何参数的 nice 会列显当前资源优先级:

> nice
0

运行 nice COMMAND 会将给定命令的当前 nice 级别加 10。使用 nice -n LEVEL COMMAND 可以指定相对于当前级别的新资源优先级。

要更改正在运行的进程的资源优先级,请使用 renice PRIORITY -p PROCESS_ID,例如:

> renice +5 3266

要恢复特定用户拥有的所有进程的资源优先级,请使用选项 -u USER。 使用选项 -g PROCESS_GROUP_ID 可重新设置进程组的资源优先级。

2.4 内存

2.4.1 内存用量:free

实用程序 free 可检查 RAM 和交换空间用量。将显示有关可用内存和已使用内存以及交换区域的详细信息:

> free
             total       used       free     shared    buffers     cached
Mem:      32900500   32703448     197052          0     255668    5787364
-/+ buffers/cache:   26660416    6240084
Swap:      2046972     304680    1742292

选项 -b-k-m-g 分别以字节、KB、MB 或 GB 为单位显示输出。参数 -s delay 确保显示内容每隔 DELAY 秒刷新。例如,free -s 1.5 每隔 1.5 秒生成更新内容。

2.4.2 内存使用详情:/proc/meminfo

相比 free,使用 /proc/meminfo 可以获取有关内存使用情况的更详细信息。实际上,free 会使用此文件中一定数量的数据。下面是在 64 位系统上的示例输出。由于内存管理方式不同,在 32 位系统上的输出略有不同:

MemTotal:        1942636 kB
MemFree:         1294352 kB
MemAvailable:    1458744 kB
Buffers:             876 kB
Cached:           278476 kB
SwapCached:            0 kB
Active:           368328 kB
Inactive:         199368 kB
Active(anon):     288968 kB
Inactive(anon):    10568 kB
Active(file):      79360 kB
Inactive(file):   188800 kB
Unevictable:          80 kB
Mlocked:              80 kB
SwapTotal:       2103292 kB
SwapFree:        2103292 kB
Dirty:                44 kB
Writeback:             0 kB
AnonPages:        288592 kB
Mapped:            70444 kB
Shmem:             11192 kB
Slab:              40916 kB
SReclaimable:      17712 kB
SUnreclaim:        23204 kB
KernelStack:        2000 kB
PageTables:        10996 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     3074608 kB
Committed_AS:    1407208 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      145996 kB
VmallocChunk:   34359588844 kB
HardwareCorrupted:     0 kB
AnonHugePages:     86016 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       79744 kB
DirectMap2M:     2017280 kB

这些项的含义如下:

MemTotal

RAM 总量。

MemFree

未使用的 RAM 量。

MemAvailable

在不交换的情况下可用于启动新应用程序的预计内存量。

Buffers

RAM 中包含文件系统元数据的文件缓冲区缓存。

Cached

RAM 中的页缓存。这不包括缓冲区缓存和交换缓存,但包括 Shmem 内存。

SwapCached

换出内存的页缓存。

ActiveActive(anon)Active(file)

最近使用的内存,除非必要或明确请求,否则不会回收。ActiveActive(anon)Active(file) 之和。

  • Active(anon) 跟踪交换支持的内存。这包括专用和共享的匿名映射,以及完成写入时复制操作后的专用文件页。

  • Active(file) 跟踪其他文件系统支持的内存。

InactiveInactive(anon)Inactive(file)

上次使用时间较早的内存,通常会最先回收。InactiveInactive(anon)Inactive(file) 之和。

  • Inactive(anon) 跟踪交换支持的内存。这包括专用和共享的匿名映射,以及完成写入时复制操作后的专用文件页。

  • Inactive(file) 跟踪其他文件系统支持的内存。

Unevictable

无法回收的内存量(例如,由于它是 Mlocked 或用作 RAM 磁盘)。

Mlocked

mlock 系统调用提供支持的内存量。mlock 允许进程定义要将其虚拟内存映射到物理 RAM 的哪个部分。但是,mlock 不保证实现这种定位。

SwapTotal

交换空间量。

SwapFree

未使用的交换空间量。

Dirty

由于包含更改而正在等待写入磁盘的内存量(相较于后备存储空间)。脏数据可在短暂延迟后由应用程序或内核明确同步。将大量脏数据写入磁盘可能需要花费大量时间,从而导致停滞。可使用 sysctl 参数 vm.dirty_ratiovm.dirty_bytes 来控制可在任意时间存在的脏数据总量(有关更多细节,请参见第 15.1.5 节 “写回”)。

Writeback

当前正在写入磁盘的内存量。

Mapped

使用 mmap 系统调用声明的内存。

Shmem

在进程组之间共享的内存,例如 IPC 数据、tmpfs 数据和共享的匿名内存。

Slab

内核内部数据结构的内存分配。

SReclaimable

可回收的 Slab 部分,例如缓存(inode、dentry 等)。

SUnreclaim

不可回收的 Slab 部分。

KernelStack

应用程序(通过系统调用)使用的内核空间内存量。

PageTables

专用于所有进程的页表的内存量。

NFS_Unstable

已发送到服务器,但尚未在服务器中提交的 NFS 页。

Bounce

块设备的回弹缓冲区使用的内存。

WritebackTmp

临时写回缓冲区的 FUSE 使用的内存。

CommitLimit

根据过量使用率设置提供给系统的内存量。仅当启用了严格的过量使用统计时,才会强制此限制。

Committed_AS

当前工作负载在最坏情况下需要的内存总量(RAM 和交换空间)近似值。

VmallocTotal

分配的内核虚拟地址空间量。

VmallocUsed

已使用的内核虚拟地址空间量。

VmallocChunk

可用内核虚拟地址空间的最大连续块。

HardwareCorrupted

有故障的内存量(仅当使用 ECC RAM 时才可检测到)。

AnonHugePages

映射到用户空间页表的匿名大页。这些页是在未经专门请求的情况下以透明方式为进程分配的,因此它们也称为透明大页 (THP)。

HugePages_Total

SHM_HUGETLBMAP_HUGETLB 使用的预分配大页数,或者根据 /proc/sys/vm/nr_hugepages 中的定义通过 hugetlbfs 文件系统使用的预分配大页数。

HugePages_Free

可用大页数。

HugePages_Rsvd

已提交的大页数。

HugePages_Surp

超出 HugePages_Total 的可用大页数(超量),在 /proc/sys/vm/nr_overcommit_hugepages 中定义。

Hugepagesize

大页的大小 — 在 AMD64/Intel 64 上,默认值为 2048 KB。

DirectMap4k

映射到具有给定大小(示例中为 4 kB)的页的内核内存量。

2.4.3 进程内存用量:smaps

使用 topps 等标准工具无法确切地确定特定进程消耗的内存量。如果您需要确切的数据,请使用内核 2.6.14 中引入的 smaps 子系统。该子系统位于 /proc/PID/smaps 中,会显示 ID 为 PID 的进程当时使用的干净和脏内存页数。它会区分共享内存和专用内存,因此您可以查看进程使用的内存量,其中不包括与其他进程共享的内存。有关详细信息,请参见 /usr/src/linux/Documentation/filesystems/proc.txt(需要安装软件包 kernel-source)。

读取 smaps 会产生很高的开销。因此,不建议经常性地对其进行监控,而是仅在密切监控特定进程时才这样做。

2.4.4 numaTOP

numaTOP 是适用于 NUMA(非一致性内存访问)系统的一个工具。该工具提供 NUMA 系统的实时分析,可帮助识别 NUMA 相关的性能瓶颈。

一般而言,numaTOP 可让您通过分析远程内存访问 (RMA) 数量、本地内存访问 (LMA) 数量和 RMA/LMA 比率,来识别和调查位置不佳(即,本地内存用量与远程内存用量之比不佳)的进程和线程。

PowerPC 以及以下 Intel Xeon 处理器支持 numaTOP:5500 系列、6500/7500 系列、5600 系列、E7-x8xx 系列和 E5-16xx/24xx/26xx/46xx 系列。

numaTOP 在官方软件储存库中提供,您可以使用 sudo zypper in numatop 命令安装该工具。要启动 numaTOP,请运行 numatop 命令。要大致了解 numaTOP 功能和用法,请使用 man numatop 命令。

2.5 网络

提示
提示:流量整形

如果网络带宽低于预期,您应该先检查是否对网段激活了任何流量整形规则。

2.5.1 基本网络诊断:ip

ip 是用于设置和控制网络接口的强大工具。还可以使用它来快速查看有关系统网络接口的基本统计数据。例如,接口是否已启动,或是发生了多少错误、丢包或包冲突。

如果不结合使用任何附加参数运行 ip,它会显示帮助输出。要列出所有网络接口,请输入 ip addr show(或缩写形式 ip a)。ip addr show up 仅列出正在运行的网络接口。ip -s link show DEVICE 仅列出指定的接口的统计数据:

# ip -s link show br0
6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT
    link/ether 00:19:d1:72:d4:30 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    6346104756 9265517  0       10860   0       0
    TX: bytes  packets  errors  dropped carrier collsns
    3996204683 3655523  0       0       0       0

ip 还可以显示接口 (link)、路由表 (route) 等信息 - 有关细节,请参见 man 8 ip

# ip route
default via 192.168.2.1 dev eth1
192.168.2.0/24 dev eth0  proto kernel  scope link  src 192.168.2.100
192.168.2.0/24 dev eth1  proto kernel  scope link  src 192.168.2.101
192.168.2.0/24 dev eth2  proto kernel  scope link  src 192.168.2.102
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:44:30:51 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:a3:c1:fb brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:32:a4:09 brd ff:ff:ff:ff:ff:ff

2.5.2 显示进程的网络用量:nethogs

在某些情况下(例如,如果网络流量突然变得过高),需要使用该工具来迅速找到引发流量的应用程序。nethogs 工具在设计上与 top 类似,可显示所有相关进程的传入和传出流量:

PID   USER  PROGRAM                                DEV   SENT   RECEIVED
27145 root   zypper                                eth0  5.719  391.749 KB/sec
?     root   ..0:113:80c0:8080:10:160:0:100:30015        0.102    2.326 KB/sec
26635 tux    /usr/lib64/firefox/firefox            eth0  0.026    0.026 KB/sec
?     root   ..0:113:80c0:8080:10:160:0:100:30045        0.000    0.021 KB/sec
?     root   ..0:113:80c0:8080:10:160:0:100:30045        0.000    0.018 KB/sec
?     root   ..0:113:80c0:8080:10:160:0:100:30015        0.000    0.018 KB/sec
?     root   ..0:113:80c0:8080:10:160:0:100:30045        0.000    0.017 KB/sec
?     root   ..0:113:80c0:8080:10:160:0:100:30045        0.000    0.017 KB/sec
?     root   ..0:113:80c0:8080:10:160:0:100:30045        0.069    0.000 KB/sec
?     root   unknown TCP                                 0.000    0.000 KB/sec

TOTAL                                                  5.916  394.192 KB/sec

top 一样,nethogs 支持交互式命令:

M:在显示模式(kb/s、kb、b、mb)之间循环
R:按 RECEIVED 排序
S:按 SENT 排序
Q:退出

2.5.3 以太网卡细节:ethtool

ethtool 可详细显示和更改以太网设备的各个方面。默认情况下,它会列显指定设备的当前设置。

# ethtool eth0
Settings for eth0:
 Supported ports: [ TP ]
 Supported link modes:   10baseT/Half 10baseT/Full
                         100baseT/Half 100baseT/Full
                         1000baseT/Full
 Supports auto-negotiation: Yes
 Advertised link modes:  10baseT/Half 10baseT/Full
                         100baseT/Half 100baseT/Full
                         1000baseT/Full
 Advertised pause frame use: No
[...]
 Link detected: yes

下表显示了可用于查询设备特定信息的 ethtool 选项:

表 2.1︰ ethtool 的查询选项列表

ethtool option

查询设备的以下信息

-a

暂停参数信息

-c

中断合并信息

-g <组文件>

Rx/Tx(接收/传输)环参数信息

-i

关联的驱动程序信息

-k

减负信息

-S

NIC 和驱动程序特定的统计数据

2.5.4 显示网络状态:ss

ss 是用于转储套接字统计数据的工具,可取代 netstat 命令。要列出所有连接,请使用不带参数的 ss

# ss
Netid  State      Recv-Q Send-Q   Local Address:Port       Peer Address:Port
u_str  ESTAB      0      0                    * 14082                 * 14083
u_str  ESTAB      0      0                    * 18582                 * 18583
u_str  ESTAB      0      0                    * 19449                 * 19450
u_str  ESTAB      0      0      @/tmp/dbus-gmUUwXABPV 18784           * 18783
u_str  ESTAB      0      0      /var/run/dbus/system_bus_socket 19383 * 19382
u_str  ESTAB      0      0      @/tmp/dbus-gmUUwXABPV 18617           * 18616
u_str  ESTAB      0      0      @/tmp/dbus-58TPPDv8qv 19352           * 19351
u_str  ESTAB      0      0                    * 17658                 * 17657
u_str  ESTAB      0      0                    * 17693                 * 17694
[..]

要显示当前打开的所有网络端口,请使用以下命令:

# ss -l
Netid  State      Recv-Q Send-Q      Local Address:Port  Peer Address:Port
nl     UNCONN     0      0                 rtnl:4195117                  *
nl     UNCONN     0      0       rtnl:wickedd-auto4/811                  *
nl     UNCONN     0      0       rtnl:wickedd-dhcp4/813                  *
nl     UNCONN     0      0                 rtnl:4195121                  *
nl     UNCONN     0      0                 rtnl:4195115                  *
nl     UNCONN     0      0       rtnl:wickedd-dhcp6/814                  *
nl     UNCONN     0      0                  rtnl:kernel                  *
nl     UNCONN     0      0             rtnl:wickedd/817                  *
nl     UNCONN     0      0                 rtnl:4195118                  *
nl     UNCONN     0      0                rtnl:nscd/706                  *
nl     UNCONN     4352   0              tcpdiag:ss/2381                  *
[...]

显示网络连接时,您可以指定要显示的套接字类型:例如 TCP (-t) 或 UDP (-u)。-p 选项可显示套接字所属程序的 PID 和名称。

下例列出了所有 TCP 连接和使用这些连接的程序。-a 选项可确保显示所有已建立的连接(侦听和非侦听)。-p 选项可显示套接字所属程序的 PID 和名称。

# ss -t -a -p
State    Recv-Q Send-Q  Local Address:Port   Peer Address:Port
LISTEN   0      128                  *:ssh                 *:*  users:(("sshd",1551,3))
LISTEN   0      100         127.0.0.1:smtp                 *:*  users:(("master",1704,13))
ESTAB    0      132      10.120.65.198:ssh  10.120.4.150:55715  users:(("sshd",2103,5))
LISTEN   0      128                 :::ssh                :::*  users:(("sshd",1551,4))
LISTEN   0      100               ::1:smtp                :::*  users:(("master",1704,14))

2.6 /proc 文件系统

/proc 文件系统是一个伪文件系统,在该文件系统中,内核以虚拟文件的形式保留重要信息。例如,使用以下命令显示 CPU 类型:

> cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 30
model name      : Intel(R) Core(TM) i5 CPU         750  @ 2.67GHz
stepping        : 5
microcode       : 0x6
cpu MHz         : 1197.000
cache size      : 8192 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 4
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 11
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm ida dtherm tpr_shadow vnmi flexpriority ept vpid
bogomips        : 5333.85
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:
[...]
提示
提示:详细处理器信息

还可以运行 x86info 来获取有关 AMD64/Intel 64 体系结构上处理器的详细信息。

用下列命令查询中断的分配和使用:

> cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3
  0:        121          0          0          0   IO-APIC-edge      timer
  8:          0          0          0          1   IO-APIC-edge      rtc0
  9:          0          0          0          0   IO-APIC-fasteoi   acpi
 16:          0      11933          0          0   IO-APIC-fasteoi   ehci_hcd:+
 18:          0          0          0          0   IO-APIC-fasteoi   i801_smbus
 19:          0     117978          0          0   IO-APIC-fasteoi   ata_piix,+
 22:          0          0    3275185          0   IO-APIC-fasteoi   enp5s1
 23:     417927          0          0          0   IO-APIC-fasteoi   ehci_hcd:+
 40:    2727916          0          0          0  HPET_MSI-edge      hpet2
 41:          0    2749134          0          0  HPET_MSI-edge      hpet3
 42:          0          0    2759148          0  HPET_MSI-edge      hpet4
 43:          0          0          0    2678206  HPET_MSI-edge      hpet5
 45:          0          0          0          0   PCI-MSI-edge      aerdrv, P+
 46:          0          0          0          0   PCI-MSI-edge      PCIe PME,+
 47:          0          0          0          0   PCI-MSI-edge      PCIe PME,+
 48:          0          0          0          0   PCI-MSI-edge      PCIe PME,+
 49:          0          0          0        387   PCI-MSI-edge      snd_hda_i+
 50:     933117          0          0          0   PCI-MSI-edge      nvidia
NMI:       2102       2023       2031       1920   Non-maskable interrupts
LOC:         92         71         57         41   Local timer interrupts
SPU:          0          0          0          0   Spurious interrupts
PMI:       2102       2023       2031       1920   Performance monitoring int+
IWI:      47331      45725      52464      46775   IRQ work interrupts
RTR:          2          0          0          0   APIC ICR read retries
RES:     472911     396463     339792     323820   Rescheduling interrupts
CAL:      48389      47345      54113      50478   Function call interrupts
TLB:      28410      26804      24389      26157   TLB shootdowns
TRM:          0          0          0          0   Thermal event interrupts
THR:          0          0          0          0   Threshold APIC interrupts
MCE:          0          0          0          0   Machine check exceptions
MCP:         40         40         40         40   Machine check polls
ERR:          0
MIS:          0

maps 文件中包含可执行文件和库的地址分配:

> cat /proc/self/maps
08048000-0804c000 r-xp 00000000 03:03 17753      /bin/cat
0804c000-0804d000 rw-p 00004000 03:03 17753      /bin/cat
0804d000-0806e000 rw-p 0804d000 00:00 0          [heap]
b7d27000-b7d5a000 r--p 00000000 03:03 11867      /usr/lib/locale/en_GB.utf8/
b7d5a000-b7e32000 r--p 00000000 03:03 11868      /usr/lib/locale/en_GB.utf8/
b7e32000-b7e33000 rw-p b7e32000 00:00 0
b7e33000-b7f45000 r-xp 00000000 03:03 8837       /lib/libc-2.3.6.so
b7f45000-b7f46000 r--p 00112000 03:03 8837       /lib/libc-2.3.6.so
b7f46000-b7f48000 rw-p 00113000 03:03 8837       /lib/libc-2.3.6.so
b7f48000-b7f4c000 rw-p b7f48000 00:00 0
b7f52000-b7f53000 r--p 00000000 03:03 11842      /usr/lib/locale/en_GB.utf8/
[...]
b7f5b000-b7f61000 r--s 00000000 03:03 9109       /usr/lib/gconv/gconv-module
b7f61000-b7f62000 r--p 00000000 03:03 9720       /usr/lib/locale/en_GB.utf8/
b7f62000-b7f76000 r-xp 00000000 03:03 8828       /lib/ld-2.3.6.so
b7f76000-b7f78000 rw-p 00013000 03:03 8828       /lib/ld-2.3.6.so
bfd61000-bfd76000 rw-p bfd61000 00:00 0          [stack]
ffffe000-fffff000 ---p 00000000 00:00 0          [vdso]

可以从 /proc 文件系统获取大量详细信息。一些重要的文件及其内容如下:

/proc/devices

可用设备

/proc/modules

加载的内核模块

/proc/cmdline

内核命令行

/proc/meminfo

有关内存使用的详细信息

/proc/config.gz

当前运行的内核的 gzip 压缩配置文件

/proc/PID/

/proc/NNN 目录中提供了当前运行进程的信息,其中 NNN 是相关进程的进程 ID (PID)。每个进程都可以在 /proc/self/ 中找到其自身的特征。

文本文件 /usr/src/linux/Documentation/filesystems/proc.txt 中提供了更多信息(安装软件包 kernel-source 后会提供此文件)。

2.6.1 procinfo

命令 procinfo 可以汇总 /proc 文件系统中的重要信息:

> procinfo
Linux 3.11.10-17-desktop (geeko@buildhost) (gcc 4.8.1 20130909) #1 4CPU [jupiter.example.com]

Memory:      Total        Used        Free      Shared     Buffers      Cached
Mem:       8181908     8000632      181276           0       85472     2850872
Swap:     10481660        1576    10480084

Bootup: Mon Jul 28 09:54:13 2014    Load average: 1.61 0.85 0.74 2/904 25949

user  :       1:54:41.84  12.7%  page in :    2107312  disk 1:    52212r   20199w
nice  :       0:00:00.46   0.0%  page out:    1714461  disk 2:    19387r   10928w
system:       0:25:38.00   2.8%  page act:     466673  disk 3:      548r      10w
IOwait:       0:04:16.45   0.4%  page dea:     272297
hw irq:       0:00:00.42   0.0%  page flt:  105754526
sw irq:       0:01:26.48   0.1%  swap in :          0
idle  :      12:14:43.65  81.5%  swap out:        394
guest :       0:02:18.59   0.2%
uptime:       3:45:22.24         context :   99809844

irq  0:       121 timer                 irq 41:   3238224 hpet3
irq  8:         1 rtc0                  irq 42:   3251898 hpet4
irq  9:         0 acpi                  irq 43:   3156368 hpet5
irq 16:     14589 ehci_hcd:usb1         irq 45:         0 aerdrv, PCIe PME
irq 18:         0 i801_smbus            irq 46:         0 PCIe PME, pciehp
irq 19:    124861 ata_piix, ata_piix, f irq 47:         0 PCIe PME, pciehp
irq 22:   3742817 enp5s1                irq 48:         0 PCIe PME, pciehp
irq 23:    479248 ehci_hcd:usb2         irq 49:       387 snd_hda_intel
irq 40:   3216894 hpet2                 irq 50:   1088673 nvidia

要查看所有信息,请使用参数 -a。参数 -nN 每隔 N 秒更新一次信息。在这种情况下,可以按 Q 键停止程序。

默认情况下显示累积值。参数 -d 生成差异值。procinfo -dn5 显示过去五秒内已更改的值:

2.6.2 系统控制参数:/proc/sys/

系统控制参数用于在运行时修改 Linux 内核参数。它们位于 /proc/sys/ 中,可使用 sysctl 命令来查看和修改。要列出所有参数,请运行 sysctl -a。可以使用 sysctl PARAMETER_NAME 列出单个参数。

参数分为几类,可使用 sysctl CATEGORY 或通过列出相应目录的内容将其列出。下面列出了最重要的类别。需要安装软件包 kernel-source 才能获取更多阅读内容的链接。

sysctl dev (/proc/sys/dev/)

设备特定的信息。

sysctl fs (/proc/sys/fs/)

使用的文件句柄、配额和其他面向文件系统的参数。有关详细信息,请参见/usr/src/linux/Documentation/sysctl/fs.txt

sysctl kernel (/proc/sys/kernel/)

有关任务调度程序、系统共享内存和其他内核相关参数的信息。有关细节,请参见 /usr/src/linux/Documentation/sysctl/kernel.txt

sysctl net (/proc/sys/net/)

有关网桥和一般网络参数的信息(主要为 ipv4/ 子目录)。有关细节,请参见 /usr/src/linux/Documentation/sysctl/net.txt

sysctl vm (/proc/sys/vm/)

此路径中的项与有关虚拟内存、交换和缓存的信息相关。有关细节,请参见 /usr/src/linux/Documentation/sysctl/vm.txt

要设置或更改当前会话的参数,请使用命令 sysctl -w PARAMETER=VALUE。要永久更改某项设置,请在 /etc/sysctl.conf 中添加 PARAMETER=VALUE 行。

2.7 硬件信息

2.7.1 PCI 资源:lspci

注意
注意:访问 PCI 配置。

大多数操作系统需要 root 用户特权才能授予对计算机 PCI 配置的访问权限。

命令 lspci 列出 PCI 资源:

# lspci
00:00.0 Host bridge: Intel Corporation 82845G/GL[Brookdale-G]/GE/PE \
    DRAM Controller/Host-Hub Interface (rev 01)
00:01.0 PCI bridge: Intel Corporation 82845G/GL[Brookdale-G]/GE/PE \
    Host-to-AGP Bridge (rev 01)
00:1d.0 USB Controller: Intel Corporation 82801DB/DBL/DBM \
    (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 (rev 01)
00:1d.1 USB Controller: Intel Corporation 82801DB/DBL/DBM \
    (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 (rev 01)
00:1d.2 USB Controller: Intel Corporation 82801DB/DBL/DBM \
    (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 (rev 01)
00:1d.7 USB Controller: Intel Corporation 82801DB/DBM \
    (ICH4/ICH4-M) USB2 EHCI Controller (rev 01)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 81)
00:1f.0 ISA bridge: Intel Corporation 82801DB/DBL (ICH4/ICH4-L) \
    LPC Interface Bridge (rev 01)
00:1f.1 IDE interface: Intel Corporation 82801DB (ICH4) IDE \
    Controller (rev 01)
00:1f.3 SMBus: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) \
    SMBus Controller (rev 01)
00:1f.5 Multimedia audio controller: Intel Corporation 82801DB/DBL/DBM \
    (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller (rev 01)
01:00.0 VGA compatible controller: Matrox Graphics, Inc. G400/G450 (rev 85)
02:08.0 Ethernet controller: Intel Corporation 82801DB PRO/100 VE (LOM) \
    Ethernet Controller (rev 81)

使用 -v 可以生成更详细的列表:

# lspci -v
[...]
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet \
Controller (rev 02)
  Subsystem: Intel Corporation PRO/1000 MT Desktop Adapter
  Flags: bus master, 66MHz, medium devsel, latency 64, IRQ 19
  Memory at f0000000 (32-bit, non-prefetchable) [size=128K]
  I/O ports at d010 [size=8]
  Capabilities: [dc] Power Management version 2
  Capabilities: [e4] PCI-X non-bridge device
  Kernel driver in use: e1000
  Kernel modules: e1000

从文件 /usr/share/pci.ids 中获取有关设备名称解析的信息。此文件中未列出的 PCI ID 标有未知设备

参数 -vv 生成程序可查询的所有信息。要查看纯数字值,请使用参数 -n

2.7.2 USB 设备:lsusb

命令 lsusb 列出所有 USB 设备。使用选项 -v 可列显更详细的列表。从目录 /proc/bus/usb/ 读取详细信息。下面是在挂接集线器、内存条、硬盘和鼠标等 USB 设备情况下运行 lsusb 后的输出。

# lsusb
Bus 004 Device 007: ID 0ea0:2168 Ours Technology, Inc. Transcend JetFlash \
    2.0 / Astone USB Drive
Bus 004 Device 006: ID 04b4:6830 Cypress Semiconductor Corp. USB-2.0 IDE \
    Adapter
Bus 004 Device 005: ID 05e3:0605 Genesys Logic, Inc.
Bus 004 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 005: ID 046d:c012 Logitech, Inc. Optical Mouse
Bus 001 Device 001: ID 0000:0000

2.7.3 监控和微调热子系统:tmon

tmon 是能够帮助可视化、微调和测试复杂热子系统的工具。如果不使用任何参数启动,tmon 将以监控模式运行:

┌──────THERMAL ZONES(SENSORS)──────────────────────────────┐
│Thermal Zones:                 acpitz00                   │
│Trip Points:                   PC                         │
└──────────────────────────────────────────────────────────┘
┌─────────── COOLING DEVICES ──────────────────────────────┐
│ID  Cooling Dev   Cur    Max   Thermal Zone Binding       │
│00    Processor     0      3   ││││││││││││               │
│01    Processor     0      3   ││││││││││││               │
│02    Processor     0      3   ││││││││││││               │
│03    Processor     0      3   ││││││││││││               │
│04 intel_powerc    -1     50   ││││││││││││               │
└──────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────┐
│                         10        20        30        40 │
│acpitz 0:[  8][>>>>>>>>>P9                    C31         │
└──────────────────────────────────────────────────────────┘
┌────────────────── CONTROLS ──────────────────────────────┐
│PID gain: kp=0.36 ki=5.00 kd=0.19 Output 0.00             │
│Target Temp: 65.0C, Zone: 0, Control Device: None         │
└──────────────────────────────────────────────────────────┘

Ctrl-c - Quit   TAB - Tuning

有关如何解释数据、如何记录热数据,以及如何使用 tmon 测试和微调散热设备与传感器的详细信息,请参见手册页:man 8 tmon。默认情况下不会安装软件包 tmon

2.7.4 MCELog:计算机检查异常 (MCE)

注意
注意:可用性

此工具仅适用于 AMD64/Intel 64 系统。

发生硬件错误(包括 I/O、CPU 和内存错误)时,mcelog 软件包可记录和分析/转换计算机检查异常 (MCE)。此外,当发生缓存错误时,mcelog 还可以处理预测型坏页脱机和自动核心脱机。以前,此问题由每小时执行的 cron 作业管理。现在,硬件错误可由 mcelog 守护程序立即处理。

注意
注意:AMD 可缩放 MCA 支持

SUSE Linux Enterprise Server 支持 AMD 的可缩放计算机检查体系结构(可缩放 MCA)。可缩放 MCA 增强了 AMD Zen 处理器中的硬件错误报告。它扩展了 MCA Bank 中记录的信息,提升了错误处理能力并提高了可诊断性。

mcelog 可捕获 MCA 消息(rasdaemondmesg 也可捕获 MCA 消息)。有关详细信息,请参见《Processor Programming Reference (PPR) for AMD Family 17h Model 01h, Revision B1 Processors》的第 3.1 节“Machine Check Architecture”(https://developer.amd.com/wordpress/media/2017/11/54945_PPR_Family_17h_Models_00h-0Fh.pdf)。

mcelog 在 /etc/mcelog/mcelog.conf 中配置。有关配置选项的信息,请参见 man mceloghttps://mcelog.org/。以下示例仅显示了对默认文件的更改:

daemon = yes
filter = yes
filter-memory-errors = yes
no-syslog = yes
logfile = /var/log/mcelog
run-credentials-user = root
run-credentials-group = nobody
client-group = root
socket-path = /var/run/mcelog-client

默认未启用 mcelog 服务。可以通过 YaST 系统服务编辑器或命令行启用和启动该服务:

# systemctl enable mcelog
# systemctl start mcelog

2.7.5 AMD64/Intel 64:dmidecode:DMI 表解码器

dmidecode 可显示计算机的 DMI 表,其中包含硬件的序列号和 BIOS 修订版等信息。

# dmidecode
# dmidecode 2.12
SMBIOS 2.5 present.
27 structures occupying 1298 bytes.
Table at 0x000EB250.

Handle 0x0000, DMI type 4, 35 bytes
Processor Information
        Socket Designation: J1PR
        Type: Central Processor
        Family: Other
        Manufacturer: Intel(R) Corporation
        ID: E5 06 01 00 FF FB EB BF
        Version: Intel(R) Core(TM) i5 CPU         750  @ 2.67GHz
        Voltage: 1.1 V
        External Clock: 133 MHz
        Max Speed: 4000 MHz
        Current Speed: 2667 MHz
        Status: Populated, Enabled
        Upgrade: Other
        L1 Cache Handle: 0x0004
        L2 Cache Handle: 0x0003
        L3 Cache Handle: 0x0001
        Serial Number: Not Specified
        Asset Tag: Not Specified
        Part Number: Not Specified
[..]

2.7.6 POWER:列出硬件

lshw 可提取并显示计算机的硬件配置。

2.8 文件和文件系统

有关文件系统特定的信息,请参见存储管理指南

2.8.1 确定文件类型:file

命令 file 通过检查 /usr/share/misc/magic 来确定某个文件或文件列表的类型。

> file /usr/bin/file
/usr/bin/file: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), \
    for GNU/Linux 2.6.4, dynamically linked (uses shared libs), stripped

参数 -f LIST 指定要检查的一个或一系列文件名。-z 允许 file 在压缩文件的内部查找:

> file /usr/share/man/man1/file.1.gz
/usr/share/man/man1/file.1.gz: gzip compressed data, from Unix, max compression
> file -z /usr/share/man/man1/file.1.gz
/usr/share/man/man1/file.1.gz: troff or preprocessor input text \
    (gzip compressed data, from Unix, max compression)

参数 -i 输出 mime 类型的字符串而不是传统的说明。

> file -i /usr/share/misc/magic
/usr/share/misc/magic: text/plain charset=utf-8

2.8.2 文件系统及其用法:mountdfdu

命令 mount 会显示在哪个挂载点挂载哪个文件系统(设备和类型):

# mount
/dev/sda2 on / type ext4 (rw,acl,user_xattr)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
debugfs on /sys/kernel/debug type debugfs (rw)
devtmpfs on /dev type devtmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,mode=1777)
devpts on /dev/pts type devpts (rw,mode=0620,gid=5)
/dev/sda3 on /home type ext3 (rw)
securityfs on /sys/kernel/security type securityfs (rw)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
gvfs-fuse-daemon on /home/tux/.gvfs type fuse.gvfs-fuse-daemon \
(rw,nosuid,nodev,user=tux)

使用命令 df 可以获得有关文件系统全部使用情况的信息。参数 -h(或 --human-readable)将输出转换为普通用户可以理解的形式。

> df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              20G  5,9G   13G  32% /
devtmpfs              1,6G  236K  1,6G   1% /dev
tmpfs                 1,6G  668K  1,6G   1% /dev/shm
/dev/sda3             208G   40G  159G  20% /home

使用命令 du 可以显示给定目录及其子目录中所有文件的总大小。参数 -s 会隐藏详细信息的输出,只提供每个参数的总计。-h 再次将输出转换为直观易懂的格式:

> du -sh /opt
192M    /opt

2.8.3 有关 ELF 二进制文件的其他信息

使用 readelf 实用程序读取二进制文件的内容。这甚至可用于为其他硬件体系结构生成的 ELF 文件:

> readelf --file-header /bin/ls
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x402540
  Start of program headers:          64 (bytes into file)
  Start of section headers:          95720 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         9
  Size of section headers:           64 (bytes)
  Number of section headers:         32
  Section header string table index: 31

2.8.4 文件属性:stat

命令 stat 显示文件属性:

> stat /etc/profile
  File: `/etc/profile'
  Size: 9662            Blocks: 24         IO Block: 4096   regular file
Device: 802h/2050d      Inode: 132349      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-03-20 07:51:17.000000000 +0100
Modify: 2009-01-08 19:21:14.000000000 +0100
Change: 2009-03-18 12:55:31.000000000 +0100

参数 --file-system 生成指定文件所在的文件系统的属性细节:

> stat /etc/profile --file-system
  File: "/etc/profile"
    ID: d4fb76e70b4d1746 Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 2581445    Free: 1717327    Available: 1586197
Inodes: Total: 655776     Free: 490312

2.9 用户信息

2.9.1 访问文件的用户:fuser

它可用于确定当前哪些进程或用户正在访问特定的文件。例如,假设您要卸载 /mnt 中挂载的某个文件系统。umount 会返回“device is busy”(设备正忙)。然后可以使用 fuser 命令确定哪些进程正在访问该设备:

> fuser -v /mnt/*

                     USER        PID ACCESS COMMAND
/mnt/notes.txt       tux    26597 f....  less

在终止 less 进程之后(该进程在另一个终端上运行),即可成功卸载该文件系统。与 -k 选项结合使用时,fuser 还会停止正在访问文件的进程。

2.9.2 哪些用户在执行哪些操作:w

使用命令 w 可以确定谁已登录到系统,以及每个用户正在执行的操作。例如:

> w
 16:00:59 up 1 day,  2:41,  3 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
tux      :0       console          Wed13   ?xdm?   8:15   0.03s /usr/lib/gdm/gd
tux      console  :0               Wed13   26:41m  0.00s  0.03s /usr/lib/gdm/gd
tux      pts/0    :0               Wed13   20:11   0.10s  2.89s /usr/lib/gnome-

如果其他系统的任何用户已远程登录,则参数 -f 将显示这些用户已从其上建立连接的计算机。

2.10 时间和日期

2.10.1 使用 time 计量时间

使用 time 实用程序的命令来确定花费的时间。此实用程序有两个版本:内置 Bash 和程序 (/usr/bin/time)。

> time find . > /dev/null

real    0m4.051s1
user    0m0.042s2
sys     0m0.205s3

1

从命令启动到完成实际经过的时间。

2

times 系统调用报告的用户 CPU 时间。

3

times 系统调用报告的系统 CPU 时间。

/usr/bin/time 的输出要详细得多。建议结合使用 -v 开关运行此命令,以生成直观易懂的输出。

/usr/bin/time -v find . > /dev/null
        Command being timed: "find ."
        User time (seconds): 0.24
        System time (seconds): 2.08
        Percent of CPU this job got: 25%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:09.03
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 2516
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 1564
        Voluntary context switches: 36660
        Involuntary context switches: 496
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0

2.11 绘制数据图表:RRDtool

您的生活中存在大量可轻松即时测量的数据。例如,温度的变化,或者您计算机网络接口发送或接收的数据量。RRDtool 可帮助您存储这些数据,并以详细的可自定义图表呈现它们。

RRDtool 适用于大多数 Unix 平台和 Linux 发行套件。SUSE® Linux Enterprise Server 也随附有 RRDtool。请使用 YaST 或者

root 身份在命令行中输入 zypper install rrdtool 来安装此工具。

提示
提示:绑定

我们提供了 RRDtool 的 Perl、Python、Ruby 和 PHP 绑定,以便您能以偏好的脚本语言编写自己的监控脚本。

2.11.1 RRDtool 的工作原理

RRDtool 是循环复用数据库工具 (Round Robin Database tool) 的英文缩写。循环复用是操作恒量数据的一种方法。它采用循环缓冲区的原理,所读取的数据行既没有结尾,也没有开头。RRDtool 使用循环复用数据库来存储和读取其数据。

如前所述,RRDtool 用于处理即时变化的数据。典型的案例是传感器在恒定的时间段反复读取测量的数据(例如温度、速度等),然后以指定格式导出数据。此类数据十分适合通过 RRDtool 处理,它可以轻松处理并创建所需的输出。

有时无法定期自动获取数据。需要预处理这些数据的格式才能将其提供给 RRDtool,您甚至常常需要手动操作 RRDtool。

下面是 RRDtool 基本用法的简单示例。其中演示了常规 RRDtool 工作流程的所有三个重要阶段:创建数据库、更新测量值和查看输出。

2.11.2 实际应用示例

假设我们要收集并查看 Linux 系统中内存用量即时变化的信息。为使示例更生动,我们将以 4 秒为间隔,测量 40 秒时间段内的当前可用内存。启动再关闭三个通常会消耗大量系统内存的应用程序:Firefox 网页浏览器、Evolution 电子邮件客户端和 Eclipse 开发框架。

2.11.2.1 收集数据

RRDtool 经常用于测量网络流量并以直观方式呈现。在这种情况下,会使用简单网络管理协议 (SNMP)。此协议可以查询网络设备的内部计数器的相关值。确切来说,这些值将通过 RRDtool 来存储。有关 SNMP 的详细信息,请参见 http://www.net-snmp.org/

我们的情况有所不同 — 我们需要手动获取数据。一个助手脚本 free_mem.sh 会反复读取可用内存的当前状态,并将其写入标准输出。

> cat free_mem.sh
INTERVAL=4
for steps in {1..10}
do
    DATE=`date +%s`
    FREEMEM=`free -b | grep "Mem" | awk '{ print $4 }'`
    sleep $INTERVAL
    echo "rrdtool update free_mem.rrd $DATE:$FREEMEM"
done
  • 时间间隔设置为 4 秒,这通过 sleep 命令来实施。

  • RRDtool 接受采用特殊格式的时间信息 - 所谓的 Unix 时间。此时间定义为自 1970 年 1 月 1 日午夜 (UTC) 开始经过的秒数。例如,1272907114 表示 2010-05-03 17:18:34。

  • 可用内存信息是使用 free -b 以字节为单位报告的。将优先提供基本单位(字节)而不是倍数单位(例如 KB)。

  • 带有 echo ... 命令的行包含数据库文件 (free_mem.rrd) 的未来名称,并共同创建了用于更新 RRDtool 值的命令行。

运行 free_mem.sh 后,您将看到如下所示的输出:

> sh free_mem.sh
rrdtool update free_mem.rrd 1272974835:1182994432
rrdtool update free_mem.rrd 1272974839:1162817536
rrdtool update free_mem.rrd 1272974843:1096269824
rrdtool update free_mem.rrd 1272974847:1034219520
rrdtool update free_mem.rrd 1272974851:909438976
rrdtool update free_mem.rrd 1272974855:832454656
rrdtool update free_mem.rrd 1272974859:829120512
rrdtool update free_mem.rrd 1272974863:1180377088
rrdtool update free_mem.rrd 1272974867:1179369472
rrdtool update free_mem.rrd 1272974871:1181806592

可以方便地使用

sh free_mem.sh > free_mem_updates.log

将命令输出重定向到某个文件以简化此命令的未来执行。

2.11.2.2 创建数据库

使用以下命令为本示例创建初始的循环复用数据库:

> rrdtool create free_mem.rrd --start 1272974834 --step=4 \
DS:memory:GAUGE:600:U:U RRA:AVERAGE:0.5:1:24
要点
  • 此命令会创建名为 free_mem.rrd 的文件,用于在循环复用数据库中存储测量值。

  • --start 选项指定将第一个值添加到数据库的时间(采用 Unix 时间)。在本示例中,此值比 free_mem.sh 输出的第一个时间值 (1272974835) 小 1。

  • --step 指定向数据库提供测量数据的时间间隔(以秒为单位)。

  • DS:memory:GAUGE:600:U:U 部分用于引入数据库的新数据源。此数据源名为 memory,类型为 gauge,两次更新之间的最大间隔为 600 秒,测量范围的最小最大值未知 (U)。

  • RRA:AVERAGE:0.5:1:24 会创建循环复用存档 (RRA),其中存储的数据是通过用于计算数据点平均值合并函数 (CF) 处理的。合并函数的 3 个参数已追加到行尾。

如果未显示错误消息,则当前目录中已创建了 free_mem.rrd 数据库:

> ls -l free_mem.rrd
-rw-r--r-- 1 tux users 776 May  5 12:50 free_mem.rrd

2.11.2.3 更新数据库值

创建数据库后,需在其中填充测量数据。在第 2.11.2.1 节 “收集数据”中,我们已准备好一个包含 rrdtool update 命令的 free_mem_updates.log 文件。这些命令将为我们执行数据库值的更新。

> sh free_mem_updates.log; ls -l free_mem.rrd
-rw-r--r--  1 tux users  776 May  5 13:29 free_mem.rrd

可以看到,即使是在更新数据后,free_mem.rrd 的大小仍保持不变。

2.11.2.4 查看测量值

我们已测量了值,创建了数据库,并在其中存储了测量值。现在我们可以操作该数据库,并检索或查看其值。

要检索数据库中的所有值,请在命令行上输入以下命令:

> rrdtool fetch free_mem.rrd AVERAGE --start 1272974830 \
--end 1272974871
          memory
1272974832: nan
1272974836: 1.1729059840e+09
1272974840: 1.1461806080e+09
1272974844: 1.0807572480e+09
1272974848: 1.0030243840e+09
1272974852: 8.9019289600e+08
1272974856: 8.3162112000e+08
1272974860: 9.1693465600e+08
1272974864: 1.1801251840e+09
1272974868: 1.1799787520e+09
1272974872: nan
要点
  • AVERAGE 会从数据库提取平均值点,因为只通过 AVERAGE 处理定义了一个数据源(第 2.11.2.2 节 “创建数据库”),没有其他函数可用。

  • 输出的第一行列显第 2.11.2.2 节 “创建数据库”中定义的数据源的名称。

  • 左侧结果列表示各个时间点,右侧结果列以科学记数法表示对应的测量平均值。

  • 最后一行中的 nan 表示不是数字

现在将绘制一个图表来表示数据库中存储的值:

> rrdtool graph free_mem.png \
--start 1272974830 \
--end 1272974871 \
--step=4 \
DEF:free_memory=free_mem.rrd:memory:AVERAGE \
LINE2:free_memory#FF0000 \
--vertical-label "GB" \
--title "Free System Memory in Time" \
--zoom 1.5 \
--x-grid SECOND:1:SECOND:4:SECOND:10:0:%X
要点
  • free_mem.png 是要创建的图表的文件名。

  • --start--end 限制要绘制的图表的时间范围。

  • --step 指定图表的时间解析度(以秒为单位)。

  • DEF:... 部分是名为 free_memory 的数据定义。其数据会从 free_mem.rrd 数据库读取,其数据源名为 memory。将计算平均值点,因为第 2.11.2.2 节 “创建数据库”中未定义其他值点。

  • LINE... 部分指定要绘制到图表中的线条的属性。其宽度为 2 像素,数据来自 free_memory 定义,颜色为红色。

  • --vertical-label 设置要在 y 轴上列显的标签,--title 设置整个图表的主标签。

  • --zoom 指定图表的缩放系数。此值必须大于零。

  • --x-grid 指定如何在图表中绘制网格线及其标签。本示例每隔一秒绘制一次网格线,每隔 4 秒绘制一次主网格线。每隔 10 秒将标签绘制在主网格线下。

使用 RRDtool 创建的示例图表
图 2.1︰ 使用 RRDtool 创建的示例图表

2.11.3 更多信息

RRDtool 是一个复杂的工具,它附带了许多子命令和命令行选项。其中一些命令和选项很容易理解,但要使其生成所需的结果并根据您的喜好对其进行微调,可能还要花费许多功夫。

请参考 RRDtool 的手册页 (man 1 rrdtool),但其中只提供了基本信息,除此之外,您还应该查看 RRDtool home pagerrdtool 命令及其所有子命令有详细的documentation可供参考。此外,还有几篇tutorials可帮助您理解常用的 RRDtool 工作流程。

如果您对监控网络流量感兴趣,请查看 MRTG (Multi Router Traffic Grapher)。MRTG 可以绘制许多网络设备的活动图表。它可以使用 RRDtool。