监听内存使用基准测试

etcd 观察者的性能指标

注意: 监视功能正在积极开发中,其内存使用情况可能会随着开发的进展而变化。我们预计它不会显著超出下文所述的数据。

etcd 的主要目标是支持大量监视器进行大规模的监视。etcd 旨在支持 O(10k) 个客户端、O(100K) 个监视流(每个客户端 O(10) 个流)和 O(10M) 个总的监视活动(每个流 O(100) 个监视)。每个单独的监视活动所消耗的内存占 etcd 总体使用量的最大部分,因此是当前和未来优化的重点。

etcd 监视功能消耗物理内存的三个相关组件是:每个 grpc.Conn、每个监视流以及每个监视活动实例。grpc.Conn 维护实际的 TCP 连接和其他 gRPC 连接状态。每个 grpc.Conn 消耗 O(10kb) 的内存,并且可能有多个监视流附加。

每个监视流是一个独立的 HTTP2 连接,消耗另外 O(10kb) 的内存。多个监视活动可能共享一个监视流。

监视是实际跟踪键值存储变化的结构。每个监视活动应仅消耗 < O(1kb) 的内存。

                                          +-------+
                                          | watch |
                              +---------> | foo   |
                              |           +-------+
                       +------+-----+
                       |   stream   |
      +--------------> |            |
      |                +------+-----+     +-------+
      |                       |           | watch |
      |                       +---------> | bar   |
+-----+------+                            +-------+
|            |         +------------+
|   conn     +-------> |   stream   |
|            |         |            |
+-----+------+         +------------+
      |
      |
      |
      |                +------------+
      +--------------> |   stream   |
                       |            |
                       +------------+

监视功能的理论内存消耗可以用以下公式近似计算: memory = c1 * number_of_conn + c2 * avg_number_of_stream_per_conn + c3 * avg_number_of_watch_stream

测试环境

etcd 版本

GCE n1-standard-2 机器类型

  • 7.5 GB 内存
  • 2 个 CPU

总体内存使用情况

总体内存使用情况捕获了 etcd 在客户端监视器下的 RSS 消耗量。虽然结果可能会有高达 10% 的差异,但它仍然是有意义的,因为目标是了解大致的内存使用情况和分配模式。

根据基准测试结果,我们可以粗略计算出 c1 = 17kbc2 = 18kbc3 = 350bytes。因此,每个额外的客户端连接消耗 17kb 的内存,每个额外的流消耗 18kb 的内存,每个额外的监视活动仅消耗 350 字节。在正常情况下,单个 etcd 服务器可以使用几 GB 的内存维护数百万个监视活动。

客户端每个客户端的流每个流的监视活动总监视活动内存使用情况
1k111k50MB
2k112k90MB
5k115k200MB
1k10110k217MB
2k10120k417MB
5k10150k980MB
1k50150k1001MB
2k501100k1960MB
5k501250k4700MB
1k5010500k1171MB
2k50101M2371MB
5k50102.5M5710MB
1k501005M2380MB
2k5010010M4672MB
5k5010025MOOM

最后更新于 2025 年 6 月 3 日:递归地将 v3.6 的内容复制到 v3.7(a90b2a6)