什么可能导致 google spanner 数据库中的高 cpu? (没有反应 table)

What could be causing high cpu in google spanner databases? (unresponsive table)

我遇到的问题是,10 个 spanner 数据库中有 2 个显示 CPU 使用率很高(超过 40%),而其他数据库的使用率都在 %1 左右,数据几乎相同或更多。

我注意到我们的一个 table 已变得“无响应”,没有任何查询对其有效。我们关闭了所有连接到这些数据库的应用程序,我们还使用 gcloud session list 删除了所有当前会话,然后 gcloud session delete。

然而 table 仍然没有反应。一个简单的 select like select id from mytable where name = 'test' 没有响应(当从应用程序测试时,也从 gcloud 网络界面测试时),它只会发生那个table,只有几列有正常数据,不超过2000条记录。我们确定了可能是问题根源的查询,但是 table 似乎已被锁定(只有 count(*) 没有任何 where 子句有效)。

我想知道是否有任何方法可以“解锁”table,终止那些可能导致问题的“事务”,或者重新启动那些特定的 spanner 数据库,或者在最坏的情况下重新启动扳手实例。

我看过监控高 cpu 的文档,但是即使我们可以识别 cpu 高,我们也不知道如何重新启动或在查看之前使其恢复正常可能导致问题的 query/ies(如果是这样的话)。

高 CPU 可能是由用户发起的查询引起的,来自 different types of operations。请务必注意,您的实例是您分配资源以供底层 Cloud Spanner 数据库使用的地方。这意味着,如果您的所有数据库都在同一个实例中,并且如果您的某些数据库正在占用 CPU,则您所有其他数据库都将陷入困境。

就锁定 table 而言,如果死锁是这里的问题,我会感到非常惊讶,因为 Spanner 使用“伤口等待”算法缓解了这些问题。我怀疑可能发生的情况是,在 table 中执行查询需要很长时间,并且超时。对您的问题进行更多调查会很好:

  • 您对有问题的 table 的查询等待了多长时间(在您被认为被卡住之前)?如果您的查询花费很长时间并且您在获得结果之前超时,这可能是一个问题。如果您的 table 中存在热点并且交易经常中止,从而阻止您获得结果,则可能是一个问题。

  • 在 table 上执行查询时出现什么错误?错误代码可以告诉您更多关于可能发生的事情。

  • 您是否尝试过在 table 上执行 stale read 以查看是否有任何数据被 return 编辑?如果锁争用是问题所在,这应该会成功并且 return 对您来说结果更快。因此,您可以通过统计信息 table 进一步调查锁的使用情况(如下所示)。

  • 检查查询统计信息:您可以列出 queries with the highest CPU usage, find the average latency for a query and find out the queries that timeout the most. There is much more you can do, as seen here. You can also view the query statistics in cloud console。我要验证的是,通过减少总体 CPU,您的查询是否没有任何问题返回?如果是这样,您可能需要更多资源。或者您可能需要减少数据库中的热点。

  • 检查锁统计信息:您可以调查行和 table 中的锁冲突。我认为针对您的问题的一个有趣查询是 Discovering which row keys and columns had long lock wait times during the selected period。然后您可以查看您的查询是否正在读取这些行键和列并采取相应行动。