sysstat 是 Linux 系统下非常强大的性能监控工具集,它包含了多个用于收集、分析和报告系统性能的工具。在麒麟系统中,它主要包含 sar(系统活动报告)、iostat(I/O 统计)、mpstat(CPU 统计)和 pidstat(进程统计)等核心工具。

安装

  1. # centos、麒麟等
  2. yum install sysstat -y
  3. # ubuntu等
  4. apt install sysstat -y
  5. # 状态
  6. systemctl status sysstat
  7. # 历史路径
  8. ll /var/log/sa/ RHEL
  9. ll /var/log/sysstat ubuntu
  10. # 可能有定时任务(ubuntu有,centos目前没有)
  11. ll /etc/cron.d/sysstat
  12. vi /etc/cron.d/sysstat
  13. # 以下表示:在每小时的第 5 分钟到第 55 分钟之间,每隔 10 分钟执行一次2。也就是会在每小时的 05、15、25、35、45、55分 触发。(定时任务顺序:分、时、天、月、星期)
  14. 5-55/10 * * * * root command
  15. #默认保留时间
  16. RHEL/CentOS 系列:默认通常保留 28天。
  17. Ubuntu/Debian 系列:默认通常保留 7天。
  18. # CentOS/RHEL:
  19. vi /etc/sysconfig/sysstat
  20. # 开启历史记录
  21. ENABLED="true"
  22. # 保留时间(默认为28天)
  23. HISTORY=90
  24. # 自动压缩(默认为31天)
  25. COMPRESSAFTER=30
  26. # Ubuntu/Debian:
  27. vi /etc/default/sysstat
  28. # 开启历史记录(默认开启了)
  29. ENABLED="true"
  30. vi /etc/sysstat/sysstat
  31. # 保留时间(默认为7天)
  32. HISTORY=90
  33. # 自动压缩(默认为10天)
  34. COMPRESSAFTER=30
  35. # 设置开机启动
  36. systemctl enable sysstat
  37. # 重启配置生效
  38. systemctl restart sysstat

  1. # 在较新的 Ubuntu 系统中,数据采集可能由 systemd timer 接管。请检查以下定时器的状态:
  2. systemctl status sysstat-collect.timer
  3. # 如果显示为 inactive 或 failed,请尝试启用并启动它:
  4. systemctl enable --now sysstat-collect.timer

参数说明

  1. COMPRESSAFTER=10 这个参数的意思是:超过 10 天的 sar 历史日志文件将被自动压缩。

以下是 sysstat 工具集的详细用法指南:

1. 启用历史数据采集(重要)

安装后,系统默认可能不会自动记录历史数据。您需要手动开启并启动服务,以便后续查看历史状态:

  1. # 编辑配置文件,将 ENABLED="false" 改为 ENABLED="true"
  2. sudo vi /etc/sysconfig/sysstat
  3. # 启动服务并设置开机自启
  4. sudo systemctl enable sysstat && sudo systemctl start sysstat

开启后,系统会默认每 10 分钟采集一次快照,历史数据文件通常保存在 /var/log/sa/ 目录下(文件名格式如 sa05 代表当月 5 号的数据)。

2. sar 命令:综合系统资源统计

sarsysstat 的核心工具,支持实时监控和历史数据回溯。

  • 查看 CPU 使用率(实时每秒刷新,共 5 次):
    1. sar -u 1 5
  • 查看内存使用情况
    1. sar -r 1 5
  • 查看网络吞吐量(网卡收发流量):
    1. sar -n DEV 1 5
  • 查看历史某天的网络吞吐情况(例如查看本月 10 号的数据):
    1. sar -n DEV -f /var/log/sa/sa06
    2. # ubuntu
    3. sar -n DEV -f /var/log/sysstat/sa20260606
  • 查看磁盘 I/O 统计
    1. sar -b 1 5

3. mpstat 命令:多核 CPU 统计

用于查看每个 CPU 核心的使用率,帮助定位是否存在“单核跑满”而整体负载不高的情况。

  • 查看所有 CPU 核心的实时状态(每秒刷新,共 2 次):
    1. mpstat -P ALL 1 2
    输出中的 %usr 表示用户态 CPU 使用率,%sys 表示内核态,%idle 表示空闲率。

4. iostat 命令:磁盘 I/O 性能分析

用于监控磁盘的读写速度和 IOPS,排查磁盘瓶颈。

  • 查看磁盘 I/O 统计
    1. iostat -x 1 3
    重点关注 %util(磁盘使用率,接近 100% 说明磁盘饱和)和 await(I/O 请求平均等待时间)。

5. pidstat 命令:进程级别监控

当发现系统整体 CPU 或内存占用过高时,用此命令精准定位是哪个进程(PID)导致的。

  • 监控 CPU 使用率最高的进程
    1. pidstat -u 1 5
  • 监控磁盘 I/O 最高的进程
    1. pidstat -d 1 5
  • 监控内存使用情况
    1. pidstat -r 1 5

💡 总结建议: 日常排查问题时,您可以按照这个思路:先用 sar 看整体系统负载,再用 mpstat 看 CPU 核心分布,用 iostat 看磁盘是否卡顿,最后用 pidstat 揪出消耗资源的“罪魁祸首”进程。


需要我帮你写一个定时任务脚本,每天自动记录网络流量到日志文件里吗?

  1. #!/bin/bash
  2. # --- 配置部分 ---
  3. LOG_DIR="/var/log/network_traffic"
  4. mkdir -p $LOG_DIR
  5. DATE_STR=$(date +%Y-%m-%d)
  6. TIME_STR=$(date +%H:%M:%S)
  7. LOG_FILE="$LOG_DIR/network_${DATE_STR}.log"
  8. # 自动获取主网卡名称
  9. NET_IF=$(ip route | awk '/default/ {print $5; exit}')
  10. # --- 核心逻辑:计算昨天的全天总流量 ---
  11. # 1. 获取昨天的日期数字(例如今天是5号,则获取04)。兼容每月1号的跨月情况
  12. YESTERDAY_NUM=$(date -d "yesterday" +"%d")
  13. # 2. 定义昨天的 sar 二进制日志路径
  14. SAR_FILE="/var/log/sa/sa${YESTERDAY_NUM}"
  15. # 3. 检查文件是否存在
  16. if [ ! -f "$SAR_FILE" ]; then
  17. echo "[错误] 未找到昨日的系统活动记录文件: $SAR_FILE" >> $LOG_FILE
  18. # 如果文件不存在,将总量设为0避免API报错
  19. TOTAL_KB="0"
  20. else
  21. # 4. 使用 sar 读取昨日文件,通过 awk 累加 rxkB/s($5) 和 txkB/s($6)
  22. # sysstat 默认每10分钟采样一次,一天大约有144条数据
  23. # 注意:这里累加的是 KB/s 的值,代表该时间段内的平均速率总和,用于反映整体流量趋势
  24. TOTAL_KB=$(sar -n DEV -f "$SAR_FILE" | grep "$NET_IF" | grep -v "Average" | \
  25. awk '{sum += ($5 + $6) * 600} END {printf "%.2f", sum}')
  26. fi
  27. # --- 日志记录 ---
  28. echo "======================= 每日网络流量监测 =======================" >> $LOG_FILE
  29. echo "【监测时间】 $(date '+%Y-%m-%d %H:%M:%S')" >> $LOG_FILE
  30. echo "【统计对象】 昨日 (sa${YESTERDAY_NUM}) 主网卡: $NET_IF" >> $LOG_FILE
  31. echo "---------------------------------------------------------------" >> $LOG_FILE
  32. echo "【昨日累计流量指标】 ${TOTAL_KB} KB/s" >> $LOG_FILE
  33. echo "===============================================================" >> $LOG_FILE
  34. # --- API 上报逻辑 ---
  35. BASE_API_URL="http://abc.lisonkk.com/wkapi?aid=1122&cid=5"
  36. API_URL="${BASE_API_URL}&totalkb=${TOTAL_KB}"
  37. echo "正在上报昨日数据,总量指标: ${TOTAL_KB} ..."
  38. res=$(curl -ks -X GET "$API_URL")
  39. echo "接口返回:"
  40. echo "$res"