☰
sysstat-11.5.6源码编译与sar历史数据采集实战
2026/10/10 3:13:41 网站建设 项目流程

简介:sysstat-11.5.6.tar.gz 是 Linux 系统管理员与运维工程师用于性能监控与故障排查的核心工具源码包,聚焦 CPU、磁盘 I/O、内存及网络等关键指标的实时采集与历史分析。资源共 177 个文件,涵盖 25 个 C 源码文件(实现 iostat、mpstat、vmstat 等核心命令)、25 个头文件(h)与 19 个配置模板(in),辅以 35 个国际化翻译文件(po)和完整 man 手册(1)、cron 脚本(sa1/sa2)、数据收集器(sadc)及报表工具(sadf)的实现代码,结构完整、可编译可定制。压缩包仅 597KB,轻量紧凑,适合作为嵌入式环境或教学实验中的标准监控组件源码范例。目前已有 470 人学习下载,读者可直接获取 11.5.6 版本的全部原始构建能力,包括源码级调试支持、自定义编译选项(如 disable-nls)、cron 自动采集配置及二进制日志解析逻辑,是深入理解 Linux 性能工具链底层机制的优质实践素材。

1. sysstat-11.5.6.tar.gz:不是“随便解压就能用”的监控工具包,而是 Linux 系统性能观测的底层基石

你手头刚下载的sysstat-11.5.6.tar.gz,表面看只是个老旧的源码压缩包——毕竟连官网都标注着“stable but unmaintained since 2023”,但别急着删。它承载的是iostat、vmstat、mpstat、sar这四大命令的原始实现,而这些命令至今仍是绝大多数生产环境排查 CPU 飙高、磁盘 I/O 卡顿、内存泄漏、网络抖动的第一响应工具。很多团队在容器化后误以为cAdvisor或Prometheus Node Exporter能完全替代它,结果在裸金属宿主机上遇到kswapd0持续占满 CPU、ext4日志刷盘延迟突增、或softirq在特定 CPU 核上堆积时,发现指标断层——因为容器监控层根本看不到内核 slab 分配器、块设备请求队列深度、或中断亲和性失衡的真实快照。sysstat-11.5.6的价值,恰恰在于它绕过所有抽象层,直接读取/proc/stat、/sys/block/*/stat、/proc/interrupts等内核接口的原始字节流。它不依赖 systemd、不依赖 dbus、甚至不依赖 glibc 的最新版本——这意味着你能把它编译进一个只有 32MB 的嵌入式 rootfs,或者塞进一个被加固禁用动态链接的审计容器里。适合谁?不是只想看 Grafana 面板的运维,而是需要在凌晨三点面对一台sar -u 1 10输出中%iowait稳定在 98% 却查不到具体进程的 SRE;是正在为国产 ARM 服务器适配低延迟存储栈的固件工程师;也是在写《Linux 性能调优实战》教材时,必须让读者亲手从configure开始理解--enable-install-sadc为何决定sar数据能否持久化的讲师。这不是怀旧,是保留一条不经过任何中间件的、通往内核真相的物理通道。


2. 从源码到可用命令:为什么./configure && make && make install在这里会翻车

sysstat-11.5.6.tar.gz的构建流程看似标准,但它的配置逻辑与现代 autotools 项目有本质差异:它默认关闭所有数据持久化能力,且对cron服务的依赖是硬编码级的。如果你跳过关键参数直接make install,你会得到四个能运行的二进制文件,但sar将永远只输出实时快照(sar -u 1 5可用,sar -u -f /var/log/sa/sa23报错),sadf无法导出 CSV,sa1/sa2定时采集脚本也不会自动生成。这不是 bug,是设计哲学——作者认为“历史数据采集”属于系统管理职责,而非工具自身功能。因此,第一步必须明确你的使用目标:仅需实时诊断(如临时登录服务器跑iostat -x 1),还是需要长期趋势分析(如回溯上周三下午数据库慢查询时段的await峰值)?前者可跳过--enable-install-sadc,后者则必须开启并手动集成 cron。

2.1 解压与基础检查:确认环境兼容性再动手

# 创建独立构建目录,避免污染源码树 mkdir -p ~/build-sysstat && cd ~/build-sysstat tar -xzf ~/Downloads/sysstat-11.5.6.tar.gz cd sysstat-11.5.6 # 检查内核头文件是否就位(关键!) ls -l /usr/include/linux/kdev_t.h /usr/include/asm-generic/errno-base.h 2>/dev/null || echo "⚠️ 缺少内核头文件:请安装 kernel-headers 或 linux-headers-common 包" # 验证 GCC 版本(11.5.6 兼容 GCC 4.8+,但 GCC 12+ 需补丁) gcc --version | head -n1 # 若输出含 "gcc (Ubuntu 12.3.0-1ubuntu1~22.04)",需提前打补丁(见 2.3 节)

提示:sysstat不依赖 C++ 或 Python,但configure脚本本身是 POSIX shell 写的,某些精简版 BusyBox ash 可能不兼容。若./configure报syntax error near unexpected token,改用bash ./configure。

2.2 configure 的三个必选参数:绕过默认陷阱

sysstat的configure脚本有 17 个可选参数,但以下三个是生产环境部署的生死线:

参数必填性作用典型值
--prefix=/usr/local强烈建议指定安装根路径,避免与发行版包管理冲突/usr/local(非/usr)
--enable-install-sadc必须(需历史数据)启用sadc(System Activity Data Collector)安装,它是sar存储历史数据的核心yes
--with-root-prefix=/必须(若 prefix 非/)告诉sadc实际的根文件系统路径,否则日志路径计算错误/
# ✅ 正确配置(支持历史数据 + 避免路径错乱) ./configure \ --prefix=/usr/local \ --enable-install-sadc \ --with-root-prefix=/ # ❌ 危险配置(会导致 /var/log/sa/ 下生成空文件或权限错误) # ./configure --prefix=/usr # 冲突系统包 # ./configure --enable-install-sadc # 缺少 --with-root-prefix,sadc 会写入 /usr/var/log/sa/

逻辑说明:--enable-install-sadc不仅安装sadc二进制,还会在make install时生成/usr/local/lib/sa/sa1和/usr/local/lib/sa/sa2两个 shell 脚本——它们是cron调用的实际采集入口。而--with-root-prefix=/确保sadc内部将/var/log/sa/解析为绝对路径,而非相对prefix的路径。若省略此参数且prefix是/usr/local,sadc会尝试写入/usr/local/var/log/sa/,这通常不存在且无权限。

2.3 GCC 12+ 兼容补丁:解决__NR_statx未定义编译失败

在 Ubuntu 22.04 LTS(GCC 11.2)、Debian 12(GCC 12.2)等新环境中,make会卡在common.c报错:

error: '__NR_statx' undeclared here (not in a function)

原因是sysstat-11.5.6发布时(2021年)statx系统调用尚未在所有内核头中稳定暴露。解决方案不是降级 GCC,而是打一个 3 行补丁:

# 创建补丁文件 cat > statx-fix.patch << 'EOF' --- a/common.c +++ b/common.c @@ -39,6 +39,9 @@ #include <linux/unistd.h> #endif +#ifndef __NR_statx +#define __NR_statx 332 +#endif #include <sys/stat.h> #include <sys/types.h> #include <sys/wait.h> EOF # 应用补丁 patch -p1 < statx-fix.patch

参数说明:__NR_statx是statx()系统调用的编号,在 x86_64 架构上固定为 332。该补丁在common.c头部强制定义,绕过内核头文件缺失问题。注意:此补丁仅适用于 x86_64;ARM64 需改为#define __NR_statx 291(需根据/usr/include/asm/unistd_64.h确认)。

2.4 编译与安装:验证二进制完整性

# 执行编译(-j$(nproc) 加速,但内存<4GB时建议 -j2) make -j$(nproc) # 检查关键二进制是否生成(必须存在) ls -l sa1 sa2 sadc iostat vmstat mpstat sar # 安装(此时才创建 /var/log/sa/ 目录并设权限) sudo make install # ✅ 验证安装结果 ls -l /usr/local/bin/{iostat,vmstat,mpstat,sar} /usr/local/lib/sa/{sa1,sa2} /usr/local/lib/sa/sadc sudo ls -ld /var/log/sa/ # 应显示 drwxr-xr-x 2 root root

逻辑说明:make install会自动执行install-sh脚本,它不仅复制二进制,还会:

  • 创建/var/log/sa/目录(属主root:root,权限755)
  • 安装sa1/sa2到/usr/local/lib/sa/
  • 将sadc安装到/usr/local/lib/sa/(注意:不是/usr/local/bin/,这是故意设计,防止用户直接调用)

注意:sadc被刻意放在lib目录下,因为它是一个后台采集守护进程,不应被终端用户直接执行。sa1脚本才是 cron 调用的正确入口。


3. 让 sar 真正“记住昨天”:sadc 采集机制与 cron 集成全链路

sysstat的历史数据能力完全依赖sadc(System Activity Data Collector)——一个每 10 分钟唤醒一次、读取/proc和/sys接口、将二进制快照写入/var/log/sa/saDD(DD 为日期)的轻量级程序。但它不自带定时任务,必须由系统 cron 驱动。很多用户make install后发现sar -f /var/log/sa/sa23报Cannot open /var/log/sa/sa23: No such file or directory,根源就是 cron 未配置。

3.1 sadc 的工作原理:二进制格式 vs 文本日志的取舍

sadc不生成人类可读的日志,而是写入紧凑的二进制结构体(struct activity),原因有三:

  • 空间效率:10 分钟采样一次,30 天数据仅约 8MB(文本格式超 200MB)
  • 解析速度:sar读取二进制可毫秒级定位时间戳,文本需逐行 grep
  • 原子性:二进制写入是write()系统调用,避免文本追加时的竞态

其数据文件/var/log/sa/sa23结构如下:

[Header: magic=0x20220101, version=11, arch=x86_64] [Record: timestamp=1712345678, cpu_user=12.3, cpu_system=5.7, ...] [Record: timestamp=1712345738, cpu_user=15.1, cpu_system=6.2, ...]

提示:不要用hexdump直接读sa23——sar内置了反序列化解析器。若需调试,用sadf -d /var/log/sa/sa23 | head -20查看解码后的 CSV。

3.2 手动配置 cron:两行脚本解决 99% 场景

sysstat-11.5.6提供了sa1和sa2两个封装脚本,分工明确:

  • sa1:每 10 分钟执行一次,采集基础指标(CPU、内存、I/O、中断)
  • sa2:每天 23:59 执行一次,生成当日摘要报告(/var/log/sa/saYYYYMMDD)
# 编辑 root cron(必须用 sudo crontab -e,普通用户 crontab 无效) sudo crontab -e # 添加以下两行(确保路径与你的 prefix 一致) # 每10分钟采集一次(sa1 脚本会自动处理日期和文件名) */10 * * * * /usr/local/lib/sa/sa1 1 1 # 每天23:59生成摘要(sa2 读取当日 saDD 文件并写入 /var/log/sa/saYYYYMMDD) 59 23 * * * /usr/local/lib/sa/sa2 -A # ✅ 验证 cron 是否生效 sudo systemctl restart cron # 或 crond,取决于发行版 sudo tail -f /var/log/syslog | grep -i "sa1\|sa2" # 应看到执行日志

参数说明:

  • sa1 1 1:第一个1表示采样间隔(秒),第二个1表示采样次数。*/10 * * * *已控制频率,此处1 1表示“每次只采 1 秒内的 1 个快照”,足够捕获瞬时峰值。
  • sa2 -A:-A参数表示“生成所有活动类型的摘要”,包括 CPU、内存、磁盘、网络等。若只需 CPU 摘要,可用-A -u。

3.3 首次采集验证:三步确认数据链路打通

# 1. 手动触发一次 sa1(避免等10分钟) sudo /usr/local/lib/sa/sa1 1 1 # 2. 检查 saDD 文件是否生成(DD 为今日日期,如 sa23) ls -lh /var/log/sa/sa* # 3. 用 sar 读取刚写入的数据(-f 指定文件,-u 显示 CPU) sudo sar -f /var/log/sa/sa$(date +%d) -u 1 1 # ✅ 成功输出应类似: # Linux 5.15.0-101-generic (hostname) 04/05/2024 _x86_64_ (4 CPU) # 10:23:45 AM CPU %user %nice %system %iowait %steal %idle # 10:23:46 AM all 3.25 0.00 1.25 0.00 0.00 95.50

逻辑说明:sa1脚本内部会调用sadc -F -L -o /var/log/sa/saDD,其中-F强制覆盖(避免多进程写冲突),-L启用文件锁。若第 2 步未看到saDD文件,请检查/var/log/sa/权限(必须root:root 755)及磁盘空间(df -h /var)。


4. 避坑指南:sysstat-11.5.6 在生产环境踩过的 5 个真实深坑

sysstat-11.5.6的稳定性毋庸置疑,但它的“古老”设计与现代 Linux 发行版存在隐性摩擦。以下是某金融核心交易系统迁移时,A同学连续 36 小时排查后总结的血泪经验,每一条都对应一个sar命令突然失效的线上事故。

4.1 现象:sar -u正常,但sar -d(磁盘)始终显示 0.00

原因:sadc默认不采集磁盘详细指标(-d对应activity类型ACT_DISK),需显式启用。sysstat-11.5.6的sa1脚本硬编码只启用基础活动集(CPU、内存、中断),-d需额外参数。
解决:修改 cron 中的sa1调用,添加-D参数:

# 替换原 cron 行 */10 * * * * /usr/local/lib/sa/sa1 -D 1 1

注意:-D会增加/var/log/sa/saDD文件体积约 30%,但这是获取await、svctm、%util的唯一方式。

4.2 现象:sar -n DEV(网络接口)报Requested activities not available in file

原因:网络统计(ACT_NET_DEV)在sysstat-11.5.6中被默认禁用,因早期内核/proc/net/dev解析开销大。sa1脚本未包含-n参数。
解决:在sa1调用中加入-n DEV:

*/10 * * * * /usr/local/lib/sa/sa1 -D -n DEV 1 1

玄学提示:若同时启用-D和-n DEV,sa1会按顺序采集磁盘→网络,总耗时增加约 0.2 秒,确保 cron 间隔 ≥10 秒。

4.3 现象:sar -f /var/log/sa/sa23报Cannot open: Invalid argument

原因:saDD文件被logrotate错误切割。sysstat的二进制格式不支持gzip压缩,但某些发行版logrotate配置会自动compress旧文件。
解决:检查/etc/logrotate.d/sysstat(若存在),注释掉compress行,并重启 logrotate:

sudo sed -i '/compress/s/^/#/' /etc/logrotate.d/sysstat sudo logrotate -f /etc/logrotate.conf

4.4 现象:iostat -x输出中rsec/s、wsec/s为 0,但tps(IOPS)正常

原因:iostat依赖/sys/block/*/stat中的sectors_read/sectors_written字段,而某些 NVMe 驱动(如nvme-core5.10+)默认禁用此统计以降低开销。
解决:启用内核参数(需重启):

# 临时启用(当前会话) echo 1 | sudo tee /sys/block/nvme0n1/stat # 永久启用:在 /etc/default/grub 中添加 GRUB_CMDLINE_LINUX_DEFAULT="... nvme_core.default_ps_max_latency_us=0" sudo update-grub && sudo reboot

4.5 现象:sar -I ALL(所有中断)输出IRQ列全为 0

原因:/proc/interrupts文件权限为644,但sadc以root身份运行,理论上可读。实际是 SELinux 或 AppArmor 策略拦截了sadc对/proc/interrupts的访问。
解决:检查审计日志定位策略:

# 查看是否被 SELinux 拦截 sudo ausearch -m avc -ts recent | grep sadc # 临时放行(生产环境需定制策略) sudo setsebool -P sysstat_run_sadc 1

5. 进阶技巧:用 sar 数据做容量预测与异常检测的最小可行方案

当sar数据积累超过 30 天,它就不再是“事后复盘工具”,而成为容量规划的黄金矿藏。某高校 HPC 集群用sysstat-11.5.6的saDD文件,实现了无需 Prometheus 的 CPU 资源缺口预测。核心思路:把sar当作时序数据库的原始存储层,用sadf导出结构化数据,再用轻量脚本分析。

5.1 用 sadf 导出指定日期的完整指标 CSV

sadf是sysstat的瑞士军刀,能将二进制saDD转为机器可读格式。相比sar -f的人眼阅读,sadf支持字段筛选、时间过滤、格式转换:

# 导出今日 saDD 中所有 CPU 指标(含时间戳),CSV 格式 sudo sadf -d /var/log/sa/sa$(date +%d) -- -u | head -20 # 输出示例(第一行为表头): # # hostname;interval;timestamp;CPU;%user;%nice;%system;%iowait;%steal;%idle # node01;1;2024-04-05 10:23:45;all;3.25;0.00;1.25;0.00;0.00;95.50 # node01;1;2024-04-05 10:23:46;all;4.10;0.00;1.80;0.00;0.00;94.10 # ⚠️ 关键限制:sadf 默认只导出 `sar` 支持的指标类型。若 saDD 中无磁盘数据(未启用 -D),则 `sadf -- -d` 报错。

参数说明:-d表示“以 CSV 格式输出”,--分隔sadf参数与sar子命令,-u即sar -u的等价参数。sadf的强大在于它支持-- -u -r -b同时导出 CPU+内存+I/O,单条命令生成多维数据。

5.2 用 awk 做实时异常检测:识别 CPU 使用率突增

无需 Python 或机器学习库,纯 Bash +awk即可实现滑动窗口异常检测。以下脚本每 5 分钟扫描最近 1 小时的sar数据,若某 CPU 核的%user连续 3 次 >90%,则发邮件告警:

#!/bin/bash # save as /usr/local/bin/cpu-spike-alert.sh LOG_DIR="/var/log/sa" TODAY=$(date +%d) HOUR_AGO=$(date -d '1 hour ago' +%H) # 获取最近1小时的CPU user数据(只取all核,忽略各核明细) DATA=$(sudo sadf -d "$LOG_DIR/sa$TODAY" -- -u | \ awk -v hour="$HOUR_AGO" -F';' ' $3 ~ /'"$HOUR_AGO":[0-5][0-9]:[0-5][0-9]/ { if ($6 > 90) print $3","$6 }' | tail -n 3) # 检查是否连续3次>90% if [ $(echo "$DATA" | wc -l) -eq 3 ]; then LAST_TIME=$(echo "$DATA" | tail -n1 | cut -d',' -f1) echo "ALERT: CPU %user >90% for 3 consecutive samples at $LAST_TIME" | \ mail -s "CPU Spike on $(hostname)" admin@company.com fi

逻辑说明:sadf输出的时间戳格式为2024-04-05 10:23:45,awk用正则匹配$HOUR_AGO:[0-5][0-9]:[0-5][0-9]精确提取该小时数据。tail -n 3确保只检查最近三次采样。此方案在 32 核服务器上运行内存占用 <2MB,CPU 占用 <0.1%。

5.3 用 R 语言做容量趋势预测:30 行代码预测下月 CPU 峰值

sysstat数据的真正价值在于长期趋势。以下 R 脚本读取 30 天的sar -uCSV,用forecast包拟合 ARIMA 模型,预测下月每日 CPU 平均使用率峰值:

# save as predict-cpu.R library(forecast) library(dplyr) # 读取30天数据(假设已用 sadf 导出到 /tmp/sar-cpu.csv) data <- read.csv("/tmp/sar-cpu.csv", header=TRUE, stringsAsFactors=FALSE) # 清洗:只取all核,按日期分组求max(%user) data$date <- as.Date(substr(data$timestamp, 1, 10)) daily_max <- data %>% filter(CPU == "all") %>% group_by(date) %>% summarise(cpu_peak = max(`%user`, na.rm=TRUE)) # 转为时间序列(每日一个点) ts_data <- ts(daily_max$cpu_peak, start=c(2024,1), frequency=365) # 拟合ARIMA模型并预测30天 fit <- auto.arima(ts_data) forecast_result <- forecast(fit, h=30) # 输出下月峰值预测(单位:%) cat("Next month CPU peak prediction (95% CI):\n") cat(sprintf("Mean: %.2f%%, Lo: %.2f%%, Hi: %.2f%%\n", forecast_result$mean[30], forecast_result$lower[30,2], forecast_result$upper[30,2]))

落地效果:某实验室用此脚本分析 6 个月sar数据,成功预测出暑假前 GPU 渲染集群的 CPU 峰值将突破 85%,提前扩容 20% 节点,避免了渲染任务排队超 2 小时的 SLA 违规。

我坚持在所有新服务器部署sysstat-11.5.6,不是因为情怀,而是它像一把瑞士军刀——没有花哨 UI,但当你需要在无网络、无 Python、无 Docker 的救援模式下,用iostat -x 1定位一块 SSD 的await突增至 200ms 的根源时,它就在那里,沉默,可靠,从不抱怨。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询