CentOS系统下想要追踪每个用户、每个进程到底消耗了多少CPU和内存资源,最直接有效的方案就是启用psacct(Process Accounting)进程记账系统。psacct是一套内核级的进程活动记录工具,它会在每个进程退出时自动写入一条记录,包含进程名、运行时间、CPU使用率、内存占用、I/O操作次数等关键数据。在CentOS 7/8环境下,你需要安装psacct或acct软件包,启动acct服务,然后通过sa、lastcomm、accton等命令来查看统计结果。这套工具特别适合多用户服务器环境,能帮你快速定位资源滥用者、分析系统负载来源、做安全审计。
很多运维人员只会用top、htop看实时进程,但这些工具只能看到"当下"的状态,历史数据一概没有。psacct解决的就是这个痛点——它像一个黑匣子,把所有进程从生到死的完整生命周期都记录下来。下面我会从安装配置、核心命令、实战场景、性能优化四个维度把这套系统讲透。
一、psacct在CentOS上的安装与基础配置CentOS 7和CentOS 8/Stream的包名略有不同。CentOS 7上安装的是psacct包,CentOS 8上对应的是acct包,但功能完全一致。
# CentOS 7 安装 yum install -y psacct # CentOS 8/Stream 安装 dnf install -y acct
安装完成后,必须启动acct服务并设置开机自启,否则记账功能不会生效:
systemctl start acct systemctl enable acct
启动后,系统会在/var/log/sa/目录下开始生成saXX文件(XX是当月日期),同时/var/log/account/pacct(或/var/log/account/acct)就是主记账文件。你可以用accton命令手动指定记账文件路径,默认就是/var/log/account/pacct。
# 查看当前记账文件状态 accton /var/log/account/pacct # 如果想关闭记账 accton off
需要特别注意一点:psacct依赖内核的进程记账功能,如果你的内核没有编译CONFIG_BSD_PROCESS_ACCT选项,装了也没用。不过CentOS官方内核默认都带了这个选项,一般不需要担心。如果真遇到问题,用下面命令确认:
grep CONFIG_BSD_PROCESS_ACCT /boot/config-$(uname -r)
输出应该是CONFIG_BSD_PROCESS_ACCT=y。如果是=n,那就需要重新编译内核或者换一个带该选项的内核。
二、核心命令详解:sa、lastcomm、acpsacct工具包提供了几个核心命令,各有各的用途,下面逐个讲清楚。
1. sa命令——按用户/命令汇总统计
sa是最常用的统计命令,它会读取记账文件并按用户名或命令名汇总输出。默认不加参数时,按用户名汇总:
sa
输出格式是:用户名、进程数、CPU总时间(分钟)、内存总时间(分钟)、平均CPU时间、平均内存时间。如果你想按命令名统计,加-m参数:
sa -m
想看某个特定用户的统计,比如root:
sa -u root
想按CPU时间排序看谁最耗资源:
sa --sort-cpu
sa还支持按天统计,比如看今天的数据:
sa -d
看昨天的:
sa -d 1
2. lastcomm命令——查看具体进程记录
lastcomm可以列出所有已退出进程的详细记录,包括进程名、用户、终端、运行时长、CPU时间、退出状态等。直接运行:
lastcomm
输出量可能非常大,建议配合grep过滤。比如查看某个用户执行过的所有命令:
lastcomm | grep username
查看某个特定命令的历史执行情况:
lastcomm | grep "python"
只看失败退出的进程(非0退出码):
lastcomm | awk '$4 != 0'
3. ac命令——按连接时间统计用户活动
ac命令统计的是用户登录会话的总时长,适合做用户活跃度分析:
ac -p
-p参数会把每个用户的总连接时间单独列出来,单位是小时。
三、实战场景:用psacct解决真实运维问题场景一:定位服务器CPU飙升的元凶
服务器突然CPU 100%,top看到一堆进程但不知道哪个是历史上持续占用的。这时候用sa按CPU排序:
sa --sort-cpu | head -20
你会看到哪个用户、哪个命令在过去一段时间内累计消耗了最多CPU时间。如果发现某个用户反复执行一个脚本,基本就能锁定问题。再用lastcomm配合时间范围进一步确认:
lastcomm --since yesterday | grep "problem_script"
场景二:多用户共享主机的资源计费
如果你的CentOS服务器上有多个开发人员共用,想知道每个人用了多少资源,sa -u就是最佳工具。把输出结果导出成报表,可以作为内部资源分配的依据:
sa -u --sort-cpu > /tmp/resource_report_$(date +%Y%m%d).txt
场景三:安全审计与入侵排查
当服务器被入侵后,攻击者通常会执行一些异常命令。通过lastcomm可以回溯历史,看攻击者到底执行了什么:
lastcomm --since "2024-01-01" | grep -E "wget|curl|nc|bash -i"
这条命令会列出从指定日期以来所有执行过wget、curl、nc、反弹shell等可疑命令的记录,对安全分析非常有价值。
场景四:定时生成资源报表
你可以写一个简单的cron任务,每天凌晨自动生成前一天的资源统计报告:
0 0 * * * /usr/bin/sa --sort-cpu > /var/log/sa/daily_report_$(date -d yesterday +\%Y\%m\%d).txt 2>&1
这样每天都有一份自动生成的资源使用报告,长期积累下来就是非常有价值的运维数据。
四、性能影响与优化建议psacct是内核级记账,每个进程退出时都要写一条记录,所以对系统性能有一定影响,尤其是高并发场景下。但实际测试表明,在普通服务器上影响通常在1%-3%以内,完全可以接受。如果你的服务器每秒有成千上万个短生命周期进程,那确实需要考虑优化。
优化建议有三点:第一,记账文件不要放在慢速磁盘上,建议放在SSD分区;第二,定期轮转日志文件,避免pacct文件过大导致查询变慢;第三,如果只关心特定用户或特定命令,可以考虑结合auditd做更精细的过滤,而不是全量记账。
# 手动轮转记账文件 cp /var/log/account/pacct /var/log/account/pacct.$(date +%Y%m%d) > /var/log/account/pacct
另外,sa命令默认读取的是当前月份的saXX文件,如果你想跨月统计,需要手动指定文件:
sa -f /var/log/sa/sa15
这里sa15就是15号的数据文件。多个文件可以叠加统计,比如看整个月的:
sa -f /var/log/sa/sa[0-3][0-9]五、psacct与其他监控工具的配合使用
psacct不是万能的,它只记录进程退出时的快照,不记录实时状态。最佳实践是把它和其他工具配合:用Prometheus+Node Exporter做实时监控和告警,用psacct做历史回溯和审计分析。两者互补,一个看现在,一个看过去。
对于容器化环境,psacct记录的是宿主机上的进程,容器内的进程如果以普通进程方式运行(非容器逃逸),也会被记录。但如果你用的是Kubernetes,Pod里的进程记账需要在节点层面启用psacct才能捕获。
总结一下,psacct是CentOS运维中一个被严重低估的工具。它安装简单、开销小、数据丰富,特别适合需要做资源审计、安全追溯、用户计费的场景。把它纳入你的日常运维工具箱,关键时刻能帮你快速还原真相。
