Polkadot 验证人日常管理完整指南 | CPU 调优、Prometheus 监控到安全加固全覆盖
原文作者:PaperMoon团队
节点跑起来之后,真正的运维工作才开始。
出块性能、节点监控、安全防护。这三件事随便哪一件没做好,都可能让你在某个不该掉链子的时刻掉链子:CPU 没调优导致出块延迟、监控没配导致节点挂了半天才发现、安全没加固导致会话密钥被利用触发 slash。
三个板块,下面分开走。
一、性能调优
1.1 关闭 SMT 超线程
SMT(Simultaneous Multithreading,同步多线程):也叫超线程(Intel 称 Hyper-Threading,AMD 称 SMT),通过让一个物理核同时处理两个线程来提升吞吐量。听起来很好,但对 Polkadot 验证人来说适得其反。
Polkadot 的 runtime 执行高度依赖单核性能。开启 SMT 后,每个逻辑核共享物理核资源,单核算力反而下降,可能导致区块执行超时。关掉 SMT,让每个物理核全力运转,出块效率更稳定。
runtime(保留英文):区块链的核心逻辑层,定义链上所有规则和状态转换。Polkadot 把 runtime 编译为 WASM 在节点上执行,对单线程性能非常敏感。
第一步:临时关闭(立即生效,重启后失效)
```bash
for cpunum in $(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | \
cut -s -d, -f2- | tr ',' '\n' | sort -un)
do
echo 0 > /sys/devices/system/cpu/cpu$cpunum/online
done
# 中文:遍历所有 CPU 拓扑信息,找出超线程逻辑核的编号,将其 online 状态设为 0(离线)
# 中文:cut -s -d, -f2- 取逗号分隔列表中第二个及以后的值,即超线程逻辑核编号
```
第二步:永久关闭(重启后保持)
编辑 `/etc/default/grub`,在 `GRUB_CMDLINE_LINUX_DEFAULT` 中加入 `nosmt=force`:
```bash
GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT='nosmt=force'
# 中文:nosmt=force 参数在内核启动时强制禁用所有 SMT 超线程
GRUB_CMDLINE_LINUX=''
```
```bash
sudo update-grub
# 中文:使 GRUB 配置生效,重启后新参数才会加载
```
重启后验证:
```bash
lscpu --extended
# 中文:以扩展格式显示 CPU 拓扑信息,确认逻辑核数量是否减少(等于物理核数)
```
1.2 禁用 NUMA 自动均衡
NUMA(Non-Uniform Memory Access,非统一内存访问):多 CPU 系统的内存架构。每个 CPU 有自己"就近"的内存区域(访问更快),也可以访问其他 CPU 的内存(访问更慢)。Linux 默认会自动迁移内存页和进程,试图让数据更靠近使用它的 CPU,但这个迁移过程本身会引入延迟。
对于验证人节点这类对延迟极度敏感的场景,关闭自动均衡,让进程固定在一个 CPU 节点上运行,反而更稳。
第一步:运行时立即关闭
```bash
sysctl kernel.numa_balancing=0
# 中文:即时修改内核参数,禁用 NUMA 自动均衡,重启后失效
```
第二步:永久关闭
在 `/etc/default/grub` 的 `GRUB_CMDLINE_LINUX_DEFAULT` 中加入 `numa_balancing=disable`:
```bash
GRUB_CMDLINE_LINUX_DEFAULT='numa_balancing=disable'
# 中文:内核启动时禁用 NUMA 自动均衡
```
```bash
sudo update-grub
# 中文:更新 GRUB 配置
```
重启后确认:
```bash
sysctl -a | grep 'kernel.numa_balancing'
# 中文:查看当前 NUMA 均衡设置,输出应为 kernel.numa_balancing = 0
```
1.3 Spectre 和 Meltdown 缓解措施(谨慎操作)
Spectre 和 Meltdown*是两个影响现代 CPU 的著名硬件漏洞,利用 CPU 的"推测执行"机制绕过内存隔离读取敏感数据。Linux 内核默认启用了对这两个漏洞的软件缓解措施——代价是降低 5%~30% 的性能。
官方提供了按需调整缓解级别的配置:
编辑 `/etc/default/grub`,在 `GRUB_CMDLINE_LINUX_DEFAULT` 中加入:
```bash
GRUB_CMDLINE_LINUX_DEFAULT='spec_store_bypass_disable=prctl spectre_v2_user=prctl'
# 中文:spec_store_bypass_disable=prctl 将 Spectre v4 缓解改为按进程控制,非全局强制
# 中文:spectre_v2_user=prctl 同样改为按进程控制 Spectre v2 用户态缓解
# 中文:prctl 模式下只有主动请求保护的进程才启用缓解,减少对其他进程的性能影响
```
```bash
sudo update-grub
sudo reboot
# 中文:更新配置并重启使参数生效
```
这步本质是降低安全防护级别换取性能,只适合对服务器环境有完全掌控、且确实遇到性能瓶颈的情况。公有云 VPS 等共享环境别动这个。
二、搭建监控体系
节点挂了你第一时间知道吗?出块延迟异常你能看到吗?这些问题的答案都依赖一套完整的监控体系。官方推荐的组合是:
- Prometheus:采集节点时序指标数据
- Grafana:可视化展示,做成仪表盘
- Alertmanager:配置告警规则,触发时发邮件通知
*Prometheus:一款开源的时序数据库和监控系统,通过 HTTP 定期"拉取"目标服务暴露的指标数据(如 CPU 使用率、出块高度等),并存储为时序格式供查询和告警使用。
2.1 环境准备
```bash
sudo useradd --no-create-home --shell /usr/sbin/nologin prometheus
# 中文:创建专用系统用户 prometheus,--no-create-home 不创建主目录,--shell /usr/sbin/nologin 禁止登录
sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
# 中文:创建 Prometheus 配置目录和数据存储目录
sudo chown -R prometheus:prometheus /etc/prometheus
sudo chown -R prometheus:prometheus /var/lib/prometheus
# 中文:将目录所有权交给 prometheus 用户
```
2.2 安装 Prometheus
```bash
sudo apt-get update && sudo apt-get upgrade
# 中文:更新系统软件包列表并升级已安装的包
wget INSERT_RELEASE_DOWNLOAD_LINK
# 中文:从 Prometheus 官方 GitHub 发布页下载对应版本的压缩包,替换 INSERT_RELEASE_DOWNLOAD_LINK
tar xfz prometheus-*.tar.gz
cd prometheus-3.0.0.linux-amd64
# 中文:解压下载的文件,进入解压目录(版本号按实际替换)
sudo cp ./prometheus /usr/local/bin/
sudo cp ./promtool /usr/local/bin/
# 中文:将主程序和工具程序复制到系统路径
sudo cp -r ./consoles /etc/prometheus
sudo cp -r ./console_libraries /etc/prometheus
sudo chown -R prometheus:prometheus /etc/prometheus/consoles
sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries
# 中文:复制 Web 控制台模板文件,并设置所有权
cd .. && rm -r prometheus*
# 中文:清理解压目录,保持系统整洁
```
创建配置文件 `/etc/prometheus/prometheus.yml`:
```yaml
global:
scrape_interval: 15s # 默认每 15 秒抓取一次指标
evaluation_interval: 15s # 每 15 秒评估一次告警规则
rule_files:
# - "first.rules"
# - "second.rules"
# 中文:告警规则文件路径,稍后配置 Alertmanager 时会用到
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s # Prometheus 自身指标每 5 秒抓取
static_configs:
- targets: ['localhost:9090']
- job_name: 'substrate_node'
scrape_interval: 5s # 节点指标每 5 秒抓取
static_configs:
- targets: ['localhost:9615']
# 中文:9615 是 Polkadot 节点默认的 Prometheus 指标暴露端口(--prometheus-port 参数)
```
验证配置语法:
```bash
promtool check config /etc/prometheus/prometheus.yml
# 中文:检查配置文件语法是否正确,有错误会输出具体行号
sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml
# 中文:将配置文件所有权设置给 prometheus 用户
```
创建 Systemd 服务文件 `/etc/systemd/system/prometheus.service`:
```ini
[Unit]
Description=Prometheus Monitoring
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/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
# 中文:指定配置文件、数据存储路径和 Web 控制台资源路径
ExecReload=/bin/kill -HUP $MAINPID
# 中文:发送 HUP 信号热重载配置,不需要重启服务
[Install]
WantedBy=multi-user.target
```
启动并验证:
```bash
sudo systemctl daemon-reload && sudo systemctl enable prometheus && sudo systemctl start prometheus
# 中文:重载 systemd 配置,设置开机自启,立即启动服务
```
访问 `http://服务器IP:9090/` 确认 Prometheus 正常运行。
### 2.3 安装 Grafana
**Grafana**:开源的数据可视化平台,支持接入 Prometheus 等多种数据源,通过仪表盘(Dashboard)以图表形式展示指标数据,直观展示节点健康状态。
```bash
sudo apt-get install -y apt-transport-https software-properties-common wget
# 中文:安装前置依赖
sudo mkdir -p /etc/apt/keyrings/
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
# 中文:下载 Grafana 的 GPG 公钥并导入到 APT 密钥环
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt-get update
# 中文:添加 Grafana 官方 APT 仓库并更新索引
sudo apt-get install grafana
# 中文:安装 Grafana 服务端
sudo systemctl daemon-reload
sudo systemctl enable grafana-server.service
sudo systemctl start grafana-server
# 中文:设置开机自启并立即启动
sudo systemctl status grafana-server
# 中文:确认服务运行状态
```
访问 `http://服务器IP:3000/login`,默认账号密码均为 `admin`,首次登录会提示修改密码。
如需更改默认端口(3000),编辑 `/usr/share/grafana/conf/defaults.ini` 中的 `http_port` 字段,然后重启服务:
```bash
sudo vim /usr/share/grafana/conf/defaults.ini
sudo systemctl restart grafana-server
```
2.4 配置 Grafana 数据源和仪表盘
1. 点击左侧齿轮图标 → Data Sources
2. 点击 Add data source,选择 Prometheus
3. 在 URL 字段填入 `http://localhost:9090`
4. 点击 Save & Test,出现"Data source is working"说明连通正常
5. 点击左侧 Import,选择 Prometheus,点击 Import 导入默认仪表盘
Grafana 社区提供了 Substrate 节点专用仪表盘(Substrate Node Metrics),可以直接在 Grafana Dashboards 页面搜索导入,开箱即用。
2.5 安装配置 Alertmanager
Alertmanager:负责接收 Prometheus 产生的告警,按照配置的路由规则将通知发送到邮件、Slack、PagerDuty 等渠道。
```bash
wget INSERT_RELEASE_DOWNLOAD_LINK
tar -xvzf alertmanager*
# 中文:下载并解压 Alertmanager,版本号从官方 GitHub 发布页获取
cd alertmanager-0.28.0-rc.0.linux-amd64
sudo cp ./alertmanager /usr/local/bin/
sudo cp ./amtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/alertmanager
sudo chown prometheus:prometheus /usr/local/bin/amtool
# 中文:复制二进制文件到系统路径,设置 prometheus 用户所有权
sudo mkdir /etc/alertmanager
sudo nano /etc/alertmanager/alertmanager.yml
# 中文:创建配置目录并编辑配置文件
```
配置邮件告警(以 Gmail 为例):
```yaml
global:
resolve_timeout: 1m # 告警恢复后等待 1 分钟再发送"已恢复"通知
route:
receiver: 'gmail-notifications' # 默认路由到 gmail 接收器
receivers:
- name: 'gmail-notifications'
email_configs:
- to: INSERT_YOUR_EMAIL # 接收告警的邮箱地址
from: INSERT_YOUR_EMAIL # 发送告警的邮箱地址
smarthost: smtp.gmail.com:587 # Gmail SMTP 服务器
auth_username: INSERT_YOUR_EMAIL
auth_identity: INSERT_YOUR_EMAIL
auth_password: INSERT_YOUR_APP_PASSWORD # Gmail 应用专用密码(非账号密码)
send_resolved: true # 告警恢复时也发送通知
```
Gmail 应用专用密码需要在 Google 账号安全设置中单独生成,不是你的登录密码。
```bash
sudo chown -R prometheus:prometheus /etc/alertmanager
# 中文:设置配置目录所有权
```
创建 Systemd 服务文件 `/etc/systemd/system/alertmanager.service`:
```ini
[Unit]
Description=AlertManager Server Service
Wants=network-online.target
After=network-online.target
[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/alertmanager \
--config.file /etc/alertmanager/alertmanager.yml \
--web.external-url=http://SERVER_IP:9093 \
--cluster.advertise-address='0.0.0.0:9093'
# 中文:替换 SERVER_IP 为实际服务器 IP,9093 是 Alertmanager 默认端口
[Install]
WantedBy=multi-user.target
```
```bash
sudo systemctl daemon-reload
sudo systemctl enable alertmanager
sudo systemctl start alertmanager
sudo systemctl status alertmanager
# 中文:启动服务并确认运行状态
```
2.6 把 Alertmanager 接入 Prometheus
更新 `/etc/prometheus/prometheus.yml`,加入告警规则文件和 Alertmanager 地址:
```yaml
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- 'rules.yml' # 告警规则文件
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093 # Alertmanager 地址
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'substrate_node'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9615']
```
创建告警规则文件 `/etc/prometheus/rules.yml`:
```yaml
groups:
- name: alert_rules
rules:
- alert: InstanceDown
expr: up == 0 # 当目标实例 up 指标为 0 时(即不可达)触发
for: 5m # 持续 5 分钟才触发告警,避免短暂波动误报
labels:
severity: critical
annotations:
summary: 'Instance [{{ $labels.instance }}] down'
description: '[{{ $labels.instance }}] of job [{{ $labels.job }}] has been down for more than 5 minutes.'
# 中文:告警内容模板,会在邮件通知中显示具体是哪个实例挂了
```
```bash
sudo chown prometheus:prometheus rules.yml
# 中文:设置规则文件所有权
sudo -u prometheus promtool check rules rules.yml
# 中文:以 prometheus 用户身份验证规则文件语法
sudo systemctl restart prometheus && sudo systemctl restart alertmanager
# 中文:重启两个服务使新配置生效
```
在 Grafana 中也可以安装 Alertmanager 插件可视化告警状态:
```bash
sudo grafana-cli plugins install camptocamp-prometheus-alertmanager-datasource
# 中文:安装 Prometheus Alertmanager 数据源插件
sudo systemctl restart grafana-server
# 中文:重启 Grafana 使插件生效
```
之后在 Grafana → Configuration → Data Sources 中添加 Prometheus Alertmanager 数据源,导入仪表盘 ID `8010` 即可查看告警状态。
三、安全加固
3.1 会话密钥安全管理
会话密钥虽然不能直接转移资金,但如果被滥用——比如同一套密钥在两个节点上同时运行,就会产生矛盾投票(Equivocation),触发 Slash 惩罚,质押的 DOT 被没收。
两个核心原则:
- **只运行一个验证人实例**,绝对不要用同一套会话密钥启动多个节点
- **密钥生成优先在节点内完成**:通过 `author.rotateKeys` RPC 调用生成并存储在节点内部,比在节点外生成后导入更安全
如果你有高级需求,也可以用 `author.setKeys` 在节点外生成密钥后再插入。Polkadot 未来还计划支持通过 HSM(硬件安全模块)签名,进一步隔离私钥。
**HSM(Hardware Security Module,硬件安全模块)**:一种专门用于存储和管理密钥的硬件设备,私钥永远不离开硬件,签名操作在硬件内部完成。即使服务器被入侵,攻击者也无法提取密钥本身。不过官方也提醒:HSM 本身也有风险——它会对收到的任何载荷签名,如果被攻击者利用,同样可能触发 slash。
3.2 Secure-Validator 沙箱模式
Polkadot 内置了 Secure-Validator 模式,通过严格的文件系统、网络和进程沙箱隔离来增强节点安全性。满足以下条件时自动激活:
- Linux x86-64 架构(通常是 Intel 或 AMD CPU)
- 内核启用了 `seccomp`
**seccomp(Secure Computing Mode)**:Linux 内核的一个安全机制,允许进程限制自己可以调用的系统调用集合,减少被利用的攻击面。
验证 seccomp 是否启用:
```bash
cat /boot/config-`uname -r` | grep CONFIG_SECCOMP=
# 中文:查看当前内核配置,输出 CONFIG_SECCOMP=y 说明已启用
```
Linux 5.13 及以上版本还提供了更严格的文件系统保护(即 Landlock,在安装篇已讲过),建议配套使用。
3.3 Linux 系统安全最佳实践
以下是官方建议的 Linux 安全配置清单,对验证人节点都适用:
- **不用 root 运行节点**:创建专用用户(如 `polkadot`),以最小权限运行进程
- **定期打系统安全补丁**:`apt upgrade` 不要拖,补丁越迟打,暴露窗口越长
- **启用并配置防火墙**:只开放必要端口(P2P 端口 30333、RPC 端口视需要决定是否对外开放)
- **SSH 只用密钥登录,禁用密码登录**:密码登录容易被暴力破解,换成密钥认证
- **定期备份数据**:节点数据目录、密钥文件都要备份,存到独立位置
### 3.4 验证人操作最佳实践
- 只运行 Polkadot 二进制,只监听配置好的 P2P 端口,不开不必要的服务
- 有条件的话,在物理机而不是虚拟机上运行——虚拟化层会引入额外的延迟和不确定性
- 基础设施用代码管理(IaC),配置变更有版本记录,放在私有代码仓库
- 配置节点启动时自启、崩溃后自动重启(前面讲 Systemd 时已配置)
- 建立告警值班制度:不同级别的告警有对应的响应流程,不要等到出了事才慌
小结
这篇内容相对重,但三个板块各有侧重:
- 性能调优:关 SMT、关 NUMA 自动均衡是一次性配置,写进 GRUB 重启生效,之后不需要反复处理。Spectre/Meltdown 缓解措施要根据你对安全和性能的权衡决定是否调整。
- 监控体系:Prometheus + Grafana + Alertmanager 三件套搭起来之后,节点挂了、出块延迟了,邮件会告诉你,不用人盯着屏幕。
- 安全加固:会话密钥只跑一个实例,seccomp 确认已开,SSH 禁用密码登录——这几条做了,绝大多数常见攻击面就关上了。
阅读原文:https://docs.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/
更多推荐




所有评论(0)