原文作者: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/
 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐