ノート一覧へ

Scaling SQLite to 4M QPS on a Single Server (EC2 vs Bare Metal)

AI 要約 · Qwen 要約は中国語 収録日
原文を読む

Expensify 通过自托管硬件、Bedrock 和针对 SQLite 的少量修改,在单台服务器上实现超过 400 万 QPS 的并行读性能,并显示裸金属在成本和性能上优于 EC2。

技术栈与 Bedrock

  • Expensify 使用 SQLite 而非 MySQL 或 Postgres,并通过自研开源 Bedrock 提供分布式事务、任务队列和复制缓存。
  • 其内部不使用 DNS,主要依靠配置管理的 /etc/hosts,并自托管 Web 与数据库硬件。

硬件与扩展动机

  • 新一代自托管服务器配备 1TB DDR4 内存、3TB NVMe SSD 和 192 个 2.7GHz 物理核心,超线程后为 384 线程。
  • Expensify 不做数据分片,因为用户可跨客户共享费用,会计公司需要跨客户聚合处理。

SQLite 调整

  • SQLite 做了若干修改,包括禁用 Posix 建议锁、让 RANDOM() 确定性、禁用 malloc 全局锁并扩展内存映射上限。
  • 核心设计基本适合该场景,主要优化集中在 BIOS 和内核电源设置,以减少额外内存访问并避免 CPU 降频。

测试方法

  • 测试对每种线程数运行 100 秒,并取最快一秒作为结果,以过滤缓存预热造成的慢样本。
  • 查询在 100 亿行、447GB 的两列随机整数表中随机求和 10 行,数据库预先缓存且只读。

性能结果

  • 裸金属服务器在 192 线程下达到 400 万 QPS 以上并继续上升,而 EC2 x1e.32xlarge 约在 150 万 QPS 封顶。
  • EC2 x1e.32xlarge 标称 128 vCPU 和 4TB 内存,按文中价格约 26.688 美元/小时或 23.3 万美元/年。

EC2 与裸金属差异

  • EC2 的 128 个 vCPU 实际对应 64 个物理 CPU 加超线程,且每线程性能随线程数增加明显下降。
  • 作者认为 EC2 可能采用平衡性能配置,在高功耗时降低时钟速度,而自托管可调整 BIOS 电源设置。

结论与后续

  • SQLite 在并行读负载下扩展接近线性,超线程也能带来额外容量。
  • 测试在 Meltdown/Spectre 之前完成,早期迹象显示性能约下降 2.5%;SQLite 也支持 WAL 和页面锁等写并发能力。