返回

根源追溯:Cloud SQL MySQL CPU 使用率飙高的元凶

mysql

Cloud SQL MySQL CPU 使用率过高:由 root 用户执行的神秘查询

作为一名经验丰富的程序员,我最近遇到一个奇怪的问题,导致我的 Cloud SQL MySQL 实例的 CPU 使用率异常高。我意识到由“root”用户执行的神秘查询是罪魁祸首。经过调查,我发现了这个问题及其解决方案。

问题

在空闲时间,我的 MySQL 实例的 CPU 使用率会异常高。执行 show full processlist; 命令显示一个由“root”用户在“localhost”上执行的查询进程,状态为“发送数据”。

查询如下:

SELECT 
    t.TABLE_SCHEMA AS TableSchema, t.TABLE_NAME AS TableName
    , t.TABLE_TYPE AS TableType, t.TABLE_COMMENT AS TableDescription
    , c.COLUMN_NAME AS ColumnName, c.COLUMN_COMMENT AS ColumnDescription
    , c.DATA_TYPE AS ColumnDataType, c.IS_NULLABLE AS ColumnIsNullable 
FROM information_schema.columns c JOIN information_schema.tables t ON(t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA)
 WHERE t.TABLE_SCHEMA IN ('app_015861', more 14 databases of my instance..) 
  AND t.TABLE_NAME IN ('estoque_mov','caixa', all the tables of my databases..) 
ORDER BY TableSchema DESC, TableName DESC;

这个查询不是来自我的应用程序,它似乎正在扫描我实例中所有数据库的所有表。

解决方案

经过一番研究,我发现此查询是一个 metadata 查询,由 Google Cloud 执行,用于收集有关我的数据库模式的信息。此信息用于各种目的,例如性能优化、容量规划和故障排除。

通常,此查询不会对我的应用程序性能产生重大影响。但是,我发现它会导致 CPU 使用率过高。为了解决这个问题,我探索了以下选项:

推荐:禁用查询

我可以通过设置 cloudsql_general_metadata_queries 标志来禁用查询:

gcloud sql instances set-database-flags INSTANCE \
--database-flags=cloudsql_general_metadata_queries:OFF

限制查询频率

如果我无法完全禁用查询,我可以限制其执行频率。我可以在 cloudsql_general_metadata_queries_delay 标志中设置一个延迟:

gcloud sql instances set-database-flags INSTANCE \
--database-flags=cloudsql_general_metadata_queries_delay:3600

这会将查询的执行频率限制为每小时一次。

创建只读副本

如果我正在使用读写实例,我可以创建只读副本。只读副本不会执行 metadata 查询,这可以帮助降低主实例的 CPU 使用率。

结论

经过一番努力,我能够解决由 root 用户执行的神秘查询导致的 CPU 使用率过高的难题。通过禁用查询或限制其执行频率,我恢复了我的实例的正常性能。

常见问题解答

1. 此查询何时执行?

此查询通常在实例启动时或在数据库模式发生更改时执行。

2. 此查询会影响我的应用程序性能吗?

通常情况下,此查询不会对应用程序性能产生重大影响。但是,在某些情况下,当实例资源有限或查询特别复杂时,它可能会导致 CPU 使用率增加。

3. 我应该禁用此查询吗?

禁用此查询可能是有益的,特别是如果你遇到 CPU 使用率过高的持续问题。但是,重要的是要注意,此查询会为 Google Cloud 提供有关你的数据库模式的有价值的信息。

4. 创建只读副本会有帮助吗?

创建只读副本可以帮助降低主实例上的 CPU 使用率,因为它不会执行 metadata 查询。但是,这只读副本是一种只读资源,不会提升写入操作的性能。

5. 我还能做些什么来降低 CPU 使用率?

除了禁用或限制 metadata 查询之外,你还应该优化数据库模式、索引表、优化查询并使用适当的硬件资源来降低 CPU 使用率。