sysstat 是 Linux 系统下非常强大的性能监控工具集,它包含了多个用于收集、分析和报告系统性能的工具。在麒麟系统中,它主要包含 sar(系统活动报告)、iostat(I/O 统计)、mpstat(CPU 统计)和 pidstat(进程统计)等核心工具。
安装
# centos、麒麟等yum install sysstat -y# ubuntu等apt install sysstat -y# 状态systemctl status sysstat# 历史路径ll /var/log/sa/ RHELll /var/log/sysstat ubuntu# 可能有定时任务(ubuntu有,centos目前没有)ll /etc/cron.d/sysstatvi /etc/cron.d/sysstat# 以下表示:在每小时的第 5 分钟到第 55 分钟之间,每隔 10 分钟执行一次2。也就是会在每小时的 05、15、25、35、45、55分 触发。(定时任务顺序:分、时、天、月、星期)5-55/10 * * * * root command#默认保留时间RHEL/CentOS 系列:默认通常保留 28天。Ubuntu/Debian 系列:默认通常保留 7天。# CentOS/RHEL:vi /etc/sysconfig/sysstat# 开启历史记录ENABLED="true"# 保留时间(默认为28天)HISTORY=90# 自动压缩(默认为31天)COMPRESSAFTER=30# Ubuntu/Debian:vi /etc/default/sysstat# 开启历史记录(默认开启了)ENABLED="true"vi /etc/sysstat/sysstat# 保留时间(默认为7天)HISTORY=90# 自动压缩(默认为10天)COMPRESSAFTER=30# 设置开机启动systemctl enable sysstat# 重启配置生效systemctl restart sysstat
# 在较新的 Ubuntu 系统中,数据采集可能由 systemd timer 接管。请检查以下定时器的状态:systemctl status sysstat-collect.timer# 如果显示为 inactive 或 failed,请尝试启用并启动它:systemctl enable --now sysstat-collect.timer
参数说明
COMPRESSAFTER=10 这个参数的意思是:超过 10 天的 sar 历史日志文件将被自动压缩。
以下是 sysstat 工具集的详细用法指南:
1. 启用历史数据采集(重要)
安装后,系统默认可能不会自动记录历史数据。您需要手动开启并启动服务,以便后续查看历史状态:
# 编辑配置文件,将 ENABLED="false" 改为 ENABLED="true"sudo vi /etc/sysconfig/sysstat# 启动服务并设置开机自启sudo systemctl enable sysstat && sudo systemctl start sysstat
开启后,系统会默认每 10 分钟采集一次快照,历史数据文件通常保存在 /var/log/sa/ 目录下(文件名格式如 sa05 代表当月 5 号的数据)。
2. sar 命令:综合系统资源统计
sar 是 sysstat 的核心工具,支持实时监控和历史数据回溯。
- 查看 CPU 使用率(实时每秒刷新,共 5 次):
sar -u 1 5
- 查看内存使用情况:
sar -r 1 5
- 查看网络吞吐量(网卡收发流量):
sar -n DEV 1 5
- 查看历史某天的网络吞吐情况(例如查看本月 10 号的数据):
sar -n DEV -f /var/log/sa/sa06# ubuntusar -n DEV -f /var/log/sysstat/sa20260606
- 查看磁盘 I/O 统计:
sar -b 1 5
3. mpstat 命令:多核 CPU 统计
用于查看每个 CPU 核心的使用率,帮助定位是否存在“单核跑满”而整体负载不高的情况。
- 查看所有 CPU 核心的实时状态(每秒刷新,共 2 次):
输出中的mpstat -P ALL 1 2
%usr表示用户态 CPU 使用率,%sys表示内核态,%idle表示空闲率。
4. iostat 命令:磁盘 I/O 性能分析
用于监控磁盘的读写速度和 IOPS,排查磁盘瓶颈。
- 查看磁盘 I/O 统计:
重点关注iostat -x 1 3
%util(磁盘使用率,接近 100% 说明磁盘饱和)和await(I/O 请求平均等待时间)。
5. pidstat 命令:进程级别监控
当发现系统整体 CPU 或内存占用过高时,用此命令精准定位是哪个进程(PID)导致的。
- 监控 CPU 使用率最高的进程:
pidstat -u 1 5
- 监控磁盘 I/O 最高的进程:
pidstat -d 1 5
- 监控内存使用情况:
pidstat -r 1 5
💡 总结建议:
日常排查问题时,您可以按照这个思路:先用 sar 看整体系统负载,再用 mpstat 看 CPU 核心分布,用 iostat 看磁盘是否卡顿,最后用 pidstat 揪出消耗资源的“罪魁祸首”进程。
需要我帮你写一个定时任务脚本,每天自动记录网络流量到日志文件里吗?
#!/bin/bash# --- 配置部分 ---LOG_DIR="/var/log/network_traffic"mkdir -p $LOG_DIRDATE_STR=$(date +%Y-%m-%d)TIME_STR=$(date +%H:%M:%S)LOG_FILE="$LOG_DIR/network_${DATE_STR}.log"# 自动获取主网卡名称NET_IF=$(ip route | awk '/default/ {print $5; exit}')# --- 核心逻辑:计算昨天的全天总流量 ---# 1. 获取昨天的日期数字(例如今天是5号,则获取04)。兼容每月1号的跨月情况YESTERDAY_NUM=$(date -d "yesterday" +"%d")# 2. 定义昨天的 sar 二进制日志路径SAR_FILE="/var/log/sa/sa${YESTERDAY_NUM}"# 3. 检查文件是否存在if [ ! -f "$SAR_FILE" ]; thenecho "[错误] 未找到昨日的系统活动记录文件: $SAR_FILE" >> $LOG_FILE# 如果文件不存在,将总量设为0避免API报错TOTAL_KB="0"else# 4. 使用 sar 读取昨日文件,通过 awk 累加 rxkB/s($5) 和 txkB/s($6)# sysstat 默认每10分钟采样一次,一天大约有144条数据# 注意:这里累加的是 KB/s 的值,代表该时间段内的平均速率总和,用于反映整体流量趋势TOTAL_KB=$(sar -n DEV -f "$SAR_FILE" | grep "$NET_IF" | grep -v "Average" | \awk '{sum += ($5 + $6) * 600} END {printf "%.2f", sum}')fi# --- 日志记录 ---echo "======================= 每日网络流量监测 =======================" >> $LOG_FILEecho "【监测时间】 $(date '+%Y-%m-%d %H:%M:%S')" >> $LOG_FILEecho "【统计对象】 昨日 (sa${YESTERDAY_NUM}) 主网卡: $NET_IF" >> $LOG_FILEecho "---------------------------------------------------------------" >> $LOG_FILEecho "【昨日累计流量指标】 ${TOTAL_KB} KB/s" >> $LOG_FILEecho "===============================================================" >> $LOG_FILE# --- API 上报逻辑 ---BASE_API_URL="http://abc.lisonkk.com/wkapi?aid=1122&cid=5"API_URL="${BASE_API_URL}&totalkb=${TOTAL_KB}"echo "正在上报昨日数据,总量指标: ${TOTAL_KB} ..."res=$(curl -ks -X GET "$API_URL")echo "接口返回:"echo "$res"
