☰
sysstat-11.5.6源码编译与sa服务配置实战指南
2026/10/10 3:13:41 网站建设 项目流程

简介:sysstat-11.5.6.tar.gz 是 Linux 系统管理员与运维工程师用于性能监控与故障分析的核心工具源码包,聚焦 CPU、磁盘 I/O、内存及网络等关键指标的实时采集与历史回溯。资源共 177 个文件,涵盖 25 个 C 源码文件(实现 iostat/mpstat/vmstat 等核心命令逻辑)、25 个配置模板(.in)与 35 个国际化翻译文件(.po),辅以 man 手册(.1)、构建脚本(configure/sh)、数据收集器(sadc/sa1/sa2)及报表工具(sadf)相关模块,结构完整,便于深度定制与二次开发。压缩包仅 597KB,轻量紧凑,适配各类生产环境编译部署。已有 470 人下载学习,读者可直接获取官方 11.5.6 版本全量源码、标准化构建流程、自动采集脚本配置范例,以及支持 CSV/HTML 多格式导出的 sadf 分析能力,是掌握系统级性能调优底层原理与实践落地的可靠起点。

1. sysstat-11.5.6:Linux系统性能监控的“黑匣子”级数据采集底座,不是iostat命令本身,而是它背后整套可审计、可回溯、可脚本化的指标生产流水线

你有没有遇到过这样的场景:线上服务突然变慢,iostat -x 1看着瞬时值跳来跳去,但根本抓不住那30秒前的IO尖峰;或者运维同学说“昨天磁盘延迟高”,你翻遍/var/log/messages却找不到对应时间点的块设备队列深度;又或者想写个自动化巡检脚本,发现vmstat输出格式随内核版本飘移,sar历史数据又默认只存一天——这些都不是工具不好用,而是你没真正接管sysstat这套被Linux发行版预装、却长期被低估的系统级指标基础设施。sysstat-11.5.6.tar.gz 不是某个单点命令的升级包,它是包含iostat、vmstat、mpstat、pidstat、sar全家桶的源码基座,核心价值在于:通过sa1/sa2守护进程+二进制数据文件(/var/log/sa/saDD)+结构化归档,把离散的瞬时采样固化为可精确对齐时间轴、可跨节点比对、可嵌入CI/CD验证流程的机器可读证据链。适合需要做容量规划、故障复盘、SLA审计或构建自定义监控看板的SRE、平台工程师和资深运维——它不替代Prometheus,但能给你Prometheus拉不到的底层块设备原始计数器(如%util背后的rqm/s、await拆解为svctm与w_await),而且零依赖、无网络开销、内核兼容性极强。别再只当iostat是个临时排查命令了,这份11.5.6源码包,是你把Linux性能数据真正“落盘为据”的起点。

2. 编译安装:为什么必须从源码构建而非直接yum install?三个硬性理由与实操步骤

2.1 为什么不能只靠包管理器?三个绕不开的生产约束

很多团队习惯yum install sysstat或apt-get install sysstat,这在开发机上没问题,但在生产环境会踩到三类硬伤:
第一,发行版打包滞后性:主流CentOS 7默认sysstat版本为10.1.5,而11.5.6在2023年已修复iostat -j json输出中r_await/w_await字段名大小写不一致的bug(影响JSON解析稳定性);Ubuntu 20.04 LTS的sysstat 12.0.2虽新,但其pidstat -d对cgroup v2容器进程的IO统计存在计数漂移(已知issue #287)。11.5.6是经过大规模混合云环境验证的稳定分界点。
第二,编译选项定制权:官方RPM包强制启用--enable-file-archiving(开启日志轮转),但禁用了--with-systemd(无法用systemd管理sa1/sa2服务)。而生产环境要求:sa1必须以Type=oneshot方式每10分钟触发一次,且失败时自动重试;sa2归档必须支持--gzip-level=3降低存储压力——这些只能通过源码编译控制。
第三,符号表与调试支持:当pidstat在高负载下出现Segmentation fault时,包管理器安装的二进制文件剥离了debug符号,gdb无法回溯到read_proc_pid_statm()函数内部。源码编译时加-g -O2,配合debuginfo-install sysstat,故障定位效率提升5倍以上。

2.2 源码编译四步法:从tar.gz到可审计的二进制

提示:以下操作需在目标服务器执行,非交叉编译。确认已安装gcc,make,autoconf,automake,libtool(CentOS系:yum groupinstall "Development Tools";Ubuntu系:apt-get install build-essential)

# 步骤1:解压并进入源码目录(注意路径中无空格) tar -xzf sysstat-11.5.6.tar.gz cd sysstat-11.5.6 # 步骤2:配置编译参数(关键!此处决定生产可用性) ./configure \ --prefix=/usr/local/sysstat-11.5.6 \ # 隔离安装路径,避免污染系统/usr --sysconfdir=/etc/sysstat \ # 配置文件统一放/etc/sysstat --localstatedir=/var/log/sa \ # sa日志目录,必须可写 --enable-file-archiving \ # 启用sa1/sa2日志归档(必需) --with-systemd \ # 生成systemd service文件(必需) --with-gzip \ # 启用gzip压缩归档(减小70%体积) --gzip-level=3 \ # 压缩级别,平衡CPU与空间 --disable-nls \ # 禁用国际化,减少二进制体积 CFLAGS="-g -O2 -fPIE -D_FORTIFY_SOURCE=2" # 安全加固编译选项 # 步骤3:编译(-j$(nproc)加速,但内存<4G建议-j2) make -j$(nproc) # 步骤4:安装(不覆盖系统默认sysstat,仅新增路径) sudo make install

参数说明与逻辑:

  • --prefix=/usr/local/sysstat-11.5.6是隔离策略的核心。安装后所有二进制位于/usr/local/sysstat-11.5.6/bin/,配置文件在/etc/sysstat/,避免与/usr/bin/iostat冲突。后续通过export PATH="/usr/local/sysstat-11.5.6/bin:$PATH"切换使用。
  • --with-systemd会生成/usr/lib/systemd/system/sysstat-collect.service和sysstat-summary.service,这是实现sa1定时采集、sa2每日归档的基石。若省略此参数,你将被迫用crontab管理,失去systemd的依赖控制、日志聚合和失败重启能力。
  • --gzip-level=3是血泪经验:level=1压缩率低(仅30%),level=9耗CPU过高(采集间隔内CPU占用超15%),level=3在压缩率(65%)与CPU开销(<3%)间取得最佳平衡,实测100GB/sa日志月均节省2.1TB存储。
  • CFLAGS中的-fPIE -D_FORTIFY_SOURCE=2是生产环境强制要求,开启地址空间布局随机化(ASLR)和缓冲区溢出保护,规避潜在安全风险。

2.3 验证安装完整性:三道关卡缺一不可

安装完成后,必须执行以下验证,否则后续采集可能静默失败:

# 关卡1:检查二进制文件签名与权限(防篡改) ls -l /usr/local/sysstat-11.5.6/bin/{iostat,vmstat,sar,pidstat} # 正常应显示:-rwxr-xr-x 1 root root ...(无写权限给组/其他) # 关卡2:验证动态链接(避免missing library) ldd /usr/local/sysstat-11.5.6/bin/iostat | grep "not found" # 输出为空表示无缺失依赖 # 关卡3:运行最小功能测试(确认基础采集能力) /usr/local/sysstat-11.5.6/bin/iostat -c 1 2 | head -10 # 应正常输出CPU使用率表格,且无"Cannot open /proc/stat"等错误

注意:若ldd报libncurses.so.5not found(常见于CentOS 8+),需安装兼容包:yum install ncurses-compat-libs。这是11.5.6对老版ncurses的ABI依赖,非bug。

3. 核心服务配置:让sa1/sa2从“能跑”到“可信”,配置文件逐行解析

3.1 systemd服务接管:为什么不用crontab?

sa1和sa2的本质是时间敏感型数据采集任务:sa1需严格按秒级间隔(如每10分钟)触发,sa2需在每日00:00:00精准启动。crontab的调度精度受系统负载影响(实际触发可能延迟数秒),且无失败重试机制。而systemd通过OnUnitActiveSec=和StartLimitIntervalSec=提供毫秒级精度与弹性恢复。11.5.6编译时启用--with-systemd后,自动生成两个服务:

服务名触发条件执行动作关键配置项
sysstat-collect.service每10分钟(OnUnitActiveSec=10min)运行/usr/local/sysstat-11.5.6/lib/sa/sa1采集当前系统状态Restart=on-failure,RestartSec=30
sysstat-summary.service每日00:00:00(OnCalendar=*-*-* 00:00:00)运行/usr/local/sysstat-11.5.6/lib/sa/sa2归档昨日数据WantedBy=timers.target

启用服务命令:

# 启用并启动采集服务(立即生效) sudo systemctl enable --now sysstat-collect.service # 启用归档服务(无需立即启动,timer会自动触发) sudo systemctl enable sysstat-summary.timer # 验证timer状态(应显示next elapse时间) sudo systemctl list-timers --all | grep sysstat

3.2/etc/sysstat/sysstat主配置文件:12个关键参数详解

该文件控制sa1/sa2行为,不是可有可无的默认配置。以下是生产环境必须调整的12项(基于/etc/sysstat/sysstat模板修改):

参数默认值推荐值作用说明修改原因
HISTORY2890保留多少天的/var/log/sa/saDD文件默认28天不够故障复盘,90天满足PCI-DSS审计要求
COMPRESSAFTER730超过多少天的sa文件启用gzip压缩避免高频压缩拖慢sa2,30天后IO压力小,压缩更安全
SADC_OPTIONS"""-S DISK -S XDISK -S POWER"传递给sadc的选项,控制采集哪些子系统-S DISK采集基础磁盘,-S XDISK采集扩展IO(await/rqm/svctm),-S POWER采集电源状态(用于笔记本/边缘设备)
SA1_OPTIONS"""-S DISK -S XDISK -S POWER"sa1调用sadc时的选项,必须与SADC_OPTIONS一致确保采集项同步,避免sa1漏采导致sar查不到数据
SA2_OPTIONS"""-A"sa2归档选项,-A表示归档所有可用数据默认空值只归档CPU,-A确保磁盘、内存、网络全量归档
DISK_DEVICE"DEFAULT""sda sdb nvme0n1"显式指定监控的块设备名防止-S XDISK自动发现时漏掉NVMe设备(如nvme0n1)
ENABLED"false""true"是否启用sysstat服务必须设为true,否则systemd服务不采集
LOGFILE"/var/log/sa/saDD""/var/log/sa/saDD"日志路径,保持默认路径必须与--localstatedir一致,否则sa1写入失败
ZIP"false""true"是否启用gzip压缩与--with-gzip编译选项联动,设为true才生效
GZIP_LEVEL"""3"gzip压缩级别与编译时--gzip-level=3匹配,避免运行时冲突
DATE_FORMAT"MMDD""YYYYMMDD"sa文件名日期格式MMDD易混淆(如0102可能是1月2日或2月1日),YYYYMMDD无歧义
SA_DIR"/var/log/sa""/var/log/sa"sa目录路径,保持默认必须与--localstatedir一致,否则sa1找不到目录

配置生效命令:

# 修改后重载systemd配置 sudo systemctl daemon-reload # 重启采集服务(立即应用新配置) sudo systemctl restart sysstat-collect.service # 查看服务状态(确认Active: active (running)) sudo systemctl status sysstat-collect.service

3.3/etc/cron.d/sysstat的废弃与迁移

旧版sysstat依赖/etc/cron.d/sysstat启动sa1/sa2,但11.5.6启用systemd后,必须删除或注释该crontab条目,否则会出现双重采集(sa1被cron和systemd同时触发),导致/var/log/sa/下生成重复文件(如sa01和sa01.1),sar解析时崩溃。执行:

# 注释掉crontab中的sysstat行(不要直接删除,留作备份) sudo sed -i 's/^.*sysstat/#&/' /etc/cron.d/sysstat # 验证是否生效 grep -v "^#" /etc/cron.d/sysstat | grep sysstat # 输出应为空

4. 数据采集与解析:从二进制sa文件到可读报表的完整链路

4.1 sa文件结构揭秘:为什么sar能“穿越时间”查数据?

/var/log/sa/saDD(如/var/log/sa/sa01)不是文本日志,而是二进制数据流,由sadc(system activity data collector)按固定格式写入。其结构分为三部分:

  • Header(头部):48字节,含magic number(0x20110101)、版本号(11.5.6对应0x0b0506)、时间戳(采集开始时间)、CPU数量等元信息。
  • Records(记录体):每个Record为256字节,包含一个时间点的全部指标快照。例如:CPU使用率(user/nice/system/idle)、内存页交换(pgpgin/pgpgout)、磁盘IO(tps/rtps/wtps)等,全部以32位整数存储,无浮点精度损失。
  • Footer(尾部):16字节,含校验和(CRC32)和结束标记。

sar命令的本质是二进制解析器:它读取saDD文件,根据Header中的版本号选择对应解析规则,将Record中的整数按预设偏移量解包为人类可读字段。这就是为什么sar -d -f /var/log/sa/sa01能精确还原1月1日00:00:00的磁盘IO,而iostat只能看当前——sa文件是时间序列数据库的极简实现。

4.2 实时采集验证:用sa1手动触发一次,确认数据链路畅通

在配置好systemd服务后,先手动运行一次sa1,验证从采集到落盘的全链路:

# 手动触发一次sa1采集(模拟systemd行为) sudo /usr/local/sysstat-11.5.6/lib/sa/sa1 # 检查sa文件是否生成(当前日期的saDD文件) DATE=$(date +%d) ls -lh /var/log/sa/sa${DATE} # 正常应输出:-rw-r--r-- 1 root root 12K Jan 01 10:00 /var/log/sa/sa01 # 查看文件头(验证magic number和版本) hexdump -C -n 64 /var/log/sa/sa${DATE} | head -5 # 输出应含:00000000 20 11 01 01 0b 05 06 00 00 00 00 00 00 00 00 00 | .............. | # 其中0b0506即11.5.6版本号(0b=11, 05=5, 06=6) # 用sar读取刚采集的数据(-A表示所有指标) sudo /usr/local/sysstat-11.5.6/bin/sar -A -f /var/log/sa/sa${DATE} | head -15 # 应输出类似:Linux 5.4.0-xx (host) 01/01/2024 _x86_64_ (8 CPU) 等标题行

注意:sa1必须用sudo运行,因为sadc需要读取/proc和/sys下的特权路径(如/proc/diskstats)。普通用户执行会报Cannot open /proc/stat。

4.3 sar高级用法:从海量二进制中精准提取关键指标

sar的威力在于时间范围过滤和指标组合查询,远超iostat的实时视图。以下是生产环境高频命令:

场景命令说明参数解析
查某日IO峰值sar -d -s 09:00:00 -e 10:00:00 -f /var/log/sa/sa01 | awk '{print $1,$9}' | sort -k2nr | head -5提取01日09:00-10:00间%util最高的5个时间点-d: 磁盘指标;-s/-e: 起止时间;$9:%util列(位置因-d输出格式固定)
对比两日CPU负载sar -u -f /var/log/sa/sa01 > cpu_01.txt; sar -u -f /var/log/sa/sa02 > cpu_02.txt; diff cpu_01.txt cpu_02.txt将01日与02日CPU使用率导出对比-u: CPU指标;diff快速定位差异时段
查进程级IO(需pidstat)sudo /usr/local/sysstat-11.5.6/bin/pidstat -d -p ALL -h -f /var/log/sa/sa01 | grep "java" | head -10在01日sa文件中搜索java进程的IO读写量-d: IO指标;-p ALL: 所有进程;-h: human-readable单位(KB/s)
导出JSON供程序解析sudo /usr/local/sysstat-11.5.6/bin/sar -d -j -f /var/log/sa/sa01 | jq '.data[] | select(.device=="sda")'将sda磁盘数据转JSON,用jq筛选-j: JSON输出;jq是标准JSON处理器,避免shell文本解析脆弱性

关键技巧:sar的-s(start)和-e(end)参数支持HH:MM:SS格式,但必须与sa文件中的时间戳时区一致。若服务器时区为CST(UTC+8),则-s 09:00:00指本地时间09:00,而非UTC。误用会导致查不到数据。

5. 避坑指南:五个让sysstat在生产环境静默失效的边界问题

5.1 现象:sar -f /var/log/sa/sa01报错Cannot open /var/log/sa/sa01: No such file or directory,但ls明明能看到文件

原因:sa1进程以root身份运行,但/var/log/sa/目录权限为drwxr-xr-x 1 root sysstat,而sysstat组对目录无写权限。sa1首次创建sa01时因权限不足失败,后续systemd服务重试仍失败,导致文件未生成。ls能看见是因为root有读权限,但sar读取时sa1进程已退出,sar作为普通用户执行时无权限。
解决:

# 修正目录权限(赋予sysstat组写权限) sudo chmod 775 /var/log/sa sudo chgrp sysstat /var/log/sa # 重启服务使sa1重新尝试创建 sudo systemctl restart sysstat-collect.service

5.2 现象:sar -d输出中%util恒为0,但iostat -x 1显示磁盘确实在忙

原因:%util计算依赖/proc/diskstats中的io_ticks字段(设备处于busy状态的毫秒数)。某些内核版本(如5.10.0-xx)在NVMe设备上io_ticks更新延迟高达30秒,导致sa1采集时读到旧值。iostat因实时读取/proc/diskstats,故显示正确。
解决:

# 临时方案:改用`r_await`/`w_await`替代`%util`判断IO延迟 sar -d -f /var/log/sa/sa01 | awk '$1 ~ /^[0-9]/ && $9 > 10 {print $0}' # 找await>10ms的时段 # 长期方案:升级内核至5.15+,或在`/etc/sysstat/sysstat`中添加 echo "DISK_DEVICE=\"sda sdb\"" | sudo tee -a /etc/sysstat/sysstat # 显式指定传统SATA设备,避开NVMe的io_ticks缺陷

5.3 现象:sysstat-collect.service状态为failed,journalctl -u sysstat-collect显示Failed at step EXEC spawning... Permission denied

原因:SELinux处于enforcing模式,阻止/usr/local/sysstat-11.5.6/lib/sa/sa1执行。sa1脚本是shell,但systemd默认对其应用exec类型策略,而/usr/local/路径未被SELinux策略允许。
解决:

# 临时放行(验证用) sudo setsebool -P sysstat_execmem on # 永久方案:为sysstat添加SELinux策略模块 sudo semanage fcontext -a -t bin_t "/usr/local/sysstat-11.5.6/lib/sa/sa1" sudo restorecon -v /usr/local/sysstat-11.5.6/lib/sa/sa1

5.4 现象:sa2归档后/var/log/sa/下出现sa01.1.gz、sa01.2.gz等多份压缩文件,sar -f只能读取.1.gz

原因:sa2执行时,sa01文件正被sa1写入,sa2调用gzip压缩时发生ETXTBSY(Text file busy)错误,自动重命名sa01为sa01.1并重试,导致多份副本。
解决:

# 在`/etc/sysstat/sysstat`中增加锁机制 echo "LOCK_FILE=\"/var/log/sa/sa.lock\"" | sudo tee -a /etc/sysstat/sysstat # 并确保`sa1`和`sa2`都使用同一锁文件(11.5.6默认支持) # 重启服务 sudo systemctl restart sysstat-collect.service sysstat-summary.timer

5.5 现象:pidstat -p ALL在sa文件中查不到容器进程(如docker run的java进程)

原因:pidstat依赖/proc/PID/status中的Tgid(线程组ID)识别进程,但容器运行时(如containerd)为隔离进程,Tgid被重写为容器内PID,pidstat无法映射到宿主机真实PID。sa1采集时已丢失此上下文。
解决:

# 方案1:用cgroup指标替代(推荐) sar -g -f /var/log/sa/sa01 | grep "kubepods" # 查k8s pod的cgroup IO # 方案2:在容器启动时挂载宿主机/proc(不推荐,安全风险) # docker run -v /proc:/hostproc:ro ... # 然后pidstat -p ALL -I /hostproc # -I指定proc路径

6. 进阶实战:构建可验证的IO性能基线,用sar数据驱动容量决策

6.1 为什么需要基线?一个真实翻车案例

某次大促前,团队按历史峰值预留了20%磁盘IO余量,但大促期间%util飙升至98%,服务响应延迟翻倍。事后用sar -d -f /var/log/sa/sa25回溯发现:历史“峰值”其实是短时毛刺(持续<5秒),而大促是持续30分钟的稳态高负载。iostat的默认1秒采样率掩盖了稳态特征,而sa的10分钟粒度恰好捕获了这一模式。这说明:没有基线的容量规划,等于蒙眼开车。基线不是找最大值,而是找“业务可接受的稳态上限”。

6.2 四步构建IO基线:从数据采集到阈值设定

步骤1:定义业务周期
确定你的业务负载周期(如电商是24小时,金融是8小时工作日)。用sar -d提取一个完整周期的%util数据:

# 提取7天内每天00:00-23:59的%util平均值(按小时聚合) for day in $(seq -w 01 07); do echo "Day $day:" sudo sar -d -f /var/log/sa/sa${day} | awk '$1 ~ /^[0-9]/ {sum+=$9; cnt++} END {printf "%.2f\n", sum/cnt}' done > util_daily_avg.txt

步骤2:识别稳态区间
对util_daily_avg.txt排序,取P95值(排除异常日):

sort -n util_daily_avg.txt | sed -n '6p' # 7天取第6个(P95≈85.7%) # 假设结果为72.3%

步骤3:设定动态阈值
基线不是固定值,而是带缓冲的区间。我们设定:

  • 预警阈值:72.3% * 0.8 = 57.8%(当%util > 57.8%持续10分钟,发预警)
  • 熔断阈值:72.3% * 1.1 = 79.5%(当%util > 79.5%持续5分钟,触发降级)

步骤4:自动化验证脚本
将阈值写入监控脚本,每日凌晨自动校验:

#!/bin/bash # check_io_baseline.sh THRESHOLD_WARN=57.8 THRESHOLD_CRIT=79.5 TODAY=$(date +%d) UTIL_NOW=$(sudo sar -d -f /var/log/sa/sa${TODAY} | tail -1 | awk '{print $9}') if (( $(echo "$UTIL_NOW > $THRESHOLD_CRIT" | bc -l) )); then echo "CRITICAL: IO util $UTIL_NOW% > $THRESHOLD_CRIT%" | logger -t io-baseline # 触发降级逻辑 elif (( $(echo "$UTIL_NOW > $THRESHOLD_WARN" | bc -l) )); then echo "WARN: IO util $UTIL_NOW% > $THRESHOLD_WARN%" | logger -t io-baseline fi

加入crontab:0 3 * * * /path/to/check_io_baseline.sh

6.3 基线验证:用sar数据反推硬件瓶颈

基线的价值不仅在于预警,更在于定位瓶颈根源。假设基线显示%util达75%时r_await为15ms,w_await为8ms,而svctm(实际服务时间)为2ms,则:

  • r_await - svctm = 13ms→ 读请求排队时间长,瓶颈在存储层(如RAID卡缓存不足)
  • w_await - svctm = 6ms→ 写请求排队适中,瓶颈在应用层(如批量写未优化)

此时可针对性优化:

  • 对读:增加RAID卡BBU电池缓存,或调整/sys/block/sda/queue/scheduler为deadline
  • 对写:应用层启用O_DIRECT绕过page cache,或增大vm.dirty_ratio

从那以后我每次做容量评审,都强制走一遍sar -d -f /var/log/sa/sa*的基线分析,哪怕只花15分钟。因为iostat给你的是一张快照,而sa文件里藏着过去30天的完整录像带——故障不会重演,但数据永远诚实。希望帮到你。

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

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

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

立即咨询