前言

本文介绍生产环境中CPU使用率高的常见原因,以及在CPU使用率高问题上的可能解决措施。

本文主要内容:

关于用于识别高CPU使用率的工具,例如kwr报告中DB CPU指标、kmonitor和sys_stat_statements。

确定CPU使用率高的根本原因。

使用 Explain Analyze查看执行计划、连接池和vacuum表解决CPU使用率过高的问题。

识别CPU使用率高的方法

1.kwr报告中DB CPU指标

DB CPU指标可作为一段时间内CPU使用率的依据。

kwr报告提供CPU使用率过高时的有关sql耗时。

2.kmonitor

kmonitor监控工具中资源使用率项可监控cpu使用率。并提供邮件、短信告警功能。

注:如果操作系统部署了nmon工具,也可以查看一段时间内cpu使用率,或在操作系统使用top命令查看cpu使用情况。

3.sys_stat_statements

sys_stat_statements扩展可识别占用cpu时间的查询。

查询sql的总cpu消耗时间
select c.rolname,b.datname,a.total_parse_time+a.total_plan_time+a.total_exec_time as total_time,a.* from sys_stat_statements a,sys_database b,sys_authid c where a.userid=c.oid and a.dbid=b.oid order by a.total_exec_time desc limit 5; 查询sql平均执行时间
SELECT userid::regrole, dbid, query, mean_exec_time
FROM sys_stat_statements
ORDER BY mean_exec_time
DESC LIMIT 5; 查询sql总执行时间
SELECT userid::regrole, dbid, query
FROM sys_stat_statements
ORDER BY total_exec_time
DESC LIMIT 5;

CPU消耗较高的原因可能有

1.长时间运行的事务

长事务可能导致CPU使用率过高。

查询运行时间最长的连接:

SELECT pid, usename, datname, query, now() - xact_start as duration

FROM sys_stat_activity

WHERE pid <> sys_backend_pid() and state IN ('idle in transaction', 'active')

ORDER BY duration DESC;

2.数据库总连接数

数据库的大量连接也可能会导致CPU和内存使用率增加。

以下查询提供按状态排序的连接数信息:
SELECT state, count(*)
FROM sys_stat_activity
WHERE pid <> sys_backend_pid()
GROUP BY 1 ORDER BY 1;

3.低效的sql

kwr报告中 Top SQL By Elapsed Time,Top SQL By CPU Time可以查询消耗高cpu的sql语句,再通过explain analyze语法分析该sql执行计划从而优化sql。

4.硬件性能低

有的业务系统执行大批量sql导致服务器cpu使用率高有时是正常现象,并不一定都是慢sql导致,这种情况往往因为服务器硬件资源有限。

解决CPU使用率较高的问题

1.使用 Explain Analyze

使用explain语法进一步查看sql的真实执行计划并进行优化。有关explain命令的详细信息,可在ksql客户端使用\h explain查看。

2.使用连接池

如果存在大量空闲连接或大量使用CPU的连接,请考虑使用连接池程序控制总连接数和空闲连接时长。

3.终止长时间运行的事务

可以考虑和应用人员协商终止长时间运行的事务释放内存和cpu资源。

如要终止会话的PID,需要使用以下查询有关PID:
SELECT pid, usename, datname, query, now() - xact_start as duration
FROM sys_stat_activity
WHERE pid <> sys_backend_pid() and state IN ('idle in transaction', 'active')
ORDER BY duration DESC; 获得会话的PID后,可以使用以下查询进行终止:
SELECT sys_terminate_backend(pid);
注:如果此终止方式失败,则需要在操作系统调用gdb命令终止会话连接。

4.更新表的统计信息

使表的统计信息保持最新状态有助于提高查询性能,监视是否正在执行常规vacuum。

以下查询可识别需要vacuum的表:
select schemaname,relname,n_dead_tup,n_live_tup,last_vacuum,last_analyze,last_autovacuum,last_autoanalyze
from sys_stat_all_tables where n_live_tup > 0; 其中字段last_autovacuum和last_autoanalyze提供上次自动vacuum或分析表的日期和时间,如果未定期vacuum表,请执行以下步骤来优化自动vacuum。 临时解决方案是对表执行手动vacuum
vacuum analyze <table_name>;

KingbaseES 数据库CPU使用率过高问题与解决的更多相关文章

  1. 服务器CPU使用率过高排查与解决思路

    发现服务器的cpu使用率特别高 排查思路: -使用top或者mpstat查看cpu的使用情况# mpstat -P ALL 2 1Linux 2.6.32-358.el6.x86_64 (linux— ...

  2. 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(下)

    <Troubleshooting SQL Server>读书笔记-CPU使用率过高(下) 第三章 High CPU Utilization. CPU使用率过高的常见原因 查询优化器会尽量从 ...

  3. 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(上)

    第三章 High CPU Utilization. CPU使用率过高问题很容易被发现,但是诊断却不是很容易.CPU使用过高很多时候会成为其它问题的替罪羊,所以在确认和故障诊断时要抽丝剥茧. 调查CPU ...

  4. mysql cpu使用率过高解决方法

    mysql cpu使用率过高解决方法 1 mysql查看正在运行的语句 并且查看运行最多的mysql语句 MySQL 打开 general log 后,所有的查询语句都会记录在 general log ...

  5. Oracle查询语句导致CPU使用率过高问题处理

    解决此问题的关键在于如何找到造成CPU使用率过高的SQL语句.步骤如下: 1.使用Process Explorer工具查看到Oracle进程,双击Oracle进程,在弹出的属性窗口的Threads选项 ...

  6. Java程序CPU使用率过高

    Java程序CPU使用率过高 通过top命令找到使用率过高的java进程PID 根据进程号查找线程TID:ps -mp PID -o THREAD,tid,time 将TID转换成16进制:print ...

  7. 记录一次mysql查询速度慢造成CPU使用率很高情况

    1.某日zabbix告警,某台机器CPU使用率过高. 查看慢查询日志,看到很多sql语句都超过10秒 把sql语句拿出来放在查询窗口执行.前面加上explain就可以查看详细查询信息 playcode ...

  8. CPU使用率过高分析方法

    项目过程中发现,应用服务器经常会出现CPU使用率较高的情况,需要定位出具体代码问题. 1.用top命令,根据CPU使用率排序,找出消耗cpu最高的进程 2.找出该进程下消耗CPU最高的线程(命令:to ...

  9. 空循环导致CPU使用率很高

    业务背景 业务背景就是需要将多张业务表中的数据增量同步到一张大宽表中,后台系统基于这张大宽表开展业务,所以就开发了一个数据同步工具,由中间件采集binlog消息到kafka里,然后我去消费,实现增量同 ...

  10. 线上cpu使用率过高解决方案

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. 下面我们将一步步定位问题,详尽的介绍每一步骤的相关知识. 一.通过top命令定位占用cpu高的进程 执行top命令得到 ...

随机推荐

  1. 【OpenGL ES】光影(光照与阴影)效果

    1 前言 ​ Blinn改进的冯氏光照模型 中只展示了光照效果,本文将进一步展示阴影效果. ​ 绘制阴影,需要用到深度纹理,即从光源角度看模型并绘制一张纹理图,纹理图的颜色代表了模型上的点离光源的深度 ...

  2. mantis如何更改用户密码

    从MantisBT版本开始,创建用户后,必须由用户通过确认邮件进行修改密码,而管理员无权对用户的密码进行修改.这对于配置mail不成功的情况下很不方便.     以下配置就可以让管理员轻松管理用户的密 ...

  3. mysql插入表中的中文字符显示为乱码或问号的解决方法

    mysql中文显示乱码或者问号是因为选用的编码不对或者编码不一致造成的,最简单的方法就是修改mysql的配置文件my.cnf.在[mydqld]和[client]段加入 default-charact ...

  4. http 与 tcp 的一些学习

    HTTP 是一个基于 TCP/IP 通信协议来传递数据的协议,传输的数据类型为 HTML 文件,.图片文件, 查询结果等. HTTP 协议一般用于 B/S 架构().浏览器作为 HTTP 客户端通过 ...

  5. win32 - ReadDirectoryChangesW的使用

    任务:创建一个进程,并在进程内创建一个文本,再创建另一个进程来监控第一个进程内的文本变化 //Process 1 #include <windows.h> #include <ios ...

  6. Vulnhub内网渗透DC-7靶场通关

    个人博客: xzajyjs.cn DC系列共9个靶场,本次来试玩一下一个 DC-7,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题.靶场推 ...

  7. 使用winsw将jar包注册成windows服务

    使用winsw将jar包注册成windows服务 注:exe文件作用:使用winsw将jar包注册成windows服务(下载地址https://github.com/winsw/winsw/relea ...

  8. 如何在 WindowManager.addView 中使用 Jetpack Compose

    如何在 WindowManager.addView 中使用 Jetpack Compose 一.引出问题 Android 开发中,很常见的一个场景,通过 WindowManager.addView() ...

  9. 【Azure 应用服务】应用代码中需要使用客户端证书访问服务接口,部署在应用服务后报错不能找到证书(Cannot find the X.509 certificate)

    问题描述 在应用中,需要访问另一个服务接口,这个接口需要使用客户端证书进行认证.在代码中使用 System.Security.Cryptography.X509Certificates 加载Windo ...

  10. 【Azure 环境】如何解决Principal 2330xxxxxxxxxxxxxxxxxxxx31efc5 does not exist in the directory xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx问题

    问题描述 在使用 Key Vault 和 Azure CLI 管理存储帐户密钥的官方文档中,其中有一步是"向 Key Vault 授予对你的存储帐户的访问权限", 其中CLI命令中 ...