根源追溯:Cloud SQL MySQL CPU 使用率飙高的元凶
2024-03-15 20:02:37
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 使用率。