PgSQL · 最佳实践 · CPU满问题处理

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

前言

在数据库运维当中,一个DBA比较常遇到又比较紧急的问题,就是突发的CPU满(CPU利用率达到100%),导致业务停滞。DBA不一定非常熟悉业务实现逻辑,也不能掌控来自应用的变更或负载变化情况。 所以,遇到CPU满,往往只能从后端数据库开始排查,追溯到具体SQL,最终定位到业务层。这里我们总结下这个问题具体的处理方法。

查看连接数变化

CPU利用率到达100%,首先怀疑,是不是业务高峰活跃连接陡增,而数据库预留的资源不足造成的结果。我们需要查看下,问题发生时,活跃的连接数是否比平时多很多。对于RDS for PG,数据库上的连接数变化,可以从控制台的监控信息中看到。而当前活跃的连接数可以直接连接数据库,使用下列查询语句得到:

select count( * ) from pg_stat_activity where state not like '%idle'; 

追踪慢SQL

如果活跃连接数的变化处于正常范围,则很大概率可能是当时有性能很差的SQL被大量执行导致。由于RDS有慢SQL日志,我们可以通过这个日志,定位到当时比较耗时的SQL来进一步做分析。但通常问题发生时,整个系统都处于停滞状态,所有SQL都慢下来,当时记录的慢SQL可能非常多,并不容易排查罪魁祸首。这里我们介绍几种在问题发生时,即介入追查慢SQL的方法。

1. 第一种方法是使用pg_stat_statements插件定位慢SQL,步骤如下。

1.1. 如果没有创建这个插件,需要手动创建。我们要利用插件和数据库系统里面的计数信息(如SQL执行时间累积等),而这些信息是不断累积的,包含了历史信息。为了更方便的排查当前的CPU满问题,我们要先重置计数器。

create extension pg_stat_statements; select pg_stat_reset(); select pg_stat_statements_reset(); 

1.2. 等待一段时间(例如1分钟),使计数器积累足够的信息。

1.3. 查询最耗时的SQL(一般就是导致问题的直接原因)。

select * from pg_stat_statements order by total_time desc limit 5; 

1.4. 查询读取Buffer次数最多的SQL,这些SQL可能由于所查询的数据没有索引,而导致了过多的Buffer读,也同时大量消耗了CPU。

select * from pg_stat_statements order by shared_blks_hit+shared_blks_read desc limit 5;

2. 第二种方法是,直接通过pg_stat_activity视图,利用下面的查询,查看当前长时间执行,一直不结束的SQL。这些SQL对应造成CPU满,也有直接嫌疑。

 select datname, usename, client_addr, application_name, state, backend_start, xact_start, xact_stay,
 query_start, query_stay, replace(query, chr(10), ' ') as query from (select pgsa.datname as datname,
 pgsa.usename as usename, pgsa.client_addr client_addr, pgsa.application_name as application_name, 
pgsa.state as state, pgsa.backend_start as backend_start, pgsa.xact_start as xact_start, 
extract(epoch from (now() - pgsa.xact_start)) as xact_stay, pgsa.query_start as query_start, 
extract(epoch from (now() - pgsa.query_start)) as query_stay , pgsa.query as query from pg_stat_activity 
as pgsa where pgsa.state != 'idle' and pgsa.state != 'idle in transaction' and pgsa.state != 'idle in transaction (aborted)') idleconnections order by query_stay desc limit 5; 

3. 第3种方法,是从数据表上表扫描(Table Scan)的信息开始查起,查找缺失索引的表。数据表如果缺失索引,大部分热数据又都在内存时(例如内存8G,热数据6G),此时数据库只能使用表扫描,并需要处理已在内存中的大量的无关记录,而耗费大量CPU。特别是对于表记录数超100的表,一次表扫描占用大量CPU(基本把一个CPU占满),多个连接并发(例如上百连接),把所有CPU占满。

3.1. 通过下面的查询,查出使用表扫描最多的表:

select * from pg_stat_user_tables where n_live_tup > 100000 and seq_scan > 0 order by seq_tup_read desc limit 10; 

3.2. 查询当前正在运行的访问到上述表的慢查询:

select * from pg_stat_activity where query ilike '%<table name>%' and query_start - now() > interval '10 seconds'; 

3.3. 也可以通过pg_stat_statements插件定位涉及到这些表的查询:

select * from pg_stat_statements where query ilike '%<table>%'order by shared_blks_hit+shared_blks_read desc limit 3; 

处理慢SQL

对于上面的方法查出来的慢SQL,首先需要做的可能是Cancel或Kill掉他们,使业务先恢复:

select pg_cancel_backend(pid) from pg_stat_activity where query like '%<query text>%' 
and pid != pg_backend_pid(); select pg_terminate_backend(pid) from pg_stat_activity where query like '%<query text>%' and pid != pg_backend_pid(); 

如果这些SQL确实是业务上必需的,则需要对他们做优化。这方面有“三板斧”:

1. 对查询涉及的表,执行ANALYZE <table>或VACUUM ANZLYZE <table>,更新表的统计信息,使查询计划更准确。注意,为避免对业务影响,最好在业务低峰执行。

2. 执行explain 或explain (buffers true, analyze true, verbose true) 命令,查看SQL的执行计划(注意,前者不会实际执行SQL,后者会实际执行而且能得到详细的执行信息),对其中的Table Scan涉及的表,建立索引。

3. 重新编写SQL,去除掉不必要的子查询、改写UNION ALL、使用JOIN CLAUSE固定连接顺序等到,都是进一步深度优化SQL的手段,这里不再深入说明。

总结

需要说明的是,这些方法对于RDS for PPAS产品同样适用,但在使用我们所列的命令时,由于权限限制,需要把上面提到的视图、函数、命令做如下转换:

pg_stat_statements_reset() => rds_pg_stat_statements_reset()

pg_stat_statements => rds_pg_stat_statements()

pg_stat_reset() => rds_pg_stat_reset()

pg_cancel_backend() => rds_pg_cancel_backend()

pg_terminate_backend() => rds_pg_terminate_backend()

pg_stat_activity => rds_pg_stat_activity()

create extension pg_stat_statements => rds_manage_extension('create', 'pg_stat_statements')

上面我们分析了处理CPU满,追查问题SQL的一些方法。大家可以按部就班的尝试我们列出的命令,定位问题。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10月前
|
Kubernetes Cloud Native 应用服务中间件
Koordinator 最佳实践系列:精细化 CPU 编排
Koordinator 最佳实践系列:精细化 CPU 编排
|
Java
[最佳实践] Java线程栈分析 - CPU利用率持续升高
使用应用诊断分析平台ATP的Java线程栈分析功能,诊断CPU利用率持续升高问题
292 0
[最佳实践] Java线程栈分析 - CPU利用率持续升高
|
SQL 缓存 NoSQL
【巡检问题分析与最佳实践】PolarDB MySQL CPU高问题
CPU做为数据库资源最核心的资源,是日常最重点需要关注的指标,CPU用满,会导致应用RT增高、业务卡顿,更严重会导致数据库实例hang死发生ha等问题,严重影响日常生产业务。 一般对于CPU的监控需要设定安全水位,超出安全水位要及时处理,否则会引发不可预期的严重后果。
【巡检问题分析与最佳实践】PolarDB MySQL CPU高问题
|
SQL 监控 关系型数据库
【巡检问题分析与最佳实践】RDS PostgreSQL CPU高问题
当RDS PostgreSQL实例的CPU使用率持续较高时,很容易导致数据库访问卡慢的情况,例如一些很简单的查询请求的响应时间也会很久甚至超时失败。
|
SQL 缓存 数据库
阿里云SQL Server最佳实践:高CPU使用率问题排查
在阿里云SQL Server最佳实践系列在线直播中,阿里云数据库专家汪建明总结了7大问题并结合案例为大家分享了阿里云SQL Server高CPU使用率问题排查的实践经验。
11200 0
|
SQL 关系型数据库 Go
RDS SQL Server - 最佳实践 - 高CPU使用率系列之非SARG查询
# 摘要 阿里云RDS SQL Server客户遇到最多的一个问题便是高CPU使用率导致导致SQL Server服务响应缓慢,查询超时,甚至服务挂起僵死。本系列文章第四篇分析非SARG查询导致CPU的高利用率的解决之道。 # 问题引入 “鸟啊,你听说过RDBMS的非SARG查询语句吗?我还是今天第一次听说呢!”。老鸟有些不解的问菜鸟。 “哈哈,鸟哥,孤陋寡闻,土鳖了吧。它可是导致RDBMS
3625 0
|
SQL 关系型数据库 Go
RDS SQL Server - 最佳实践 - 高CPU使用率系列之数据类型转换
# 摘要 前两篇文章讨论了导致CPU高使用率的两个重要原因是索引缺失和索引碎片,本系列文章之三讨论数据类型隐式转换话题。 # 场景分析 在SQL Server中,比较运算符(大于、小于、等于或者连接)两端的数据类型需要保持一直才能进行。否则,SQL Server会按照数据类型优先级由低到高进行隐式转化,然后再进行比较。这个行为可以通过执行计划中的CONVERT_IMPLICIT关键字看出来,
5385 0
|
SQL 关系型数据库 Go
RDS SQL Server - 最佳实践 - 高CPU使用率系列之二索引碎片
# 摘要 上一篇文章分析了高CPU使用率的原因之一是索引缺失,接下来本系列文章之二的“索引碎片”是CPU高使用率的又一常见的原因。解决索引碎片问题是解决SQL Server服务响应缓慢,查询超时的又一利器。 # 问题引入 “鸟哥,我上一篇文章分享了因为索引缺失导致CPU高使用率的话题,反响不错。接下来,我打算分享索引碎片导致CPU高使用率的话题。”,菜鸟主动找到老鸟汇报工作。 上一篇文章详
4335 0
|
26天前
|
JSON Java Serverless
nacos常见问题之cpu和内存占用高如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
141 0

热门文章

最新文章