跳转到内容

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

VPS 性能监控与告警系统

没有监控的系统就像盲人骑瞎马。性能监控是运维的核心工作,通过监控可以及时发现系统异常、定位性能瓶颈、预防故障发生。本文将从零开始,使用 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_exporter

2.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.target
bash
# 启动服务
systemctl daemon-reload
systemctl start node_exporter
systemctl enable node_exporter

# 验证
curl http://localhost:9100/metrics

2.3 常用采集器说明

采集器说明默认启用
cpuCPU 使用情况
diskstats磁盘 I/O 统计
filesystem文件系统使用
loadavg系统负载
meminfo内存使用
netstat网络统计
systemdsystemd 服务状态
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/prometheus

3.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.target
bash
# 启动 Prometheus
systemctl daemon-reload
systemctl start prometheus
systemctl enable prometheus

# 验证
curl http://localhost:9090/-/healthy

3.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-server

4.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 = false
bash
# 重启生效
systemctl restart grafana-server

4.3 添加 Prometheus 数据源

  1. 访问 http://your-server:3000
  2. 使用 admin / admin 登录(首次登录需修改密码)
  3. 进入 Connections → Data sources → Add data source
  4. 选择 Prometheus
  5. 配置 URL: http://localhost:9090
  6. 点击 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. 点击 Import

4.5 监控面板关键指标

指标类别关键指标PromQL
CPUCPU 使用率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/alertmanager

6.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: true

6.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/json

6.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.target
bash
# 启动
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 :port

7.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_CurrEstab

8.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:ro

9.2 Prometheus 配置

yaml
scrape_configs:
  - job_name: 'cadvisor'
    static_configs:
      - targets: ['192.168.1.100:8080']

十、最佳实践

10.1 监控原则

  1. 全面覆盖:CPU、内存、磁盘、网络、进程、服务状态
  2. 分级告警:信息 → 警告 → 严重 → 紧急
  3. 合理阈值:根据业务场景设置,避免告警疲劳
  4. 趋势分析:不仅看当前值,更要看趋势变化
  5. 自动化:告警自动通知、自动修复

10.2 安全建议

  1. 不要暴露监控端口到公网:使用防火墙限制访问
  2. 使用 HTTPS:Grafana 和 Prometheus 配置 SSL
  3. 设置认证:所有 Web 界面都需要登录
  4. 最小权限:监控账户只分配必要权限

10.3 性能优化

  1. 合理设置采集间隔:默认 15s,可按需调整
  2. 数据保留策略:根据需要设置保留时间
  3. 降采样:长期存储使用降采样数据
  4. 分片存储:大规模场景使用远程存储

十一、总结

  • ✅ 监控系统架构与组件选型
  • ✅ Node Exporter 安装与配置
  • ✅ Prometheus 安装与配置
  • ✅ Grafana 可视化面板搭建
  • ✅ 告警规则配置(主机 + 服务)
  • ✅ Alertmanager 告警通知(邮件 + Webhook)
  • ✅ 常用监控命令与日志查看
  • ✅ PromQL 基础查询
  • ✅ Docker 容器监控
  • ✅ 监控最佳实践

监控是运维工作的眼睛,建立一套完善的监控告警系统,才能真正做到防患于未然,快速响应和解决问题。


相关阅读: