sa 是 System Activity 的缩写,它是一个用于分析 acct 记录文件的命令。acct 是 Linux 系统中的一个可选功能,用于记录系统中每个进程的执行信息(称为“记账”或“审计”),当这个功能开启时,系统会详细记录每个进程的启动时间、结束时间、用户、CPU 使用时间、磁盘 I/O 等信息,这些信息会保存在特定的日志文件中。

sa 命令就是用来汇总和解读这些日志文件的工具,从而让你了解系统资源的使用情况,例如哪些用户、哪些命令消耗了最多的 CPU 时间。
核心功能与用途
sa 命令主要用于:
- 分析命令资源消耗:统计每个命令或每个用户所占用的 CPU 时间、磁盘 I/O 等。
- 资源审计与计费:在多用户环境中,系统管理员可以根据
sa的报告来统计不同用户或部门的资源使用情况,用于成本分配或资源限制。 - 性能分析:通过分析历史数据,找出系统中资源消耗异常的命令,进行优化。
前提条件:启用进程记账功能
sa 命令的数据来源是 acct 子系统,默认情况下,大多数 Linux 发行版是关闭这个功能的,因为它会产生额外的系统开销,要使用 sa,你需要先启用它。
如何启用进程记账?
-
安装
acct包: 在基于 Debian/Ubuntu 的系统上:
(图片来源网络,侵删)sudo apt-get update sudo apt-get install acct
在基于 RHEL/CentOS/Fedora 的系统上:
sudo yum install psacct
(注意:包名可能是
psacct,但核心功能是一样的)。 -
启动
acct服务: 启用并启动acct服务,使其开机自启。# 对于使用 systemd 的系统 (Ubuntu 16.04+, CentOS 7+, Debian 8+) sudo systemctl enable --now acct.service # 对于较旧的系统 sudo service acct start
-
验证记账功能: 启动后,系统会自动在
/var/log/account/目录下创建日志文件(通常是pacct或wtmp),或者在某些系统上直接在/var/log/下,你可以用lastcomm命令来查看记录:
(图片来源网络,侵删)lastcomm
如果你看到类似
bash pts/0的输出,说明记账功能已经开启。
sa 命令的基本用法
sa 命令的基本格式是 sa [选项] [文件名]。
- 文件名:默认情况下,
sa会读取/var/log/account/pacct文件,你也可以指定其他的记账文件。 - 选项:
sa提供了丰富的选项来控制输出格式和统计内容。
常用选项详解
以下是 sa 命令最常用的一些选项:
| 选项 | 全称 | 描述 |
|---|---|---|
-a |
--all |
打印所有命令的统计信息,包括那些从未调用过、CPU 时间为 0 的命令。 |
-b |
--brief |
以简要格式输出,只显示命令名、总调用次数、总 Kbytes、总 CPU 时间和真实 CPU 时间。 |
-c |
--cmdsv |
按命令名排序(默认排序方式)。 |
-u |
--user |
按用户名排序,而不是按命令名。 |
-v |
--verbose |
以详细格式输出,显示每个命令的平均 CPU 时间、平均内存使用量等更多信息。 |
-k |
--kbytes |
以 KB 为单位显示磁盘 I/O 量(默认是块数)。 |
-m |
--minutes |
以分钟为单位显示 CPU 时间,而不是以秒为单位。 |
-t |
--notime |
在输出中不显示 CPU 时间。 |
-A |
--list-all |
列出所有命令的统计信息,包括系统调用。 |
-j |
--date |
显示命令的启动日期和时间。 |
-P |
--percents |
显示每个命令占总 CPU 时间的百分比。 |
-x |
--system |
打印系统命令(如内核线程)的统计信息。 |
实用示例
假设记账功能已经开启,并且系统运行了一段时间。
示例 1:查看所有命令的简要统计
这是最常用的用法,可以快速了解哪些命令消耗了最多的资源。
sa -b
可能的输出:
cmd kbytes cpu re mem disk chars faults core
bash 12345 10.5 8.2 1024 0 0 0 0
python 56789 45.2 40.1 8192 10240 0 0 0
gcc 234567 120.3 110.5 40960 0 0 0 0
<others> ... ... ... ... ... ... ... ...
total 1234567 999.9 888.8 ... ... ... ... ...
列解释:
cmd: 命令名kbytes: 使用的总 KB 数cpu: 总 CPU 时间(秒)re: “有效”或“真实”的 CPU 时间(秒)mem: 平均内存使用量(KB)disk: 总磁盘 I/O(块数)chars: 传输的字符数faults: 页错误次数core: 转储的内存大小
示例 2:按用户名排序,查看资源消耗
想知道哪个用户是“资源大户”?使用 -u 选项。
sa -u
可能的输出:
login kbytes cpu re mem disk chars faults core
user1 500000 300.2 280.1 20480 0 0 0 0
user2 300000 150.5 140.2 10240 0 0 0 0
root 50000 50.1 45.0 4096 0 0 0 0
示例 3:查看详细报告
使用 -v 选项可以获得更丰富的信息,包括平均值等。
sa -v
可能的输出:
cmd kbytes cpu re mem disk chars faults core avio rss
bash 12345 10.5 8.2 1024 0 0 0 0 0 1024
python 56789 45.2 40.1 8192 10240 0 0 0 10 8192
gcc 234567 120.3 110.5 40960 0 0 0 0 0 40960
avio (平均 I/O 操作数) 和 rss (平均驻留集大小) 是新增的列。
示例 4:显示每个命令的 CPU 使用百分比
使用 -P 选项可以清晰地看到哪个命令是 CPU 的主要消耗者。
sa -P
可能的输出:
cmd %cpu %re %mem
gcc 30.1 32.5 45.2
python 25.5 28.1 30.1
bash 5.2 4.8 2.5
示例 5:分析特定的记账文件
如果你有旧的或备份的记账文件,可以指定文件名进行分析。
sa -b /var/log/account/pacct.20251001
相关命令
sa 命令通常与一组“记账”工具一起使用:
lastcomm:显示已执行命令的记录列表,它读取sa的数据源文件,按时间倒序显示每个进程的详细信息(命令、用户、终端、CPU 时间等),非常适合调试单个事件。lastcomm | grep python
ac:按用户或日期登录时间报告,它读取/var/log/wtmp文件。ac -p # 按用户显示总连接时间
dump-acct/dump-utmp**:用于以可读的格式转储pacct和wtmp文件的内容。
| 特性 | 描述 |
|---|---|
| 命令名称 | sa |
| 所属包 | acct (Debian/Ubuntu) 或 psacct (RHEL/CentOS) |
| 主要功能 | 汇总分析进程记账 (pacct) 文件,统计命令和用户的资源使用情况。 |
| 核心用途 | 资源审计、性能分析、多用户环境下的计费。 |
| 必备前提 | 必须先启用系统的进程记账功能。 |
| 常用搭档 | lastcomm (查看原始记录), ac (统计登录时间)。 |
sa 是一个非常强大的系统分析工具,尤其对于系统管理员来说,掌握它可以让你更深入地了解系统的运行状况和资源瓶颈。
