sar默认不保存历史网卡流量数据,需启用sysstat服务并配置enabled="true",历史数据按日存于/var/log/sa/sadd,仅含日期不存年月,单位为kb/s且统计l2层总字节。

Linux的sar默认不保存历史网卡流量数据
sar本身只是报告工具,它不会主动记录历史数据——除非你提前配置了sysstat服务并启用数据收集。很多用户执行sar -n DEV 1 5能看到实时流量,但一查sar -n DEV -f /var/log/sa/saXX就报错或显示空,根本原因是sysstat没在运行,或者/etc/sysconfig/sysstat(RHEL/CentOS)或/etc/default/sysstat(Debian/Ubuntu)里ENABLED="false"。
确认是否启用采集:
- 检查服务状态:systemctl is-active sysstat
- 查看配置文件中ENABLED是否为true
- 确认/var/log/sa/下是否有saXX文件(XX为日期,如sa05表示5号)
sar -n DEV查历史流量时必须指定正确日期文件
历史数据按天分片存放在/var/log/sa/,文件名是saDD(DD为日号,不足两位补零)。比如今天是7月12日,想查10号的网卡流量,得用:sar -n DEV -f /var/log/sa/sa10,而不是sa0710或sa20240710——sysstat不存年份和月份,只存日。
常见误操作:
- 用
sar -n DEV -s 09:00 -e 10:00查历史,但没加-f,结果查的是当天实时缓冲区(可能为空) - 手动
cp /var/log/sa/sa10 ./sa10.bak后改名,再-f读取,但sar会校验文件头时间戳,名字不对或时间戳异常会导致解析失败 - 在非root用户下执行
-f读取/var/log/sa/,因权限不足静默失败(无报错,但输出为空)
网卡名在历史记录里可能和ip link看到的不一致
sar -n DEV输出的接口名来自内核采集时刻的/proc/net/dev快照,而现代系统常使用可预测网卡名(如ens33、enp0s3),但某些旧版sysstat或容器环境可能回退为eth0。更关键的是:如果网卡在采集时段内被重命名、UP/DOWN过,sar仍按原始设备名记录,不会自动映射。
验证方法:
- 查当天任意一个
saXX文件:执行sar -n DEV -f /var/log/sa/saXX | head -5,看第一行接口列表 - 对比当前设备:
awk '{print $1}' /proc/net/dev | sed 's/://g' | grep -E '^[a-z]' | sort - 若历史记录里出现
lo但没看到ens33,说明当时该网卡未激活,或sysstat启动晚于网卡UP时间
流量单位是KB/s,不是bps,且默认只统计IPv4+IPv6的L2层收发
sar -n DEV输出的rxkB/s和txkB/s是每秒接收/发送的千字节数(注意是KB,不是KiB;1 KB = 1000 B),不是比特率。它统计的是从网卡驱动上报的原始字节数,包含IP头、TCP头、以太网帧头等所有L2层载荷,不区分上层协议类型。
这意味着:
- 如果你用
iftop看到某连接占10MB/s,sar里对应网卡可能只显示~8.5 MB/s——因为iftop算的是应用层有效载荷,sar算的是链路层总字节 -
sar -n DEV不体现丢包、错误帧、重传,要查这些得用sar -n EDEV - 如果启用了bonding或veth pair,
sar会分别列出物理口和虚拟口,但不会自动聚合,需人工加总
真正麻烦的是:一旦sysstat没开,过去的数据永远丢失;而开了之后,日志默认只保留28天(由/etc/cron.d/sysstat里的run-systemd-cron或sa1脚本控制),超期自动清理。别等出问题才想起来看——先确认ENABLED="true",再盯一眼/var/log/sa/里最近三天有没有新文件。











