Hasty Briefsbeta

双语

Postgres with QUIC

4 hours ago
  • - 对于Postgres的TCP连接池受到客户端网络延迟的限制:在30ms的WAN上使用10个连接池,无论数据库速度如何,只能调度约333 QPS。
  • - PostgreSQL的线路协议是每个连接同步的:一个连接只支持一个正在进行的查询或事务,阻止了在单个TCP套接字上的并发。
  • - 为了解决这个问题而打开数千个原始TCP套接字会导致文件描述符耗尽(EMFILE)、高内核内存使用、连接建立慢(TCP+TLS握手)以及TCP队头阻塞。
  • - QUIC(基于UDP)提供轻量级、多路复用的双向流,不消耗内核套接字或文件描述符,使得仅靠少量物理连接就能实现数千并发查询。
  • - 基准测试结果:在相同的高负载下,QUIC保持了9,718 QPS,平均延迟约246ms,而TCP崩溃了,有40,000+积压的查询,延迟飙升到7,000ms以上。
  • - QUIC不能修复多语句事务:开放的事务仍然占用一个物理的Postgres后端连接,所以传输多路复用只对单语句或自动提交的工作负载有帮助。
  • - QUIC对于边缘到中心化的数据库流量、微服务集群以及不可靠的广域网链路最有价值;对于共地部署的单一架构、重分析查询或频繁的多语句事务则不那么相关。
  • - 该实现不需要改动PostgreSQL的线路协议:tokio-postgres可以通过s2n-quic双向流运行,修改后的PgCat连接池将输入的QUIC流映射到其事务池状态机中。