VPS 性能监控与告警系统搭建实战 2026 | Prometheus Grafana 完全指南

没有监控的系统就像盲人骑瞎马。性能监控是运维的核心工作,通过监控可以及时发现系统异常、定位性能瓶颈、预防故障发生。本文将从零开始,使用 Prometheus + Grafana + Alertmanager 搭建一套完整的 VPS 监控告警系统。
一、监控系统架构
1.1 整体架构图
┌─────────────────────────────────────────────────────────────┐
│ 监控系统架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 被监控服务器 1 被监控服务器 2 ... │
│ ┌─────────────┐ ┌─────────────┐ │
│ │Node Exporter│ │Node Exporter│ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ └─────────┬──────────┘ │
│ │ :9100 │
│ ▼ │
│ ┌─────────────┐ │
│ │ Prometheus │ ← 数据采集与存储 │
│ └──────┬──────┘ │
│ │ │
│ ┌────────┴────────┐ │
│ ▼ ▼ │
│ ┌───────────┐ ┌──────────────┐ │
│ │ Grafana │ │ Alertmanager │ │
│ │ 可视化面板 │ │ 告警通知 │ │
│ └───────────┘ └──────┬───────┘ │
│ │ │
│ ▼ │
│ 邮件 / 钉钉 / 飞书 │
│ │
└─────────────────────────────────────────────────────────────┘1.2 组件说明
| 组件 | 作用 | 默认端口 |
|---|---|---|
| Prometheus | 时序数据库,抓取并存储指标数据 | 9090 |
| Node Exporter | 采集 Linux 系统指标 | 9100 |
| Grafana | 可视化监控面板 | 3000 |
| Alertmanager | 告警管理与通知 | 9093 |
二、Node Exporter 安装与配置
2.1 安装 Node Exporter
bash
# 下载最新版本
NODE_EXPORTER_VERSION="1.8.2"
wget https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXPORTER_VERSION}/node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz
# 解压
tar xzf node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz
cd node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64
# 安装
cp node_exporter /usr/local/bin/
# 创建用户
useradd -rs /bin/false node_exporter2.2 配置 systemd 服务
ini
# /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--web.listen-address=:9100 \
--collector.systemd \
--collector.processes \
--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|run)($|/)
[Install]
WantedBy=multi-user.targetbash
# 启动服务
systemctl daemon-reload
systemctl start node_exporter
systemctl enable node_exporter
# 验证
curl http://localhost:9100/metrics2.3 常用采集器说明
| 采集器 | 说明 | 默认启用 |
|---|---|---|
| cpu | CPU 使用情况 | ✅ |
| diskstats | 磁盘 I/O 统计 | ✅ |
| filesystem | 文件系统使用 | ✅ |
| loadavg | 系统负载 | ✅ |
| meminfo | 内存使用 | ✅ |
| netstat | 网络统计 | ✅ |
| systemd | systemd 服务状态 | ❌ |
| processes | 进程信息 | ❌ |
三、Prometheus 安装与配置
3.1 安装 Prometheus
bash
PROMETHEUS_VERSION="2.53.0"
wget https://github.com/prometheus/prometheus/releases/download/v${PROMETHEUS_VERSION}/prometheus-${PROMETHEUS_VERSION}.linux-amd64.tar.gz
tar xzf prometheus-${PROMETHEUS_VERSION}.linux-amd64.tar.gz
cd prometheus-${PROMETHEUS_VERSION}.linux-amd64
# 安装二进制
cp prometheus promtool /usr/local/bin/
# 创建目录
mkdir -p /etc/prometheus /var/lib/prometheus
cp prometheus.yml /etc/prometheus/
cp -r consoles console_libraries /etc/prometheus/
# 创建用户
useradd -rs /bin/false prometheus
chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus3.2 配置 prometheus.yml
yaml
# /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
monitor: 'vps-monitor'
# Alertmanager 配置
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
# 告警规则文件
rule_files:
- "rules/*.yml"
# 抓取配置
scrape_configs:
# Prometheus 自身监控
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# Node Exporter - 服务器1
- job_name: 'server1'
static_configs:
- targets: ['192.168.1.101:9100']
labels:
instance: 'web-server'
region: 'us-east'
# Node Exporter - 服务器2
- job_name: 'server2'
static_configs:
- targets: ['192.168.1.102:9100']
labels:
instance: 'db-server'
region: 'us-west'
# 多台服务器配置
- job_name: 'node_exporter'
static_configs:
- targets: ['192.168.1.101:9100', '192.168.1.102:9100']
relabel_configs:
- source_labels: [__address__]
target_label: instance
regex: '([^:]+):\d+'
replacement: '${1}'3.3 配置 systemd 服务
ini
# /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus \
--storage.tsdb.retention.time=30d \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.listen-address=:9090
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.targetbash
# 启动 Prometheus
systemctl daemon-reload
systemctl start prometheus
systemctl enable prometheus
# 验证
curl http://localhost:9090/-/healthy3.4 防火墙配置
bash
# iptables 配置
iptables -A INPUT -p tcp --dport 9090 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 9090 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 9100 -s 192.168.1.100 -j ACCEPT四、Grafana 安装与配置
4.1 安装 Grafana
bash
# 安装 Grafana OSS 版
apt install -y apt-transport-https software-properties-common wget
wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key
echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" > /etc/apt/sources.list.d/grafana.list
apt update
apt install -y grafana
# 启动
systemctl start grafana-server
systemctl enable grafana-server
# 验证
systemctl status grafana-server4.2 配置 Grafana
ini
# /etc/grafana/grafana.ini
[server]
http_port = 3000
domain = grafana.example.com
root_url = https://grafana.example.com
[security]
admin_user = admin
admin_password = your_secure_password
disable_gravatar = true
[auth.anonymous]
enabled = false
[users]
allow_sign_up = false
auto_assign_org = true
auto_assign_org_role = Viewer
[analytics]
reporting_enabled = false
check_for_updates = falsebash
# 重启生效
systemctl restart grafana-server4.3 添加 Prometheus 数据源
- 访问
http://your-server:3000 - 使用 admin / admin 登录(首次登录需修改密码)
- 进入 Connections → Data sources → Add data source
- 选择 Prometheus
- 配置 URL:
http://localhost:9090 - 点击 Save & test
4.4 导入监控面板
推荐的 Node Exporter 面板:
- ID: 1860 — Node Exporter Full(最全的系统监控面板)
- ID: 13978 — Node Exporter Dashboard
- ID: 11074 — 1 Node Exporter for Prometheus Dashboard CN 中文版
bash
# 导入面板方法
# 1. Grafana → Dashboards → Import
# 2. 输入面板 ID(如 1860)
# 3. 选择 Prometheus 数据源
# 4. 点击 Import4.5 监控面板关键指标
| 指标类别 | 关键指标 | PromQL |
|---|---|---|
| CPU | CPU 使用率 | 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) |
| 内存 | 内存使用率 | 100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) |
| 磁盘 | 磁盘使用率 | 100 * (1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) |
| 网络 | 网络入流量 | rate(node_network_receive_bytes_total[5m]) * 8 |
| 系统负载 | 1 分钟负载 | node_load1 |
| 磁盘 I/O | 读延迟 | rate(node_disk_read_time_seconds_total[5m]) / rate(node_disk_reads_completed_total[5m]) |
五、告警规则配置
5.1 主机告警规则
yaml
# /etc/prometheus/rules/host.yml
groups:
- name: host_alert
rules:
# 主机宕机告警
- alert: HostDown
expr: up == 0
for: 2m
labels:
severity: critical
annotations:
summary: "主机 {{ $labels.instance }} 宕机"
description: "主机 {{ $labels.instance }} 已经 2 分钟无法访问"
# CPU 使用率告警
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 10m
labels:
severity: warning
annotations:
summary: "主机 {{ $labels.instance }} CPU 使用率过高"
description: "CPU 使用率超过 85%,当前值: {{ $value | printf \"%.2f\" }}%"
# 内存使用率告警
- alert: HighMemoryUsage
expr: 100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) > 90
for: 10m
labels:
severity: warning
annotations:
summary: "主机 {{ $labels.instance }} 内存使用率过高"
description: "内存使用率超过 90%,当前值: {{ $value | printf \"%.2f\" }}%"
# 磁盘使用率告警
- alert: HighDiskUsage
expr: 100 * (1 - (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"})) > 85
for: 10m
labels:
severity: warning
annotations:
summary: "主机 {{ $labels.instance }} 磁盘使用率过高"
description: "磁盘 {{ $labels.mountpoint }} 使用率超过 85%,当前值: {{ $value | printf \"%.2f\" }}%"
# 系统负载告警
- alert: HighLoadAverage
expr: node_load15 / count by(instance) (node_cpu_seconds_total{mode="idle"}) > 2
for: 15m
labels:
severity: warning
annotations:
summary: "主机 {{ $labels.instance }} 系统负载过高"
description: "15 分钟负载/CPU 核数 > 2,当前值: {{ $value | printf \"%.2f\" }}"
# 磁盘 I/O 告警
- alert: HighDiskIO
expr: rate(node_disk_io_time_seconds_total[5m]) > 0.8
for: 10m
labels:
severity: warning
annotations:
summary: "主机 {{ $labels.instance }} 磁盘 I/O 过高"
description: "磁盘 I/O 利用率超过 80%,当前值: {{ $value | printf \"%.2f\" }}"5.2 服务告警规则
yaml
# /etc/prometheus/rules/service.yml
groups:
- name: service_alert
rules:
# Nginx 进程告警
- alert: NginxDown
expr: node_systemd_unit_state{name="nginx.service", state="active"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Nginx 服务异常"
description: "Nginx 服务已停止运行"
# MySQL 进程告警
- alert: MySQLDown
expr: node_systemd_unit_state{name="mysql.service", state="active"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "MySQL 服务异常"
description: "MySQL 服务已停止运行"
# Docker 进程告警
- alert: DockerDown
expr: node_systemd_unit_state{name="docker.service", state="active"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Docker 服务异常"
description: "Docker 服务已停止运行"5.3 加载告警规则
bash
# 验证规则文件
promtool check rules /etc/prometheus/rules/*.yml
# 热加载配置
curl -X POST http://localhost:9090/-/reload
# 或重启服务
systemctl restart prometheus六、Alertmanager 配置
6.1 安装 Alertmanager
bash
ALERTMANAGER_VERSION="0.27.0"
wget https://github.com/prometheus/alertmanager/releases/download/v${ALERTMANAGER_VERSION}/alertmanager-${ALERTMANAGER_VERSION}.linux-amd64.tar.gz
tar xzf alertmanager-${ALERTMANAGER_VERSION}.linux-amd64.tar.gz
cd alertmanager-${ALERTMANAGER_VERSION}.linux-amd64
cp alertmanager amtool /usr/local/bin/
mkdir -p /etc/alertmanager /var/lib/alertmanager
cp alertmanager.yml /etc/alertmanager/
useradd -rs /bin/false alertmanager
chown -R alertmanager:alertmanager /etc/alertmanager /var/lib/alertmanager6.2 邮件告警配置
yaml
# /etc/alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alert@example.com'
smtp_auth_username: 'alert@example.com'
smtp_auth_password: 'your_smtp_password'
smtp_require_tls: true
templates:
- '/etc/alertmanager/template/*.tmpl'
route:
group_by: ['alertname', 'instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'admin-email'
routes:
- match:
severity: critical
receiver: 'critical-email'
repeat_interval: 1h
- match:
severity: warning
receiver: 'warning-email'
receivers:
- name: 'admin-email'
email_configs:
- to: 'admin@example.com'
send_resolved: true
- name: 'critical-email'
email_configs:
- to: 'oncall@example.com'
send_resolved: true
headers:
Subject: '[CRITICAL] {{ .GroupLabels.alertname }} - {{ .GroupLabels.instance }}'
- name: 'warning-email'
email_configs:
- to: 'dev@example.com'
send_resolved: true6.3 钉钉/Webhook 告警
yaml
# 钉钉 Webhook 告警
receivers:
- name: 'dingtalk'
webhook_configs:
- url: 'https://oapi.dingtalk.com/robot/send?access_token=your_token'
send_resolved: true
http_config:
headers:
Content-Type: application/json6.4 配置 systemd 服务
ini
# /etc/systemd/system/alertmanager.service
[Unit]
Description=Alertmanager
Wants=network-online.target
After=network-online.target
[Service]
User=alertmanager
Group=alertmanager
Type=simple
ExecStart=/usr/local/bin/alertmanager \
--config.file=/etc/alertmanager/alertmanager.yml \
--storage.path=/var/lib/alertmanager \
--web.listen-address=:9093
[Install]
WantedBy=multi-user.targetbash
# 启动
systemctl daemon-reload
systemctl start alertmanager
systemctl enable alertmanager七、常用监控命令
7.1 系统性能查看
bash
# CPU 查看
top
htop
mpstat -P ALL 1 5
# 内存查看
free -h
vmstat 1 5
# 磁盘查看
df -h
du -sh /*
iostat -x 1 5
# 网络查看
netstat -tlnp
ss -tlnp
iftop
nload
# 进程查看
ps aux
pstree
lsof -i :port7.2 日志查看
bash
# 系统日志
journalctl -f
journalctl -u nginx.service -f
# 内核日志
dmesg
dmesg -T | tail -20
# 登录日志
last
lastb
who
w八、PromQL 基础
8.1 常用查询示例
promql
// CPU 使用率
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
// 内存使用率
100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes))
// 磁盘使用率
100 * (1 - (node_filesystem_avail_bytes{fstype!~"tmpfs"} / node_filesystem_size_bytes{fstype!~"tmpfs"}))
// 网络流量(bps)
rate(node_network_receive_bytes_total{device!="lo"}[5m]) * 8
// CPU 负载
node_load1 / count by(instance) (node_cpu_seconds_total{mode="idle"})
// 进程数
node_processes_total
// TCP 连接数
node_netstat_Tcp_CurrEstab8.2 PromQL 函数
| 函数 | 说明 |
|---|---|
rate() | 每秒增长率(适合计数器) |
irate() | 瞬时增长率(更灵敏) |
increase() | 区间增长量 |
sum() | 求和 |
avg() | 平均值 |
max() | 最大值 |
min() | 最小值 |
count() | 计数 |
topk() | 前 N 个 |
rate(node_cpu[5m]) | 5 分钟平均速率 |
九、Docker 容器监控
9.1 cAdvisor 安装
yaml
# docker-compose.yml
version: '3.8'
services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker:/var/lib/docker:ro9.2 Prometheus 配置
yaml
scrape_configs:
- job_name: 'cadvisor'
static_configs:
- targets: ['192.168.1.100:8080']十、最佳实践
10.1 监控原则
- 全面覆盖:CPU、内存、磁盘、网络、进程、服务状态
- 分级告警:信息 → 警告 → 严重 → 紧急
- 合理阈值:根据业务场景设置,避免告警疲劳
- 趋势分析:不仅看当前值,更要看趋势变化
- 自动化:告警自动通知、自动修复
10.2 安全建议
- 不要暴露监控端口到公网:使用防火墙限制访问
- 使用 HTTPS:Grafana 和 Prometheus 配置 SSL
- 设置认证:所有 Web 界面都需要登录
- 最小权限:监控账户只分配必要权限
10.3 性能优化
- 合理设置采集间隔:默认 15s,可按需调整
- 数据保留策略:根据需要设置保留时间
- 降采样:长期存储使用降采样数据
- 分片存储:大规模场景使用远程存储
十一、总结
- ✅ 监控系统架构与组件选型
- ✅ Node Exporter 安装与配置
- ✅ Prometheus 安装与配置
- ✅ Grafana 可视化面板搭建
- ✅ 告警规则配置(主机 + 服务)
- ✅ Alertmanager 告警通知(邮件 + Webhook)
- ✅ 常用监控命令与日志查看
- ✅ PromQL 基础查询
- ✅ Docker 容器监控
- ✅ 监控最佳实践
监控是运维工作的眼睛,建立一套完善的监控告警系统,才能真正做到防患于未然,快速响应和解决问题。
相关阅读: