为 Solana RPC 节点规划容量,首先要区分角色:验证者参与共识并管理投票/质押密钥,而 RPC 节点提供读取流量服务,无需投票即可运行。全节点仅保留近期账本历史,而归档/账本节点保留更多历史数据以支持历史查询。四个资源维度起决定性作用:CPU 用于交易执行和 ed25519 签名验证,内存用于账户状态和索引,NVMe 存储用于持续增长的账本,以及高吞吐、突发性的网络带宽和低延迟对等连接。Solana 官方文档发布了最低和推荐硬件指南,应将其视为起点,并根据当前版本进行调整,因为需求会随网络负载上升而提高。与其照搬规格表,不如根据账本增长率乘以保留窗口来推算存储,根据账户集大小推算内存,根据观测到的数据摄取峰值推算 CPU/网卡。本文提供可运行的诊断脚本以获取这些数据,并附结果表,用于将实测值与文档中的最低和推荐配置进行对比。
角色区分:验证者与 RPC 节点
容量规划的第一个决策不是硬件,而是角色。Solana 验证者参与共识、对区块投票,并需要管理投票和质押密钥;其硬件配置由共识参与决定,并且越来越需要高端 CPU、内存和网络。相比之下,RPC 节点向客户端提供读取流量服务,无需投票即可运行,这使资源平衡转向存储、内存和网络吞吐量,而非投票延迟。
这一区别很重要,因为许多在线硬件讨论将验证者和 RPC 节点的要求混为一谈。如果你的目标是为应用提供可靠的读取访问,那么你是在为 RPC 节点规划容量,而不是验证者。Solana 验证者要求文档发布的硬件指南常被两种角色引用,但你应结合角色来阅读,并根据你的读取工作负载进行调整。
另一个相关区分是全节点与归档节点。全节点(非归档)仅保留近期账本历史,这限制了存储增长。归档或账本节点保留更多历史数据以支持历史查询,容量需求会成倍增加。更深入的对比请参阅归档节点与全节点。
- 验证者:参与共识,管理投票/质押密钥,需要高端 CPU 和网络。
- RPC 节点:提供读取流量,不投票,存储和内存需求高。
- 全节点:仅保留近期账本历史,存储增长有限。
- 归档/账本节点:保留大量历史数据,存储需求成倍增加。
CPU:交易执行与签名验证
Solana 交易执行和签名验证是 CPU 密集型任务。每笔交易都包含必须验证的 ed25519 签名,运行时执行程序会消耗计算单元。在数据摄取期间,节点必须跟上网络的交易速率,因此核心数量和单线程速度都很重要。核心多但速度慢的 CPU 可能难以足够快地验证签名和执行交易以保持同步。
实际意义在于,你应测量负载下的 CPU 余量,而不仅仅是统计核心数。如果节点在网络活动高峰期落后,瓶颈通常是单线程性能或并行签名验证所需的核心数不足。Solana 文档提供了节点操作和账本处理方面的指导,有助于了解 CPU 预期,但你应根据当前版本进行调整,因为需求会随网络负载上升而提高。
对于 RPC 节点,CPU 还影响响应触发计算的 JSON-RPC 请求的速度,例如需要反序列化的模拟或账户查询。Solana JSON-RPC API定义了节点提供的读取接口,高读取流量可能与数据摄取竞争 CPU 资源。
- 签名验证(ed25519)是 CPU 密集型任务。
- 交易执行消耗计算单元和 CPU 时间。
- 核心数量和单线程速度对数据摄取都很重要。
- 测量峰值负载下的 CPU 余量,而不仅仅是核心数。
内存:账户状态与索引结构
Solana 节点将账户状态和索引结构保存在内存中。如果内存配置不足,操作系统会发生颠簸,交换到磁盘并严重降低性能。账户集随时间增长,因此内存需求往往随网络使用量增加。对于 RPC 节点,内存还缓存频繁访问的数据,这可以改善读取延迟。
内存容量规划不是一次性计算。你应监控内存压力并考虑增长。今天运行舒适的节点,六个月后可能需要更多内存,因为账户集会扩大。Solana 文档讨论了账户状态和账本存储,这是主要的内存消耗者。
规划时,请考虑全节点与归档节点的区别。归档节点可能需要更多内存来支持覆盖历史数据的索引,而全节点可以用更少内存运行。对于延迟敏感的读取工作负载,请参阅 Solana RPC 延迟了解内存和缓存如何影响响应时间。
- 账户状态和索引驻留在内存中。
- 内存配置不足会导致交换和颠簸。
- 账户集随时间增长;规划时考虑扩展。
- 归档节点可能需要更多内存用于历史索引。
存储:账本增长与 NVMe 耐久度
Solana 账本由账户和分片组成,并持续增长。存储必须是高速 NVMe,具有高 TBW(写入太字节数)耐久度,因为节点持续写入。消费级 SSD 在这种写入负载下可能很快磨损。对于归档节点,容量需求会成倍增加,因为需要保留历史账本数据。
要规划存储容量,请根据账本增长率乘以保留窗口来推算。如果你知道当前账本大小和增长率,就可以估算给定保留期所需的空间。Solana 文档提供了账本存储和节点操作方面的指导。对于历史数据查询,请参阅通过 RPC 获取 Solana 历史数据。
耐久度与容量同样重要。容量足够但未针对高写入负载评级的硬盘会过早损坏。检查硬盘的 TBW 评级,确保其超过节点生命周期内的预期写入量。要运行诊断脚本测量磁盘写入吞吐量,请参阅下文。
- 账本持续增长;需要 NVMe。
- 高 TBW 耐久度对写入密集型工作负载至关重要。
- 归档节点的容量需求成倍增加。
- 根据增长率乘以保留窗口推算存储。
网络:带宽与低延迟对等连接
Solana 的交易和 Turbine 流量是高吞吐且突发性的。带宽和低延迟对等连接比许多链更为重要。在活动高峰期,节点必须摄取大量交易并传播分片。带宽不足或延迟过高可能导致节点落后,引发同步问题和过期读取。
对于 RPC 节点,网络还影响客户端访问你的速度。如果你提供公共流量服务,需要足够的带宽来处理并发请求,并与 Solana 网络保持低延迟对等连接以保持节点同步。Solana 文档提供了节点操作方面的指导,但你应测量自己在负载下的网络吞吐量和延迟。
规划时,请考虑入站和出站带宽。数据摄取主要是入站,而提供 RPC 请求服务是出站。突发性流量意味着你需要高于平均利用率的余量。要排查网络相关问题,请参阅 Solana RPC 超时与重试。
- 高吞吐、突发性的交易和 Turbine 流量。
- 低延迟对等连接保持节点同步。
- 入站用于数据摄取,出站用于 RPC 响应。
- 为突发峰值预留余量。
文档中的最低配置与推荐配置指南
Solana 官方文档发布的硬件指南应视为起点。验证者要求页面列出了最低和推荐规格,但这些并非静态。需求会随网络负载和版本更新而上升,因此你必须根据当前版本和自身工作负载进行调整。
最低规格通常仅够在理想条件下运行节点。推荐规格为峰值负载和未来增长提供了余量。对于服务真实流量的生产 RPC 节点,你应以推荐级别或更高为目标,并通过测量进行验证。不同提供商的行为各异,因此如果使用托管服务,请查看其文档中的规格。
不要将文档视为保证。它只是一个基线。你的实际需求取决于读取量、保留需求和延迟目标。以下部分展示如何测量和比较。
- 官方文档发布最低和推荐规格。
- 需求随网络负载和版本更新而上升。
- 最低配置适用于理想条件;推荐配置增加余量。
- 根据自身工作负载和测量结果进行验证。
根据工作负载而非规格表推算容量
与其照搬规格表,不如根据工作负载推算容量。存储等于账本增长率乘以保留窗口。内存随账户集大小和索引需求扩展。CPU 和网卡根据观测到的数据摄取峰值确定。这种方法确保你按实际需求配置,而非通用基线。
首先测量当前节点或候选主机。记录 CPU 型号和核心数、内存、NVMe 设备型号和可用空间、网卡速度以及磁盘写入吞吐量样本。同时记录节点自身的同步和健康输出。这些数据构成与文档中最低和推荐配置对比的基础。
以下部分提供可运行的诊断脚本以收集这些测量值。在候选主机或现有节点上运行它们。然后填写结果表以做出判断并决定行动。
- 存储 = 账本增长率 × 保留窗口。
- 内存 = 账户集大小 + 索引开销。
- CPU/网卡 = 观测到的数据摄取峰值。
- 先测量,再配置。
可运行诊断:采集主机和节点指标
以下 Node.js 脚本收集关键主机指标:CPU 型号和核心数、总内存、NVMe 设备型号和可用空间、网卡速度以及磁盘写入吞吐量样本。它还通过 JSON-RPC 查询 Solana 节点的健康和同步状态。在候选主机或现有节点上运行它。
该脚本使用标准 Node.js 模块和 child_process 模块运行系统命令。它假设 Linux 环境中有 lscpu、lsblk、df、ethtool 和 dd 可用。如有需要,请根据你的操作系统调整命令。JSON-RPC 调用使用 Solana JSON-RPC API中的 getHealth 和 getEpochInfo 方法。
const { execSync } = require('child_process');
const https = require('https');
function run(cmd) {
try {
return execSync(cmd, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'ignore'] }).trim();
} catch (e) {
return 'N/A';
}
}
function getCpuInfo() {
const model = run("lscpu | grep 'Model name' | cut -d: -f2").trim();
const cores = run("nproc");
return { model, cores };
}
function getMemory() {
const mem = run("free -h | awk '/^Mem:/ {print $2}'");
return mem;
}
function getNvmeInfo() {
const device = run("lsblk -d -o NAME,MODEL | grep nvme | head -1");
const free = run("df -h / | awk 'NR==2 {print $4}'");
return { device, free };
}
function getNicSpeed() {
const iface = run("ip route | grep default | awk '{print $5}' | head -1");
const speed = run(`ethtool ${iface} | grep Speed | awk '{print $2}'`);
return { iface, speed };
}
function measureDiskWrite() {
const out = run("dd if=/dev/zero of=/tmp/testfile bs=1M count=1024 conv=fdatasync 2>&1 | tail -1");
run("rm -f /tmp/testfile");
return out;
}
function rpcCall(method, params = []) {
return new Promise((resolve, reject) => {
const data = JSON.stringify({ jsonrpc: '2.0', id: 1, method, params });
const req = https.request({
hostname: 'localhost',
port: 8899,
path: '/',
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Content-Length': data.length }
}, (res) => {
let body = '';
res.on('data', chunk => body += chunk);
res.on('end', () => resolve(JSON.parse(body)));
});
req.on('error', reject);
req.write(data);
req.end();
});
}
(async () => {
console.log('CPU:', getCpuInfo());
console.log('Memory:', getMemory());
console.log('NVMe:', getNvmeInfo());
console.log('NIC:', getNicSpeed());
console.log('Disk write:', measureDiskWrite());
try {
const health = await rpcCall('getHealth');
const epoch = await rpcCall('getEpochInfo');
console.log('Health:', health.result);
console.log('Epoch:', epoch.result);
} catch (e) {
console.log('RPC error:', e.message);
}
})();结果表:将实测值与文档指南对比
运行诊断后,将实测值填入下表。将它们与 Solana 验证者要求页面或你的提供商文档中的最低和推荐规格进行对比。判断列帮助你决定主机是否足够。行动列建议下一步措施。
此表是模板。你应填入自己的测量值。不要依赖通用数字;你的工作负载决定判断结果。对于 RPC 节点,还要考虑读取流量和保留需求。如果使用托管提供商,请查看其文档中的规格并与你的需求对比。
- 维度:CPU、内存、存储、网络。
- 实测值:来自诊断脚本。
- 文档最低配置:来自官方文档或提供商。
- 文档推荐配置:来自官方文档或提供商。
- 判断:足够、勉强或不足。
- 行动:升级、监控或继续。
| Dimension | Measured Value | Documented Minimum | Documented Recommended | Verdict | Action |
|-----------|----------------|--------------------|------------------------|---------|--------|
| CPU | | | | | |
| RAM | | | | | |
| Storage | | | | | |
| Network | | | | | |排查常见容量瓶颈
当 Solana RPC 节点性能不佳时,瓶颈通常是四个维度之一。如果节点在网络活动高峰期落后,请检查 CPU 利用率和单线程性能。如果节点无响应或变慢,请检查内存压力和交换。如果磁盘 I/O 饱和,请检查 NVMe 写入吞吐量和耐久度。如果节点失去同步或延迟高,请检查网络带宽和对等连接。
对于 RPC 特定问题,如超时或过期读取,请参阅 Solana RPC 超时与重试。对于延迟优化,请参阅 Solana RPC 延迟。对于历史数据查询,请参阅通过 RPC 获取 Solana 历史数据。
请记住,为真实流量运行公共 RPC 节点还需要速率限制、TLS 和监控。这些是硬件容量规划之外的操作问题。如果你需要大规模可靠的读取访问,托管提供商可能更具成本效益。提供商选项请参阅 Solana RPC 端点(RPC Assistant)。
- CPU 瓶颈:节点在活动高峰期落后。
- 内存瓶颈:交换、节点无响应。
- 存储瓶颈:磁盘 I/O 饱和、写入缓慢。
- 网络瓶颈:失去同步、延迟高。
- 操作需求:速率限制、TLS、监控。
局限性、权衡与后续步骤
Solana 硬件指南随版本变化,必须重新检查。你今天测量的数字明年可能不够。为真实流量运行公共 RPC 节点还需要速率限制、TLS 和监控,这会增加操作开销。与托管提供商相比,自托管节点很少是大规模可靠读取访问的最便宜途径。
如果你决定自托管,请从诊断脚本开始,填写结果表,并与文档指南对比。对于托管选项,请查看 RPC 定价和 API 服务。网络特定细节请参阅 Solana。更多基础设施指南,请访问 OnFinality Learn 中心。
后续步骤:在候选主机上运行诊断,填写结果表,决定是自托管还是使用托管提供商。如果自托管,请持续监控四个维度并规划增长。如果使用提供商,请验证其文档中的规格并用你的工作负载进行测试。
- 硬件指南会变化;每个版本都要重新检查。
- 公共 RPC 需要速率限制、TLS、监控。
- 大规模场景下自托管可能不是最便宜的。
- 运行诊断,填写表格,做出决定。
- 持续监控并规划增长。