文章目录
Prometheus 监控 Ubuntu Server 全栈实战:Node Exporter 驱动的高性能服务器可观测体系
在 Linux 服务器监控领域,Node Exporter 是 Prometheus 生态中最核心、最广泛的组件。它可以将 Ubuntu Server 的 CPU、内存、磁盘、网络、系统负载以及 systemd 服务状态等关键指标暴露为 Prometheus 格式,再结合 Grafana 仪表盘与告警规则,形成一条从硬件健康到服务状态的完整观测链。本文将带你从部署到高阶调优,一步到位地掌控你的 Ubuntu 服务器。
1. 为什么需要专门监控 Ubuntu Server?
- 资源瓶颈早发现:CPU 持续高负载、内存泄漏、磁盘 I/O 饱和或空间耗尽,在影响业务前预警。
- 服务状态透明化:通过
systemd收集器,可实时监控任意 systemd 服务的存活、重启次数。 - 硬件故障预测:磁盘 SMART 数据、传感器温度、RAID 状态等硬件级指标(配合
textfile采集)。 - 网络流量与错误:结合
node_network_*指标可直观定位 DDoS、带宽瓶颈或网卡异常。 - 合规与容量规划:长期趋势数据支撑资源扩容或迁移决策。
2. 部署 Node Exporter
Node Exporter 官方推荐以非 root 用户运行,监听在 9100 端口,通过 /metrics 提供指标。
2.1 使用官方二进制(推荐)
# 获取最新版(以 1.7.0 为例)
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xzf node_exporter-1.7.0.linux-amd64.tar.gz
cd node_exporter-1.7.0.linux-amd64
sudo cp node_exporter /usr/local/bin/
创建专用系统用户:
sudo useradd --no-create-home --shell /bin/false node_exporter
创建 systemd 服务文件 /etc/systemd/system/node_exporter.service:
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.systemd \
--collector.textfile.directory=/var/lib/node_exporter/textfile_collector \
--web.listen-address=:9100
[Install]
WantedBy=multi-user.target
创建 textfile 目录并设置权限:
sudo mkdir -p /var/lib/node_exporter/textfile_collector
sudo chown -R node_exporter:node_exporter /var/lib/node_exporter
启动并设置开机自启:
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
systemctl status node_exporter --no-pager
访问 http://<server_ip>:9100/metrics 确认指标输出。
2.2 使用 apt 安装(版本可能较老)
sudo apt update
sudo apt install prometheus-node-exporter
sudo systemctl enable --now prometheus-node-exporter
但通常建议使用官方最新二进制,以获取更多 collector 支持。
2.3 安全加固
- 防火墙仅允许 Prometheus 服务器 IP 访问 9100 端口:
sudo ufw allow from 10.0.0.100 to any port 9100 - 或通过反向代理(Nginx/Caddy)添加 TLS 和 Basic Auth,Node Exporter 本身不支持认证。
3. 配置 Prometheus 抓取
在 prometheus.yml 中添加 Job:
scrape_configs:
- job_name: 'ubuntu_servers'
scrape_interval: 15s
static_configs:
- targets:
- '192.168.1.10:9100'
- '192.168.1.11:9100'
labels:
env: 'production'
team: 'backend'
重载 Prometheus 后,即可在 UI 中查询 node_cpu_seconds_total 等指标。
4. 核心监控指标与 PromQL
| 监控目标 | 关键指标 | PromQL 示例 |
|---|---|---|
| CPU 使用率 | node_cpu_seconds_total{mode!="idle"} | 100 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 |
| 内存使用率 | node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes | (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 |
| 磁盘使用率 | node_filesystem_avail_bytes{mountpoint="/"} | (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 |
| 磁盘 I/O | node_disk_io_time_seconds_total | rate(node_disk_io_time_seconds_total[5m]) * 100 (百分比) |
| 网络流量 | node_network_receive_bytes_total / node_network_transmit_bytes_total | rate(node_network_receive_bytes_total{device="eth0"}[1m]) * 8 (bps) |
| 网络错误 | node_network_receive_errs_total | rate(node_network_receive_errs_total{device="eth0"}[5m]) |
| 系统负载 | node_load1 / node_load5 / node_load15 | 直接查看,结合 CPU 核数判断 |
| 系统运行时间 | node_boot_time_seconds | time() - node_boot_time_seconds |
| systemd 服务状态 | node_systemd_unit_state | node_systemd_unit_state{name="nginx.service",state="active"} |
| 打开文件数 | node_filefd_allocated / node_filefd_maximum | (node_filefd_allocated / node_filefd_maximum) * 100 |
关键提醒:
node_cpu_seconds_total{mode="idle"}的rate计算可以分核心或整体平均。- 磁盘使用率务必关注
mountpoint标签,排除tmpfs和/boot等不关心的分区。 - systemd 收集器需要
--collector.systemd启动参数,且 Node Exporter 需有权限访问 D-Bus(用User=node_exporter一般可满足,也可加--collector.systemd.unit-whitelist=.+控制范围)。
5. Grafana 仪表盘推荐
直接导入社区仪表盘,零改动适配:
- 1860(Node Exporter Full):最全面,涵盖 CPU、内存、磁盘、网络、文件系统、中断、上下文切换等。
- 16098(Node Exporter / Systemd):包含 systemd 服务状态监控面板,可直观查看服务启停。
- 405(Node Exporter Server Stats):轻量概览。
导入后只需修改数据源和调整 instance 变量,即可完美展示 Ubuntu 服务器的各项健康指标。
6. 告警规则实战
groups:
- name: ubuntu_server_alerts
rules:
- alert: InstanceDown
expr: up{job="ubuntu_servers"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "服务器 {{ $labels.instance }} 失联"
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
for: 5m
labels:
severity: warning
annotations:
summary: "CPU 使用率持续超过 90%"
- alert: HighMemoryUsage
expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 90
for: 5m
labels:
severity: warning
annotations:
summary: "可用内存不足 10%"
- alert: DiskSpaceRunningOut
expr: (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 > 85
for: 5m
labels:
severity: critical
annotations:
summary: "根分区使用率超过 85%"
- alert: DiskReadLatencyHigh
expr: rate(node_disk_read_time_seconds_total[5m]) > 0.1
for: 10m
labels:
severity: warning
annotations:
summary: "磁盘读延迟升高"
- alert: ServiceDown
expr: node_systemd_unit_state{state="active"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "systemd 服务 {{ $labels.name }} 已停止"
- alert: TooManyOpenFiles
expr: (node_filefd_allocated / node_filefd_maximum) * 100 > 80
for: 5m
labels:
severity: warning
annotations:
summary: "文件描述符使用率超过 80%"
可根据实际业务调整阈值和探测频率。
7. 进阶:自定义指标与硬件监控
7.1 Textfile Collector
通过 cron 任务或守护脚本将自定义指标写入 /var/lib/node_exporter/textfile_collector/*.prom 文件,格式为 Prometheus 指标文本。Node Exporter 会自动加载这些指标。
示例:监控本地证书有效期
#!/bin/bash
FILE=/var/lib/node_exporter/textfile_collector/cert_expiry.prom
EXPIRY=$(openssl x509 -enddate -noout -in /etc/ssl/certs/my.crt | cut -d= -f2)
SECS_LEFT=$(( $(date -d "$EXPIRY" +%s) - $(date +%s) ))
echo "cert_expiry_seconds $SECS_LEFT" > $FILE.tmp && mv $FILE.tmp $FILE
每分钟执行一次,即可在 Prometheus 中查询 cert_expiry_seconds。
7.2 磁盘 SMART 监控
利用 smartctl 命令采集磁盘健康状态和温度,通过 textfile collector 暴露。社区已有现成脚本 smartctl_exporter 或 node_exporter-smartmon。
7.3 进程监控
配合 process-exporter 可监控特定进程存活和数量,但系统级 systemd 已能覆盖大部分场景。
8. 性能调优与多机管理
- 降低采集频率:生产环境 15~30s 足够,网络延迟大时可放宽到 60s。
- 按需禁用收集器:启动时追加
--no-collector.xxx减少无用指标,降低 CPU 开销(例如不关心 CPU 调频可--no-collector.cpufreq)。 - 多台 Ubuntu 服务器:使用 Prometheus 的
file_sd或基于 DNS 的服务发现统一管理 targets。 - 标签规划:务必在
static_configs中打上env、role、datacenter等标签,便于多维度聚合告警。
9. 安全清单
- Node Exporter 监听地址默认
0.0.0.0,必要时改为127.0.0.1再通过反向代理暴露。 - 使用防火墙或 iptables 限制访问来源。
- 如果必须公网暴露,组合使用 Nginx 反代 + TLS + HTTP Basic Auth。
- 定期更新 Node Exporter 版本,关注安全公告。
一旦完成这套监控体系部署,你的每一台 Ubuntu Server 都将从“黑盒”变为完全透明的可观测节点。CPU 尖刺、内存泄漏、磁盘爆满、关键服务停止等故障都能在几秒到几分钟内被捕捉,并结合 Grafana 美观的面板和 Alertmanager 的告警通知,真正实现从被动救火到主动预警的运维升级。


392

被折叠的 条评论
为什么被折叠?



