从「无脑上云」到「理性回迁」:一个内核爱好者的自托管趋势观察
最近两年,技术圈的风向变了。从 DHH 高调带队 37signals 退出公有云,到各路独立开发者(Indie Hackers)和中小企业开始重新买物理机,Cloud Exit(云回迁) 与 现代自托管(Modern Self-Hosting) 成了高频词。
作为一个常年泡在 /var/log/dmesg、动不动就开 perf 抓调度的内核爱好者,我举双手赞成这种趋势。过去十年,公有云贩卖的是「免运维红利」,但买单的却是白花花的 CPU Cycle、不可控的 Tail Latency(长尾延迟)以及臃肿的虚拟化层开销。
今天我们不聊虚无缥缈的降本增效,纯从系统架构、内核开销和工具链演进的角度,聊聊这波自托管浪潮到底踩中了哪些痛点。
1. 虚拟化税:逃离不可控的 p99 延迟
公有云最让我难以忍受的不是贵,而是性能的不确定性。
在多租户环境的云主机(如各类 c6/c7 实例)上跑高负载服务,即便你买了绑核的计算型实例,底层宿主机的 CPU 资源争抢(Noisy Neighbor)依然无法完全避免。最明显的指标就是 %steal,以及无法解释的上下文切换抖动。
前段时间帮朋友排查一个 Redis 实例偶尔出现的 50ms 尖刺,服务跑在某大厂云主机上。用 perf stat 压测采集了 10 秒,数据非常难看:
# perf stat -e kvm:kvm_exit,context-switches,cpu-migrations,page-faults -p $(pgrep redis-server) sleep 10
Performance counter stats for process id '184920':
12,840,119 kvm:kvm_exit # 频繁触发 VM-Exit 陷入 Hypervisor
148,291 context-switches # 上下文切换频率异常
412 cpu-migrations # vCPU 在物理核之间漂移
89 page-faults
10.001429182 seconds time elapsed
单单是内存访问和定时器中断触发的 VM-Exit 就把时间片切得稀碎。你以为你买的是 8 核 16G,实际上你的时间片随时在被云厂商的 Hypervisor 调度器蹂躏。
而回到自托管的物理裸机(Bare-metal)上,NUMA 节点绑定(numactl)、网卡软中断绑定(RPS/XPS)、甚至是挂载 sched_ext 写个专用的 BPF 调度器,机器完全由你掌控。物理机带来的不仅是原始性能的提升,更是极致平稳的 p999 延迟表现。
2. 存储协议栈的胜利:NVMe + io_uring 对云盘降维打击
自托管趋势爆发的另一个硬件基石是:高速 PCIe NVMe SSD 真的太便宜了,而且性能被 io_uring 彻底榨干了。
对比一下公有云挂载的云硬盘(即使是 ESSD/Provisioned IOPS),哪怕跑在 40Gbps 的专用存储网络上,本质也是网络存储,走的是分布式网络协议栈、RPC 调用和多次内存拷贝。
看一个最简单的 Direct I/O 随机写压测(fio):
fio --name=randwrite --ioengine=io_uring --iodepth=64 --rw=randwrite \
--bs=4k --direct=1 --size=10G --numjobs=4 --runtime=30 --group_reporting
在公有云上,你可能得每个月交几千块钱才能买到一个标称 50,000 IOPS、延迟 1ms 的卷;而在自托管的一台单路 EPYC 机器上插两块消费级或企业级 PCIe 4.0 NVMe 做 ZFS / mdadm 阵列,fio 跑出来的数据直接把云盘按在地上摩擦:
- 自建 NVMe (io_uring): 500,000+ IOPS,延迟维持在 80~120 $\mu s$。
- 云硬盘 (virtio-blk): 80,000 IOPS,延迟通常在 800 $\mu s \sim 2 ms$ 波动。
在自己的内核上,你甚至可以通过 bpftrace 清楚地跟踪每一次块层分发:
# bpftrace -e 'tracepoint:block:block_rq_issue { @[args->dev] = count(); }'
Attaching 1 probe...
@[259,0]: 842103 # 没有任何虚拟化损耗,指令直达硬件控制器
在数据库场景下,这种存储 I/O 栈上的毫秒级差距,直接决定了上层架构需要堆多少缓存中间件。
3. 工具链革命:现代自托管不再等于「肉身运维」
很多人反对自托管的理由是:“云厂商帮我搞定了高可用、部署和自动化,自建 IDC 我得招几个 SRE?”
这个逻辑在五年前成立,但在 2024~2026 年的今天,自托管工具链已经完全现代化、声明式、轻量化了。大家不再去裸机上 apt-get install nginx 然后手动改配置文件,现在的技术栈演进成了:
- 不可变操作系统(Immutable OS): 如 Talos Linux。整个操作系统除了必要的内核与几个静态 Go 二进制,没有 shell、没有 SSH、整个根文件系统完全只读,系统升级就是一次原子重启,彻底干掉了系统环境漂移。
- 轻量级应用编排:
- 不想折腾 k8s 的网络复杂度和 etcd 维护成本?Kamal(37signals 出品,基于 Docker 的轻量化滚动部署)或 Coolify(开源版自建 Heroku)已经足够成熟。
- 用 Kamal 部署只需要一个简单的
deploy.yml,零停机滚动更新原生支持:
service: my-app
image: registry.internal.lan/my-app
servers:
web:
hosts:
- 192.168.1.50
- 192.168.1.51
labels:
traefik.http.routers.my-app.rule: Host(`api.local.net`)
# 现代自托管同样拥有健康检查与零宕机切换
healthcheck:
path: /healthz
port: 8080
max_attempts: 7
interval: 3s
- 虚拟私有网络(Overlay Network): Tailscale / Headscale (WireGuard) 的普及,彻底瓦解了“必须依靠公有云 VPC 才能安全组网”的壁垒。物理节点散落在各处,内核层 WireGuard(
wg驱动)直接建立点对点加密 Mesh 网络,内网穿透与跨机房互通变得像打喷嚏一样自然。
4. 本地 AI 推理:压垮云账单的最后一根稻草
促使更多极客和企业走向自托管的最新驱动力,是 Local AI。
调用商业 API(如 OpenAI、Claude)不仅数据隐私成谜,而且高并发下的 Token 账单是无底洞;而在云上租 A100/H100 实例,单卡每小时的价格足以让初创团队肉痛。
现在的趋势是:买几台双路/多路带 PCIe Gen5 的工作站,塞满 RTX 4090 或通过 Mac Studio 集群,跑 vLLM 或 Ollama。
在自托管 Linux 节点上跑 vLLM,你可以直接调整内核大页(HugePages)、锁定 GPU P2P 访问,利用 numactl 避免跨 Socket 内存穿透:
# 锁定 NUMA 节点,分配 1GB 大页内存,榨干显存与 Host 内存吞吐
numactl --cpunodebind=0 --membind=0 \
python3 -m vllm.entrypoints.openai.api_server \
--model /data/models/deepseek-ai/DeepSeek-Coder-V2-Lite \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.95
这种完全跑在私有局域网内的推理算力,零网络出站费(Egress Free),没有 API 限流,没有因为云端过载返回的 503 错误。
结语
技术发展的规律始终是分久必合,合久必分。
公有云解决了那个“机房停电、硬盘坏了要自己开车去换”的荒蛮时代的问题。但如今,硬件可靠性大幅提升、网络带宽基建完善、容器化与声明式运维工具链成熟,公有云的溢价(Markup)已经远远超过了它提供的便利。
拥抱自托管,不是要开历史倒车回去当机房网管,而是以现代化的软件工程方法,重新拿回对硬件、对内核、对每一帧 CPU 时间的绝对控制权。
下次当你被云账单刺痛、或者看着监控面板上莫名其妙的 200ms 抖动抓狂时,不妨去二手市场看看二手 EPYC 节点,挑两块带掉电保护的 U.2 SSD——你会发现,掌控真实物理机所带来的系统确定性,才是程序员最底层的安全感。
License: CC BY-NC 4.0
Updated 13 hours ago
Was this article helpful? Give it a like.
0 comments


