> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/man1/systat.1.md).

# systat(1)

`systat` — 显示系统统计信息

## 名称

`systat`

## 概要

`systat [-display] [display-commands] [refresh-interval]`

## 描述

`systat` 实用程序使用 curses 屏幕显示库 ncurses(3) 以面向屏幕的方式显示各种系统统计信息。

`systat` 运行时，屏幕通常分为两个窗口（vmstat 显示是例外，它使用整个屏幕）。上方窗口描绘当前系统负载平均值。下方窗口中显示的信息可能因用户命令而异。屏幕最后一行保留用于用户输入和错误消息。

默认情况下，`systat` 在下方窗口显示占用处理器时间百分比最大的进程。其他显示包括交换空间使用情况、磁盘 I/O 统计信息（类似于 [iostat(8)](/man8/iostat.8.md)）、虚拟内存统计信息（类似于 [vmstat(8)](/man8/vmstat.8.md)）、TCP/IP 统计信息以及网络连接（类似于 [netstat(1)](/man1/netstat.1.md)）。

输入在两个不同层次上解释。一个“global”命令解释器处理所有键盘输入。如果此命令解释器无法识别命令，输入行将传递给每显示命令解释器。这允许每个显示拥有某些特定于该显示的命令。

命令行选项：

```sh
systat -ifstat -match bge0,em1 -pps
```

```sh
systat -iostat -numbers -- 2.1
```

**`-`** `display` `-` 标志期望 `display` 为以下之一：`icmp`、`icmp6`、`ifstat`、`iolat`、`iostat`、`ip`、`ip6`、`netstat`、`pigs`、`sctp`、`swap`、`tcp`、`vmstat` 或 `zarc`。这些显示也可以交互式请求（不带“`-`”），下面有详细描述。

**`refresh-interval`** `refresh-value` 指定屏幕刷新时间间隔（以秒为单位）。时间间隔可以是小数。

**`display-commands`** 特定于此显示的命令列表。这些命令也可以交互式输入，下面针对每个显示分别描述。如果命令需要参数，可以作为单独的命令行参数指定。命令行参数 `--` 将结束显示命令。例如：这将显示名为 bge0 和 em1 的网络接口的每秒数据包统计信息。这将以数字格式显示所有 IO 统计信息，信息每 2.1 秒刷新一次。

某些字符会触发 `systat` 的立即操作，它们是：

**`^L`** 刷新屏幕。

**`^G`** 打印下方窗口中当前显示的“display”名称和刷新间隔。

**`:`** 将光标移到命令行，并将输入行解释为命令。输入命令时可以使用当前的字符擦除、单词擦除和行删除字符。

以下命令由“global”命令解释器解释。

**`help`** 在命令行上打印可用显示的名称。

**`load`** 在命令行上打印过去 1、5 和 15 分钟的负载平均值。

**`stop`** 停止刷新屏幕。

**\[`start`] \[`number`]** 开始（继续）刷新屏幕。如果提供第二个数字参数，则将其解释为刷新间隔（以秒为单位）。仅提供数字将把刷新间隔设置为此值。

**`quit`** 退出 `systat`。（可缩写为 `q`。）

可用显示如下：

**`pigs`** 在下方窗口显示驻留在主内存中且占用处理器最大份额的进程（默认显示）。当用户进程调度的处理器时间不足 100% 时，剩余时间记入“idle”进程。

**`icmp`** 在下方窗口显示 Internet Control Message Protocol（“ICMP”）接收和发送消息的统计信息。屏幕左半部分显示有关接收数据包的信息，右半部分显示有关发送数据包的信息。`icmp` 显示理解两个命令：`mode` 和 `reset`。`mode` 命令用于从四种显示模式中选择一种，作为其参数给出：

**`rate`** ：以每秒数据包数显示每个值的变化率（默认）

**`delta`** ：以每个刷新间隔的数据包数显示每个值的变化率

**`since`** ：显示自上次重置显示以来每个值的总变化量

**`absolute`** ：显示每个统计信息的绝对值

`reset` 命令重置 `since` 模式的基线。不带参数的 `mode` 命令将在命令行显示当前模式。

**`icmp6`** 此显示类似于 `icmp` 显示，但显示 IPv6 ICMP 的统计信息。

**`ip`** 与 `icmp` 显示基本相同，但它显示 IP 和 UDP 统计信息。

**`ip6`** 类似于 `ip` 显示，但显示 IPv6 统计信息。不显示 UDP 统计信息。

**`sctp`** 类似于 `icmp`，但显示 SCTP 统计信息。

**`tcp`** 类似于 `icmp`，但显示 TCP 统计信息。

**`iolat`** 显示描述由 `CAM_IOSCHED_DYNAMIC` 选项计算的 I/O 操作硬件延迟的统计信息。运行内核的内核配置文件中必须包含此选项，此显示才能工作。所有设备都会显示，因为目前无法过滤它们。I/O 延迟显示的统计信息是轮询间隔内有足够数据可计算的百分位数。如果无法估计某个值，则显示“-”。如果在轮询间隔内发生超过 2、10、100 或 1000 次操作，则计算 P50（也称为中位数）、P90、P99 和 P99.9 值。延迟是硬件延迟值，不包括任何软件排队时间。延迟基于 CAM I/O 调度器计算的直方图数据估算，仅对前两位或三位有效数字准确。延迟的显示根据延迟的规模变化，以反映估计的精度并适应可用的屏幕空间。所有延迟均以毫秒为单位报告。启用颜色时：

* 低于中等延迟阈值的值以绿色显示。
* 介于最小延迟和高延迟阈值之间的值以洋红色显示。
* 高于高延迟阈值的值以红色显示。

禁用颜色时，始终使用默认的前景色和背景色。以下命令特定于 `iolat` 显示；可提供最小无歧义前缀。

**`color`** 切换显示中颜色的使用。默认开启。

**`hi=XXX`** 将高延迟阈值设置为 XXX 毫秒。

**`med=XXX`** 将中等延迟阈值设置为 XXX 毫秒。

**`read`** 切换关于读操作的统计信息显示。默认开启。

**`write`** 切换关于写操作的统计信息显示。默认开启。

**`trim`** 切换关于 trim 操作的统计信息显示。默认开启。

**`iostat`** 在下方窗口显示有关处理器使用和磁盘吞吐量的统计信息。处理器使用统计信息以条形图显示，包括在用户模式（“user”）、运行低优先级进程的用户模式（“nice”）、系统模式（“system”）、中断模式（“interrupt”）和空闲（“idle”）中执行的时间量。磁盘吞吐量统计信息为每个驱动器显示每秒兆字节数、每秒平均磁盘事务数和每事务平均千字节数。此信息可以条形图或向下滚动的数字行显示。默认显示条形图。以下命令特定于 `iostat` 显示；可提供最小无歧义前缀。

**`numbers`** 以数字形式显示磁盘 I/O 统计信息。值以向下滚动的数字列显示。

**`bars`** 以条形图形式显示磁盘 I/O 统计信息（默认）。

**`kbpt`** 切换每事务千字节数的显示。（默认不显示每事务千字节数。）

**`swap`** 显示内核编译的所有交换区域上的交换空间使用情况、已换出的进程以及磁盘活动摘要的信息。首先显示交换区域的名称、大小和使用百分比。`Used` 列指示到目前为止使用的总块数；图形显示每个分区上空间使用的百分比。如果使用多个交换分区，还会显示总计行。内核已知但未使用的区域显示为不可用。在交换空间统计信息下方，进程按交换区域使用量从高到低排列。每个进程显示 Pid、用户名、部分命令行、以字节为单位的交换空间总使用量、进程大小，以及每进程交换使用百分比和每系统交换空间百分比。左下角是磁盘使用情况显示。它报告每事务的千字节数、每秒事务数、每秒兆字节数以及磁盘繁忙时间百分比（在显示刷新周期内平均，默认为五秒）。系统对几乎每个存储设备都保留统计信息。通常最多显示七个设备。默认显示的设备是内核设备列表中的前几个设备。有关 devstat 系统的详情，参见 devstat(3) 和 [devstat(9)](/man9/devstat.9.md)。

**`vmstat`** 接管整个显示，并显示与虚拟内存使用、进程调度、设备中断、系统名称转换缓存、磁盘 I/O 等相关的（相当密集的）统计信息概要。屏幕左上象限显示登录用户数和过去一、五和十五分钟间隔的负载平均值。此行下方是内存利用率统计信息。表的第一行仅报告活动进程（即在前二十秒内运行过的进程）的内存使用情况。第二行报告所有进程的内存使用情况。第一列报告进程占用的物理页的千字节数。第二列报告专用于只读文本页的物理页的千字节数。第三和第四列报告虚拟页的相同两个数字，即如果所有进程都拥有所有页面所需的页面千字节数。最后一列显示空闲列表上物理页的千字节数。内存显示下方是平均线程数列表（在过去刷新间隔内），包括可运行（`r`）、页面等待（`p`）、非分页磁盘等待（`d`）、睡眠（`s`）和已换出但希望运行（`w`）。该行还显示上下文切换（`Csw`）、陷阱（`Trp`；包括页面错误）、系统调用（`Sys`）、中断（`Int`）、网络软件中断（`Sof`）和页面错误（`Flt`）的平均数。进程队列长度列表下方是数字列表和条形图，显示系统（显示为 `=`）、中断（显示为 `+`）、用户（显示为 `>`）、nice（显示为 `-`）和空闲时间（显示为 ）的量。进程显示下方是名称转换统计信息。它列出前一间隔内转换的名称数、由系统范围名称转换缓存处理的转换数和百分比，以及由每进程名称转换缓存处理的转换数和百分比。名称转换显示右侧的行显示缓冲区缓存中的脏缓冲区数（`dtbuf`）、vnode 缓存的期望最大大小（`desvn`）、实际分配的 vnode 数（`numvn`）和已分配但空闲的 vnode 数（`frevn`）。左下角是磁盘使用情况显示。它报告每事务的千字节数、每秒事务数、每秒兆字节数以及磁盘繁忙时间百分比（在显示刷新周期内平均，默认为五秒）。系统对几乎每个存储设备都保留统计信息。通常最多显示七个设备。默认显示的设备是内核设备列表中的前几个设备。有关 devstat 系统的详情，参见 devstat(3) 和 [devstat(9)](/man9/devstat.9.md)。右上象限日期下方是分页和交换活动的统计信息。前两列报告由于页面错误和分页守护进程在过去刷新间隔内每秒平均换入和换出的页面数。第三和第四列报告由于调度程序启动的交换请求在过去刷新间隔内每秒平均换入和换出的页面数。显示的第一行报告过去刷新间隔内每秒平均磁盘传输数；第二行报告过去刷新间隔内每秒平均传输的页面数。分页统计信息下方是关于虚拟内存系统的一列行。前几行以每秒页数（在采样间隔内平均）为单位描述（除下文注明外）：写时复制页（`cow`）、按需零填充页（`zfod`）、按需最优零填充页（`ozfod`）、（平均）ozfod / zfod 比率百分比（`%ozfod`）、页面守护进程释放的页（`daefr`）、退出进程释放的页（`prcfr`）、释放的总页数（`totfr`）、从空闲列表重新激活的页（`react`）、页面守护进程每秒唤醒的平均次数（`pdwak`）、页面守护进程分析的页（`pdpgs`）和传输中阻塞的页面错误（`intrn`）。注意 `%ozfod` 和 `pdwak` 的单位特殊。接下来几行以千字节内存量描述：固定页（`wire`）、活动页（`act`）、非活动页（`inact`）、排队待清理的脏页（`laund`）和空闲页（`free`）。注意显示的值是当前瞬态值，不是平均值。此列底部一行显示映射到缓冲区缓存的虚拟内存量（千字节）（`buf`）。此统计信息无用。它仅作为相应有用统计信息（用于缓存磁盘的实际内存量）的占位符。后者的最重要组成部分（vm 系统用于缓存磁盘的实际内存量）不可用，但在某些系统负载下可以从 `inact` 量推测。显示右侧是从上到下的系统中断细分。列表顶部是时间间隔内每秒的总中断数。该列的其余部分按设备逐个细分总数。仅显示自启动以来至少中断过一次的设备。以下命令特定于 `vmstat` 显示；可提供最小无歧义前缀。

**`boot`** 显示自系统启动以来的累计统计信息。

**`run`** 显示从给定此命令之时起的统计信息累计运行总数。

**`time`** 显示刷新间隔内平均的统计信息（默认）。

**`zero`** 将运行统计信息重置为零。

**`zarc`** 显示 arc 缓存使用情况和命中/未命中统计信息。

**`netstat`** 在下方窗口显示网络连接。默认情况下，不显示等待请求的网络服务器。每个地址以“host.port”格式显示，尽可能以符号方式显示。可以以数字方式显示地址，将显示限制为一组端口、主机和/或协议（可提供最小无歧义前缀）：

**`all`** 切换等待请求的服务器进程的显示（这相当于 [netstat(1)](/man1/netstat.1.md) 的 `-a` 标志）。

**`numbers`** 以数字方式显示网络地址。

**`names`** 以符号方式显示网络地址。

**`proto`** `protocol` 仅显示使用指定 `protocol` 的网络连接。支持的协议有“tcp”、“udp”和“all”。

**`ignore`** \[`items`] 不显示与指定主机或端口关联的连接信息。主机和端口可以按名称（“vangogh”、“ftp”）或数字指定。主机地址使用 Internet 点分表示法（“128.32.0.9”）。可以通过用空格分隔在单个命令中指定多个项。

**`display`** \[`items`] 显示与指定主机或端口关联的连接信息。与 `ignore` 一样，\[`items`] 可以是名称或数字。

**`show`** \[`ports|hosts`] 在命令行上显示当前选定的协议、主机和端口。被忽略的主机和端口前缀为 `!`。如果将 `ports` 或 `hosts` 作为 `show` 的参数，则仅显示请求的信息。

**`reset`** 将端口、主机和协议匹配机制重置为默认值（任意协议、端口或主机）。

**`ifstat`** 显示系统中活动接口的网络流量。空闲接口在接收到流量之前不会显示。对于每个显示的接口，显示传入和传出流量的当前、峰值和总统计信息。默认情况下，`ifstat` 显示会自动缩放使用的单位，使其采用人类可读格式。当前和峰值流量列使用的缩放单位可以通过 `scale` 命令更改。

**`scale`** \[`units`] 修改用于显示所有接口当前和峰值流量的比例。识别以下单位：kbit、kbyte、mbit、mbyte、gbit、gbyte 和 auto。

**`pps`** 以每秒数据包数而非每秒字节/位数显示统计信息。再次调用 `pps` 会关闭此模式。

**`match`** \[`patterns`] 仅显示与作为参数提供的模式匹配的接口。模式应为以空格或逗号分隔的 shell 语法。如果调用此命令时不带参数，则显示所有接口。例如：

```sh
match em0, bge1
```

这将显示 em0 和 bge1 接口。

```sh
match em*, bge*, lo0
```

这将显示所有 `em` 接口、所有 `bge` 接口和环回接口。

切换显示之间的命令可以缩写为最小无歧义前缀；例如，“io”表示“iostat”。当屏幕大小不足以显示时，可能会丢弃某些信息。例如，在有 10 个驱动器的机器上，`iostat` 条形图在 24 行终端上仅显示 3 个驱动器。当条形图溢出分配的屏幕空间时，会被截断，实际值打印在条形图“上方”。

以下命令对每个显示磁盘驱动器信息的显示通用。如果系统配置的驱动器多于屏幕上通常可显示的数量，这些命令用于选择要报告的一组驱动器。

**`ignore`** \[`drives`] 不显示有关指定驱动器的信息。可以指定多个驱动器，以空格分隔。

**`display`** \[`drives`] 显示有关指定驱动器的信息。可以指定多个驱动器，以空格分隔。

**`only`** \[`drives`] 仅显示指定驱动器。可以指定多个驱动器，以空格分隔。

**`drives`** 显示可用设备列表。

**`match`** `type`,`if`,`pass` \[| `...`] 显示与给定模式匹配的设备。基本匹配表达式与 [iostat(8)](/man8/iostat.8.md) 中使用的相同，但有一个区别：用户不指定多个 `-t` 参数然后进行 OR 运算，而是指定多个由管道符（`|`）连接的匹配表达式。每个匹配表达式中以逗号分隔的参数进行 AND 运算，然后以管道符分隔的匹配表达式进行 OR 运算。如果有显示空间，则显示与组合表达式匹配的任何设备。例如：

```sh
match da,scsi | cd,ide
```

这将显示所有 SCSI Direct Access 设备和所有 IDE CDROM 设备。

```sh
match da | sa | cd,pass
```

这将显示所有 Direct Access 设备、所有 Sequential Access 设备以及所有提供 CDROM 驱动器访问的直通设备。

## 文件

**`/boot/kernel/kernel`** 用于名称列表。

**`/dev/kmem`** 用于主内存中的信息。

**`/etc/hosts`** 用于主机名。

**`/etc/networks`** 用于网络名。

**`/etc/services`** 用于端口名。

## 参见

[netstat(1)](/man1/netstat.1.md), kvm(3), [icmp(4)](/man4/icmp.4.md), [icmp6(4)](/man4/icmp6.4.md), [ip(4)](/man4/ip.4.md), [ip6(4)](/man4/ip6.4.md), [tcp(4)](/man4/tcp.4.md), [udp(4)](/man4/udp.4.md), gstat(8), [iostat(8)](/man8/iostat.8.md), [vmstat(8)](/man8/vmstat.8.md)

## 历史

`systat` 程序出现在 4.3BSD 中。`icmp`、`ip` 和 `tcp` 显示出现在 FreeBSD 3.0 中；为 ICMP、IP、TCP 和 UDP 统计信息设置不同显示模式的概念取自 Silicon Graphics IRIX 系统中 [netstat(1)](/man1/netstat.1.md) 的 `-C` 选项。

## 缺陷

某些显示假定每行至少 80 个字符。Ifstat 不检测新接口。`vmstat` 显示看起来不合适，因为确实如此（它作为单独的显示添加，而不是作为新程序创建）。`iolat` 命令不实现包括过滤在内的通用设备命令，因为它不使用 devstat(3) 机制获取统计信息。
