文档版本 v3.7-DRAFT 处于 草稿 状态。如需获取最新的稳定版文档,请参阅 v3.6。
监听内存使用基准测试
注意: 监视功能正在积极开发中,其内存使用情况可能会随着开发的进展而变化。我们预计它不会显著超出下文所述的数据。
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 = 17kb、c2 = 18kb 和 c3 = 350bytes。因此,每个额外的客户端连接消耗 17kb 的内存,每个额外的流消耗 18kb 的内存,每个额外的监视活动仅消耗 350 字节。在正常情况下,单个 etcd 服务器可以使用几 GB 的内存维护数百万个监视活动。
| 客户端 | 每个客户端的流 | 每个流的监视活动 | 总监视活动 | 内存使用情况 |
|---|---|---|---|---|
| 1k | 1 | 1 | 1k | 50MB |
| 2k | 1 | 1 | 2k | 90MB |
| 5k | 1 | 1 | 5k | 200MB |
| 1k | 10 | 1 | 10k | 217MB |
| 2k | 10 | 1 | 20k | 417MB |
| 5k | 10 | 1 | 50k | 980MB |
| 1k | 50 | 1 | 50k | 1001MB |
| 2k | 50 | 1 | 100k | 1960MB |
| 5k | 50 | 1 | 250k | 4700MB |
| 1k | 50 | 10 | 500k | 1171MB |
| 2k | 50 | 10 | 1M | 2371MB |
| 5k | 50 | 10 | 2.5M | 5710MB |
| 1k | 50 | 100 | 5M | 2380MB |
| 2k | 50 | 100 | 10M | 4672MB |
| 5k | 50 | 100 | 25M | OOM |