linux中用sar查历史文件句柄消耗需依赖sar -v采集的file-nr指标,它表示已分配文件句柄总数,须确认sysstat启用-v采集且日志存在;否则无法回溯,仅能临时快照。

Linux 中用 sar 检查历史文件句柄(file handle)消耗情况,核心是查看内核中 file-nr 指标——它反映当前已分配的文件句柄总数、已使用数和最大可分配数。但需注意:sar 默认不记录该指标的历史数据,必须确保 sysstat 已启用对应采集项,且日志文件中实际存有 -v 报告内容。
✅ 确认历史数据是否可用
file-nr 属于内核表统计,由 sar -v 报告输出。要查历史,先验证 /var/log/sa/ 下是否有带 -v 数据的日志:
# 查看今天日志是否含 file-nr 字段(字段顺序通常为:time inode-nr file-nr pty-nr dentunusd) sar -v -f /var/log/sa/sa$(date +%d) | head -5
若输出中出现类似:
14:00:01 inode-nr file-nr pty-nr dentunusd 14:10:01 123456 8920 12 45678
说明采集正常;否则需检查配置。
⚠️ 常见问题:
/etc/sysconfig/sysstat(RHEL/CentOS)或/etc/default/sysstat(Debian/Ubuntu)中未启用ENABLED="true",或 cron 任务未运行sa1。默认sa1每10分钟执行一次,但-v采集需显式支持(多数现代 sysstat 版本默认开启)。
? 查看某天的文件句柄历史趋势
# 查看昨日的 file-nr 变化(只显示时间 + file-nr 列)
sar -v -f /var/log/sa/sa$(date -d 'yesterday' +%d) | awk '$1 ~ /^[0-9]/ {print $1, $3}' | column -t
# 查看当日峰值(按 file-nr 第二列排序取最大)
sar -v -f /var/log/sa/sa$(date +%d) | awk '$1 ~ /^[0-9]/ {print $3}' | sort -n | tail -1
字段说明(sar -v 输出):
-
file-nr:第二个数字,表示当前已分配的文件句柄总数(即cat /proc/sys/fs/file-nr的第一个值) - 它接近系统上限(
cat /proc/sys/fs/file-max)时,可能触发 “Too many open files” 错误。
? 结合上限判断是否紧张
单纯看 file-nr 数值不够,需对比系统上限:
# 获取当日最大 file-nr 值和系统上限
MAX=$(sar -v -f /var/log/sa/sa$(date +%d) 2>/dev/null | awk '$1 ~ /^[0-9]/ {max=$3>max?$3:max} END{print max}')
LIMIT=$(cat /proc/sys/fs/file-max 2>/dev/null)
echo "Peak file handles: $MAX / $LIMIT ($(awk "BEGIN {printf \"%.1f\", $MAX*100/$LIMIT}")%)"
- 若利用率长期 > 85%,建议排查泄漏进程(如
lsof -u <user> | wc -l</user>或lsof | awk '{print $2}' | sort | uniq -c | sort -nr | head -5)。
? 补充:手动补采(无历史时)
若日志缺失 -v 数据,可临时开启并保存:
# 立即采集一次 -v 数据到新文件 sar -v 1 1 -o /tmp/sar_v_now # 读取(明文不可读,需用 sar -v -f 解析) sar -v -f /tmp/sar_v_now
但此法仅得当前快照,无法回溯。长期监控仍需确保 sysstat 服务稳定运行且 -v 采集未被禁用。
不复杂但容易忽略:file-nr 是累计分配量,不是瞬时打开数;真正体现“压力”的是其与 file-max 的比值,而非绝对值。











