【Prometheus 】Prometheus + Docker 监控服务器CPU、内存完整实战
📅 2026/7/22 15:25:55
👁️ 阅读次数
📝 编程学习
Prometheus + Docker 监控服务器CPU、内存完整实战
承接上一篇 Java JVM 监控,这里分两套方案:
- node-exporter(标准方案):采集宿主机整机CPU、内存、磁盘、网络
- 配套 Prometheus 配置、Grafana 面板、CPU/内存告警、Mermaid 流程图
一、整体架构图 Mermaid
node-exporter 专门抓取 Linux 系统层指标:CPU使用率、总内存/可用内存、Swap、磁盘IO、负载等。
二、Docker 部署 node-exporter 🐳
1. 启动 node-exporter 容器
dockerrun-d\--namenode-exporter\--net=host\--pid=host\-v/:/host:ro,rslave\-v/run/udev:/run/udev:ro\quay.io/prometheus/node-exporter:v1.8.2\--path.rootfs=/host--net=host:共享宿主机网络,暴露 9100 端口--pid=host:读取宿主机进程、CPU、内存信息
访问指标地址:http://服务器IP:9100/metrics
三、修改 Prometheus 配置 prometheus.yml
新增抓取 node-exporter 的 job,同时保留之前 Java JVM 任务:
global:scrape_interval:10sevaluation_interval:10srule_files:-"alert-rules.yml"scrape_configs:# 1、Java JVM监控(原有)-job_name:"java-jvm-demo"metrics_path:"/actuator/prometheus"static_configs:-targets:["host.docker.internal:8080"]labels:service:java-app# 2、服务器宿主机监控CPU/内存-job_name:"linux-server-node"static_configs:-targets:["host.docker.internal:9100"]labels:env:production重启 Prometheus 生效:
docker-composerestart prometheus打开 PrometheusStatus -> Targets,看到linux-server-node状态 UP 即采集成功。
四、核心CPU、内存 PromQL 查询语句 📊
1. CPU 使用率(常用)
1)单CPU核心空闲率,计算1分钟内非空闲CPU占比
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)- 结果:0~100,代表整机CPU总使用率
2)各核心CPU使用率
100 - (irate(node_cpu_seconds_total{mode="idle"}[1m]) * 100)3)系统负载 1分钟/5分钟/15分钟
node_load1 node_load5 node_load152. 内存使用率
1)物理内存使用率(百分比)
(1 - node_memory_MemFree_bytes / node_memory_MemTotal_bytes) * 1002)可用内存(MB)
node_memory_MemFree_bytes / 1024 / 10243)Swap交换分区使用率
(1 - node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes) * 100五、Grafana 服务器监控大盘导入
官方 Linux Node 监控模板 ID:1860
- Grafana -> Import,输入 1860
- 数据源选择 Prometheus
自动生成完整面板:
- CPU总使用率、单核曲线、CPU上下文切换
- 内存、Swap、缓存、缓冲区占用
- 磁盘读写、磁盘使用率、网络流量
六、CPU/内存告警规则 alert-rules.yml ⚠️
groups:-name:server-resource-alertrules:# CPU使用率超过85%持续5分钟告警-alert:ServerCpuHighexpr:100-(avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)>85for:5mlabels:severity:warningannotations:summary:"服务器CPU使用率过高"description:"机器{{$labels.instance}} CPU使用率 {{$value}}%,持续超过85%"# 内存使用率超过90%持续3分钟严重告警-alert:ServerMemHighexpr:(1-node_memory_MemFree_bytes / node_memory_MemTotal_bytes) * 100>90for:3mlabels:severity:criticalannotations:summary:"服务器内存占用过高,存在OOM风险"description:"机器{{$labels.instance}} 内存使用率 {{$value}}%"# Swap大量使用,内存不足-alert:ServerSwapUsedexpr:(1-node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes) * 100>50for:2mlabels:severity:warningannotations:summary:"Swap交换分区占用过高"七、整合进 docker-compose.yml(完整容器编排)
原有 compose 增加 node-exporter 服务:
version:'3.8'volumes:prom_data:grafana_data:services:prometheus:image:prom/prometheus:v2.47.0container_name:prometheusports:-"9090:9090"volumes:-./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml-./prometheus/alert-rules.yml:/etc/prometheus/alert-rules.yml-prom_data:/prometheuscommand:-'--config.file=/etc/prometheus/prometheus.yml'-'--storage.tsdb.retention.time=15d'extra_hosts:-"host.docker.internal:host-gateway"restart:unless-stoppedgrafana:image:grafana/grafana:10.2.0container_name:grafanaports:-"3000:3000"volumes:-grafana_data:/var/lib/grafanaenvironment:-GF_SECURITY_ADMIN_USER=admin-GF_SECURITY_ADMIN_PASSWORD=123456depends_on:-prometheusrestart:unless-stopped# 新增:服务器资源采集器node-exporter:image:quay.io/prometheus/node-exporter:v1.8.2container_name:node-exporternetwork_mode:hostpid:hostvolumes:-/:/host:ro,rslave-/run/udev:/run/udev:rocommand:---path.rootfs=/hostrestart:unless-stopped一键启动:
docker-composeup-d八、常见问题 💡
- Targets 显示 DOWN
- Linux 环境不能用
host.docker.internal,target 改为172.17.0.1:9100 - 防火墙放行 9100、9090、3000 端口
- Linux 环境不能用
- CPU 指标全为0
node-exporter 必须加--net=host --pid=host才能读取宿主机硬件数据 - 内存指标不准
使用node_memory_MemFree_bytes,不要用缓存内存做判断
九、区分两个监控范围(重点)
- node-exporter:服务器整机CPU、内存、磁盘、系统负载
- SpringBoot actuator/prometheus:单个Java进程JVM堆、GC、线程、应用CPU占用
两者搭配使用,既能看机器资源,又能定位是哪个Java服务吃光CPU/内存。
编程学习
技术分享
实战经验