前言

本文介绍生产环境中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. Vue中数组变动监听

    Vue中数组变动监听 Vue的通过数据劫持的方式实现数据的双向绑定,即使用Object.defineProperty()来实现对属性的劫持,但是Object.defineProperty()中的set ...

  2. fastjson反序列化各版本利用汇总

  3. New Questions

    1. C++/Qt 实现一个信号槽 #include <functional> #include <iostream> #include <vector> clas ...

  4. 【Android 逆向】frida 检测绕过

    1. aaa.apk 安装到手机,是一个叫玩吧的应用 ./hooker ...... 23248 浏 览 器 com.browser2345_oem 32541 玩吧 com.wodi.who 244 ...

  5. 使用TLP对Linux系统进行充电保护

    https://zhuanlan.zhihu.com/p/65546444 TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具 https://blog.csdn.net/zxw781 ...

  6. Vue框架设计:性能权衡的艺术

    "框架设计里到处都体现了权衡的艺术." 当我们设计一个框架的时候,框架本身的各个模块之间并不是相互独立的,而是相互关联.相互制约的.因此作为框架设计者,一定要对框架的定位和方向拥有 ...

  7. Long和int比较用==还是用equals

    应该用==,因为equels会先比较类型,这样值一样的不同类型的数字就直接返回false啦.看源码吧. public boolean equals(Object obj) { System.out.p ...

  8. linux的简单使用

    了解Linux的简单使用 Linux的安装 下载Linux Ubuntu版本和虚拟机VMware软件. 我已经提前下载好了,下载好的文件分享出来bd 这个是文件夹内的VMWare软件的注册码,安装完成 ...

  9. 按值传递,引用传递 浅析java String ,对象与对象引用的区别

    目录 一.前言 二.何谓对象? 三.何谓对象引用? 四.创建对象 Vehicle veh1 = new Vehicle(); 五.参数传值 六.Java Sting 最后!有错误的地方欢迎指正 一.前 ...

  10. 4、zookeeper的事件监听机制

    watcher概念 https://zookeeper.apache.org/doc/r3.4.14/zookeeperProgrammers.html#sc_WatchRememberThese z ...