背景本地化部署需要监控服务器性能。所以才用了此方案。
- 系统信息查看
# 系统架构信息查询
$ uname -m
如果输出 x86_64 → 要下 linux-amd64 版本
如果输出 aarch64 → 要下 linux-arm64 版本
- 下载node_exporter

image.png
- scp 服务器位置 通常/usr/local/
- 安装服务
# 解压缩
$ tar -xvf node_exporter-1.8.2.linux-arm64.tar.gz
# 文件夹迁移
$ sudo mv node_exporter-1.8.2.linux-arm64/node_exporter /usr/local/bin/
# 设置 执行权限
$ sudo chmod +x /usr/local/bin/node_exporter
# 重建 systemd服务
$ sudo tee /etc/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=nobody
ExecStart=/usr/local/bin/node_exporter --web.listen-address=:9100
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 重新加载并启动
$ sudo systemctl daemon-reload
$ sudo systemctl enable node_exporter
$ sudo systemctl start node_exporter
$ sudo systemctl status node_exporter
- 创建 Top 10 CPU / 内存 / 硬盘指标脚本
准备目录与权限
$ sudo mkdir -p /var/lib/node_exporter/textfile_collector
$ sudo chown -R root:root /var/lib/node_exporter/textfile_collector
# 文件 见下文
$ sudo chmod +x /var/lib/node_exporter/textfile_collector/top_metrics.sh
在 /var/lib/node_exporter/textfile_collector/top_metrics.sh:
#!/bin/bash
OUTPUT="/var/lib/node_exporter/textfile_collector/top_metrics.prom.tmp"
> "$OUTPUT"
############################
# 1. 总 CPU 使用率
############################
CPU_TOTAL=$(top -bn1 | awk '/Cpu\(s\)/ {print 100 - $8}')
echo "cpu_total_usage $CPU_TOTAL" >> "$OUTPUT"
############################
# 2. 总内存占用
############################
MEM_TOTAL=$(free | awk '/Mem:/ {printf "%.2f", $3/$2*100}')
MEM_USED_MB=$(free -m | awk '/Mem:/ {print $3}')
echo "mem_total_usage $MEM_TOTAL" >> "$OUTPUT"
echo "mem_total_used_mb $MEM_USED_MB" >> "$OUTPUT"
############################
# 3. 硬盘使用率
############################
df -h --output=target,pcent | tail -n +2 | while read MOUNT PCT; do
PCT=${PCT//%/}
echo "disk_usage{mount=\"$MOUNT\"} $PCT" >> "$OUTPUT"
done
############################
# 4. Top 10 CPU 进程
############################
ps -eo pid,comm,%cpu --sort=-%cpu | head -n 11 | awk 'NR>1 {
printf "process_cpu_usage{pid=\"%s\",process=\"%s\"} %s\n",$1,$2,$3
}' >> "$OUTPUT"
############################
# 5. Top 10 内存进程(占比 + 实际使用量 MB)
############################
ps -eo pid,comm,%mem --sort=-%mem | head -n 11 | awk 'NR>1 {
printf "process_mem_usage{pid=\"%s\",process=\"%s\"} %s\n",$1,$2,$3
}' >> "$OUTPUT"
ps -eo pid,comm,rss --sort=-rss | head -n 11 | awk 'NR>1 {
mem_mb = $3/1024
printf "process_mem_used_mb{pid=\"%s\",process=\"%s\"} %.2f\n",$1,$2,mem_mb
}' >> "$OUTPUT"
############################
# 6. 内网网络连通性检测
############################
GATEWAY=$(ip route | awk '/default/ {print $3}')
if ping -c 1 -W 2 $GATEWAY >/dev/null 2>&1; then
echo 'network_up 1' >> "$OUTPUT"
else
echo 'network_up 0' >> "$OUTPUT"
fi
############################
# 7. 原子替换指标文件
############################
mv "$OUTPUT" /var/lib/node_exporter/textfile_collector/top_metrics.prom
- 赋予执行权限
# 设置执行权限
$ sudo chmod +x /var/lib/node_exporter/textfile_collector/top_metrics.sh
# (可选)手动执行一下 /var/lib/node_exporter/textfile_collector/top_metrics.sh
$ /var/lib/node_exporter/textfile_collector/top_metrics.sh
# (可选)查看数据输出
$ cat /var/lib/node_exporter/textfile_collector/top_metrics.prom
确保 Node Exporter 的 --collector.textfile.directory 指向 /var/lib/node_exporter/textfile_collector
systemd timer 方案实现30s 轮询
- 创建 systemd service
路径:/etc/systemd/system/ne-top-metrics.service
[Unit]
Description=Generate Node Exporter Top Metrics
[Service]
Type=oneshot
ExecStart=/var/lib/node_exporter/textfile_collector/top_metrics.sh
- 创建 systemd timer
路径:/etc/systemd/system/ne-top-metrics.timer
[Unit]
Description=Run Node Exporter Top Metrics every 30 seconds
[Timer]
OnBootSec=10s
OnUnitActiveSec=30s
AccuracySec=1s
Unit=ne-top-metrics.service
[Install]
WantedBy=timers.target
- 启用并启动 timer
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now ne-top-metrics.timer
$ sudo systemctl status ne-top-metrics.timer
校验
# 查看node_exporter 的 抓取情况
$ cat /var/lib/node_exporter/textfile_collector/top_metrics.prom
# 查看 timer 执行情况:
$ systemctl list-timers ne-top-metrics.timer
# timer 日志
$ journalctl -u ne-top-metrics.service -f
Prometheus 配置抓取:
prometheus/prometheus.yaml
scrape_configs:
- job_name: 'kylin_v10_node'
static_configs:
- targets: ['<Kylin V10 IP>:9100']