我有一个包含 100M 行的数据库,其中包含简单的键和值。主键只是一个随机的 32 字节字符串,值是一个 32 字节的字符串。(它与 YCSB 非常相似,虽然更小)。
我看到单个节点进行点读取的吞吐量非常不一致。我看到单个节点的 QPS 高达 15k,但有时我看到的吞吐量要低得多。较高的 QPS 似乎是查询较小的键子集的结果。我是否有可能遇到一些奇怪的缓存行为?
我有一个包含 100M 行的数据库,其中包含简单的键和值。主键只是一个随机的 32 字节字符串,值是一个 32 字节的字符串。(它与 YCSB 非常相似,虽然更小)。
我看到单个节点进行点读取的吞吐量非常不一致。我看到单个节点的 QPS 高达 15k,但有时我看到的吞吐量要低得多。较高的 QPS 似乎是查询较小的键子集的结果。我是否有可能遇到一些奇怪的缓存行为?
缓存(即从二级存储缓存数据)不应该对性能造成如此严重的影响,而且在大多数关于 Cloud Spanner 的性能讨论中通常可以忽略它。但是,Cloud Spanner 确实有一个查询缓存,这可能是这里问题的一部分。
有几个因素会严重影响你的表现:
1) 如果您使用 SQL 查询进行点读,请确保您使用的是查询参数。换句话说,确保您在executeSql请求中填充了params
andparamTypes
字段。这将提高查询的性能并提供更好的安全性。本白皮书中提供了有关查询性能的更多信息。
2) 如果您正在运行负载测试,请确保运行您的工作负载至少 30 分钟,以确保 Spanner 有机会通过平衡(并创建新的)节点间的拆分来优化数据分布。
请注意,您应该能够在任何新鲜度级别(例如Strong Reads)看到出色的读取性能,如果您使用 Bounded-Staleness,您可能会看到轻微的提升。