Java服务器在Linux上应通过sysstat的sar工具长期监控性能:先安装并启用自动采集,再开启进程级统计以追踪Java进程CPU/内存占用,最后用sar/sadf从二进制日志中定向提取历史指标。

Java 服务器在 Linux 上长期监控 CPU、内存和磁盘性能,不能靠 Java 应用自身“调用 sar”,而要依靠系统级工具 sar(属于 sysstat)持续采集并保存历史数据,再按需回溯分析。关键在于:启用自动日志收集 + 正确配置进程级采集(可选但推荐)+ 定向提取与 Java 相关的指标。
确保 sysstat 已安装并开启自动采集
这是所有后续分析的前提:
- 安装 sysstat:
sudo yum install -y sysstat(CentOS/RHEL)或sudo apt install -y sysstat(Debian/Ubuntu) - 确认服务已启用并运行:
sudo systemctl enable sysstat && sudo systemctl start sysstat - 默认每 10 分钟采集一次系统级指标(CPU、内存、磁盘 I/O、网络等),数据存于
/var/log/sa/saDD(DD 为日期,如 sa13 表示 13 号) - 检查是否正常写入:
ls -lt /var/log/sa/sa*应看到最近日期的文件持续更新
针对性采集 Java 进程相关资源(需显式启用)
sar 默认不记录进程级数据(如某个 Java 进程的 %CPU、%MEM)。若想追踪特定 Java 应用的历史资源占用,必须开启进程统计:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 编辑配置文件:
• CentOS/RHEL:sudo vi /etc/sysconfig/sysstat
• Debian/Ubuntu:sudo vi /etc/default/sysstat
将ENABLE_PROCESS_STATS=false改为true;或旧版本中设置SA1_OPTIONS="-S ALL" - 重启服务:
sudo systemctl restart sysstat - 验证是否生效:运行
sadf -d /var/log/sa/sa$(date +%d) -- -p | head -5(需 sysstat ≥ 12.0)
若输出含PID、COMMAND、%CPU、%MEM字段,说明进程数据已记录 - 注意:Java 进程通常以
java或自定义 jar 名(如app.jar)出现在 COMMAND 列,可用grep java筛选
按需提取 Java 服务器的历史性能数据
不用实时盯屏,而是从二进制日志中定向查询过去某时段的关键指标:
立即学习“Java免费学习笔记(深入)”;
-
CPU 使用趋势:
sar -u -f /var/log/sa/sa12 | grep -E "^[0-9]"(查 12 号全天 CPU 平均值)
想看 Java 进程独占 CPU 情况?配合进程采集后:sadf -d /var/log/sa/sa12 -- -p | grep "java" | awk '{print $1,$2,$10,$11}'(时间、PID、%CPU、%MEM) -
内存使用情况:
sar -r -f /var/log/sa/sa12查系统整体内存(kbmemfree/kbmemused)
若启用了进程采集,同样用sadf -d ... -- -p | grep java提取其内存占比 -
磁盘 I/O 压力:
sar -d -f /var/log/sa/sa12 | grep -E "(DEV|sda|nvme)"查磁盘读写速率(rkB/s, wkB/s)、队列长度(aqu-sz)
Java 应用若大量写日志或操作数据库,这些值会明显升高
结合 Java 进程 ID(PID)做精准关联分析
单纯看 “java” 可能匹配多个 JVM 实例。更可靠的方式是绑定具体 PID:
- 先查当前 Java 进程 PID:
pgrep -f "spring-boot" || jps -l - 在历史日志中定位该 PID:
sadf -d /var/log/sa/sa10 -- -p | awk -v pid=12345 '$2 == pid {print}'
(假设 PID 是 12345,sa10 是目标日期日志) - 可导出 CSV 便于绘图:
sadf -d /var/log/sa/sa10 -- -p | awk -F' ' '$2==12345 {printf "%s %s %.2f %.2f\n", $1,$2,$10,$11}' > java-pid12345.csv


















