1.3 机器准备:CVM 规格与多进程

日志管道的机器常被随手给——「先开台 4C8G 跑跑看」,结果要么内存浪费、要么高峰 OOM。本篇按管道负载画像给规格方法,并说明多进程结构怎么配,让这台机器跑得满又不拖累业务。管道的资源账要分两段算:采集段跑在业务机旁,目标是「存在感低」;汇聚段跑在专用 CVM,目标是「吞吐高」。两段规格逻辑完全不同。

负载画像:IO 密集而非 CPU 密集

日志管道大部分时间在做顺序读写:追加写 WAL、批量写 COS、顺序读文件尾随。CPU 只在解析与压缩时忙。所以规格的天平偏向磁盘吞吐与网络带宽,CPU 核数够用即可。一个常犯的错误是给管道配高主频 CPU,实际高峰期 top 看过去 CPU 才 20%——瓶颈根本不在那。

资源 优先级 说明
磁盘吞吐 高 WAL 与归档都是顺序写
网络带宽 高 转发量 = 吞吐 × 冗余
内存 中 攒批缓冲,有界即可
CPU 中低 解析压缩才忙

给配套云服务器规格做个示例:中型吞吐(5 万条/秒)的汇聚节点,4C8G 配足量磁盘吞吐即可;采集 agent 跑在业务机上,往往 1C 限配容器就够。规格更细的选型可参考 腾讯云云服务器文档,也可以对照 轻量服务器建站 的成本视角。

多进程结构:采集、汇聚、落盘三分离

管道跑稳的关键是结构分离:采集进程只读文件,汇聚进程做攒批压缩,落盘进程写 COS/CLS。三者的资源画像不同:采集吃文件句柄,汇聚吃内存与 CPU,落盘吃网络带宽。混在一个进程里,任何一段卡住都会拖死全局;分开后,每段可以独立限速、独立监控、独立重启。

进程 职责 主要消耗 崩了影响
采集 文件尾随 句柄、磁盘读 日志延迟
汇聚 攒批、压缩 CPU、内存 积压不丢
落盘 写 COS/CLS 网络带宽 下游不可见

进程间用有界通道连接,通道满了触发背压,天然保护上游不 OOM。通道的存在让「崩溃影响面」收窄:落盘进程崩了,采集和汇聚还能靠通道缓冲顶一会儿,重启落盘进程即可恢复,全程不丢。

进程数怎么配

CPU 核数与进程数的对应关系是新手最爱问的。经验值:采集进程按机器数走(每台一个),汇聚进程按压缩任务并行度走(通常 2~4 个),落盘进程按下游并发上限走(COS 并发写有上限,多了反而被限速)。不要简单地「一个核一个进程」——落盘进程多了会互相抢带宽。

进程类型 数量参考 依据
采集 每台机器 1 个 句柄局部性
汇聚 2~4 个 压缩并行度
落盘 下游并发上限内 防限速

真实部署还要考虑亲和性:把汇聚进程绑到固定核上,减少跨核缓存失效,对压缩这种 CPU 密集任务提升明显。另外提一句容器部署:如果管道跑在容器里,记得给容器设内存上限与 CPU 限额,否则容器编排器在节点压力时会优先 OOM 没有边界的进程,管道重启反而成常态。

规格的量化估算

给一个可直接套的估算示例。假设高峰 5 万条/秒、平均每条 500 字节、压缩比 5:1。那么:原始带宽 25MB/秒(入),压缩后 5MB/秒(出);WAL 按峰值写 25MB/秒,需磁盘吞吐 ≥40MB/秒稳妥;内存按攒批 64KB × 64 批 ≈ 4MB 加上解析中间结构,留 1GB 足够;CPU 两核跑压缩即可。落盘 COS 并发按下游上限设,一般 8~16 个连接。

估算项 示例值 推导
入带宽 25MB/秒 5 万条 × 500B
出带宽 5MB/秒 压缩 5:1
磁盘吞吐 ≥40MB/秒 WAL 加归档
内存 ~1GB 攒批加解析
CPU 2 核 压缩并行

这个估算的要点是先算再买:不算清楚, 4C8G 与 8C16G 的差价全是浪费。上线后再按真实曲线回校一次,规格表就能越用越准。还有一个口径提醒:估算时别忘了扩容提前量。日志量随业务增长,每月环比 10% 很常见,规格按半年后的量买,能省掉中途被动扩容的慌乱。

部署形态:物理机、云 CVM 与容器

管道跑在什么形态上也影响规格。物理机磁盘吞吐最强但不灵活;云 CVM 弹性够用,磁盘吞吐按云盘类型走,增强型 SSD 才顶得住高峰 WAL;容器部署省事但要注意 IO 隔离差——同机其他容器狂读磁盘时,管道的写延迟会跟着抖。三种形态没有绝对优劣,常见组合是:汇聚节点用 CVM(稳定、磁盘可控),采集 agent 用容器(随业务机走、扩缩容方便)。

形态 磁盘吞吐 运维成本 适合段
物理机 最强 高 超大汇聚
云 CVM 看云盘类型 中 汇聚主选
容器 共享,易抖 低 采集 agent

云盘选择上最常踩的坑是用了普通云盘跑 WAL:高峰期写延迟从毫秒级飙到百毫秒,吞吐直接腰斩,换增强型 SSD 才解决。这笔钱不能省。

部署清单:上线前逐条过

最后给一张部署自查清单,机器开了不是就完了:fd 上限调了吗?磁盘分盘做了吗?容器内存上限设了吗?监控装了吗?WAL 分区满了告警配了吗?五条全过完再上线,比上线后救火快十倍。

清单项 操作 不过的后果
fd 上限 调高 ulimit 采集进程崩
WAL 分盘 独立分区或盘 延迟互相拖
容器限额 内存与 CPU 上限 被 OOM 优先杀
监控 吞吐/积压/丢弃 出事不知道
磁盘告警 WAL 分区 80% 写满即停

清单里最容易漏的是磁盘告警:WAL 分区一旦写满,管道要么停要么丢,两种都不可接受。告警阈值设在 80% 而不是 95%,留出归档清理的响应时间。清单全过完,这台机器才算真的「备好了」,后面的高吞吐才有地基可踩。

小结

管道机器按「磁盘吞吐优先、带宽次之、CPU 够用」配;多进程三分离让各段独立崩溃独立重启,通道背压兜底不丢;隐性账记得 WAL 分盘、fd 上限、带宽余量三件事。spec 表不是越大越好,而是让每段负载都跑在自己该有的资源上。云 CVM 与容器按段落位,清单五条过完再上线。多进程结构还带来一个长期红利:每段可以独立升级。采集层换实现、落盘层换存储,都不用停整条管道,灰度窗口小得多。 磁盘有两个隐性账。第一是WAL 与归档的写盘分离:两者都是顺序写,挤同一块盘会互相影响延迟,条件允许分两块盘或至少不同分区。第二是文件句柄上限:采集进程尾随几百个日志文件,默认的 fd 上限可能不够,部署时要调高。网络上同样有一笔:转发出去的数据量是原始吞吐的压缩后大小,带宽预算按压缩比反算,留 30% 余量防突发。

隐性项 风险 配置动作
WAL 与归档同盘 互相拖慢 分盘或分区
fd 上限不足 采集进程崩 调高 ulimit
带宽按峰值配 突发丢包 留 30% 余量

清单是死的,机器是活的——上线第一周每天对照监控曲线回看一次清单,会发现总有那么一条当初没考虑到的隐性项,补进去就是下一次扩容的依据。

踩坑提示

最典型的坑是规格只看 CPU 不看磁盘:团队买了 8C16G 的机器,配了一块普通云盘,结果高峰期 CPU 才 30% 吞吐就上不去——瓶颈是磁盘吞吐,加核完全没用。再一个坑是采集进程跑在业务机忘了限速:高峰期采集把磁盘 IO 抢光,业务接口全部变慢,排查半天才定位到旁边这个小进程。业务机上的采集必须有 IO 与 CPU 限额。

小结

管道机器按「磁盘吞吐优先、带宽次之、CPU 够用」配;多进程三分离让各段独立崩溃独立重启,通道背压兜底不丢;隐性账记得 WAL 分盘、fd 上限、带宽余量三件事。规格不是越大越好,而是让每段负载都跑在自己该有的资源上。

延伸阅读