Db2性能:系统CPU高问题分析的一些思路
db2性能:系统CPU高问题分析的一些思路
1. 如何判断CPU高?
有很多操作系统的命令可以看出来,比如ps -elf,iostat, vmstat, top/topas,
2. 收集数据
CPU高分为usr高和sys高,前者表示系统在执行应用代码,一般需要应用(比如Db2)来查原因。后者表示系统在执行kernal code,一般需要OS工程师协助分析。
A. sys CPU高
如果是%sys CPU高,这意味着系统在执行kernel code,这种情况下需要操作系统工程师一块支持,来从操作系统层面收集数据,例如:
AIX:
1) OS trace -- perfpmr.sh
Solaris:
1) dtrace script
Linux:
1) systemTap 工具
2) 如果能确定是Db2进程导致的,则收集db2sysc进程的strace -c 数据。
Db2:
Db2层面也可以收集一些数据,Db2导致的sys CPU高时,往往伴随着很多的latch,所以建议收集db2pd -latch和db2pd -stack的数据。
B. usr CPU高
如果是%usr CPU高,一般意味着系统正在执行应用的代码,很大可能是Db2执行的SQL语句导致的。需要找到占用CPU较多的SQL语句,看看在执行什么操作:
B1. 可以通过mon_get_pkg_cache_stmt找到占用CPU较多的动态SQL语句
db2 "select TOTAL_CPU_TIME/NUM_EXEC_WITH_METRICS as AVG_CPU_TIME, NUM_EXEC_WITH_METRICS, substr(STMT_TEXT,1,100) as STMT_TEXT from table( mon_get_pkg_cache_stmt (null, null,null,null)) as T where T.NUM_EXEC_WITH_METRICS <> 0 order by AVG_CPU_TIME DESC"
如果是routine占用了较多的CPU,比如存储过程,可以参考下面的链接:
调查routine的高 CPU 占用率
https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_10.5.0/com.ibm.db2.luw.admin.mon.doc/doc/t0060667.html
B2. 可以通过db2pd -edus interval=120 来收集120秒之内每个edu占用的CPU时间,结合其他的信息,比如db2pd -eve、application snapshot的输出,来看一下edu对应的应用,以及应用执行的SQL语句是什么,针对这些SQL语句来优化。
SQL语句使用CPU较多的原因,简单说几个
--频繁地扫描环境池中的表、join操作、排序操作都会使用较多的CPU。
--获取锁和释放锁的过程,也要用较多的CPU。
对于如何解决,一般就是调优SQL了,比如通过建立适当的索引来避免表扫描、当需要锁较多时而对并发性要求不高时,直接在整个表上加锁、不需要那么多数据的时候使用fetch first xxx rows only等。这里不做阐述(因为我也不擅长),有兴趣的可以看参考资料。
3. 一个示例
环境: db2 10.5.0.5, suse linux 11
问题:%usr CPU高,大约95%,db2sysc进程使用的最多
数据收集:
在问题出现期间,收集了以下数据:
vmstat > vmstat.
ps -elf > pself.
ps aux > psaux.
iostat > iostat.
db2pd -eve > db2pd_eve.out
db2pd -edus interval= > db2pd_edu_120.out
db2pd -stack all
db2 GET SNAPSHOT FOR APPLICATIONS ON <db_name> GLOBAL > applications.log
db2 GET SNAPSHOT FOR DATABASE ON <db_name> GLOBAL > DB.log
db2 get snapshot for all on <db_name> > dbsnap
数据分析:
3.1
iostat 输出显示 user CPU 很高.
avg-cpu: %user %nice %system %iowait %steal %idle 89.42 0.01 4.55 1.89 0.00 4.12 avg-cpu: %user %nice %system %iowait %steal %idle 94.41 0.00 5.59 0.00 0.00 0.00 avg-cpu: %user %nice %system %iowait %steal %idle 95.42 0.00 4.58 0.00 0.00 0.00 avg-cpu: %user %nice %system %iowait %steal %idle 94.67 0.00 5.33 0.00 0.00 0.00
3.2
ps aux的输出显示db2sysc进程使用了最多的CPU
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 0.0 0.0 ? Ss Oct15 : init [] root 0.0 0.0 ? S Oct15 : [kthreadd] ... root 0.0 0.2 ? Sl Oct15 : db2wdog [db2inst1] db2inst1 69.2 ? Sl Oct15 : db2sysc root 0.0 0.1 ? S Oct15 : db2ckpwd root 0.0 0.1 ? S Oct15 : db2ckpwd root 0.0 0.1 ? S Oct15 : db2ckpwd db2inst1 0.0 0.1 ? S Oct15 : db2vend (PD Vendor Process - ) db2inst1 0.0 0.1 ? Sl Oct15 : db2acd ,,,,,,,,,,,995bc4,,1e014,,,,41fc0,0x210000000,0x210000000,,c8010,, ... root 50.0 0.0 pts/ R+ : : ps aux root 0.0 0.0 ? S : : [kworker/:] patrol 0.0 0.0 ? Ss Oct15 : /bin/bash patrol 0.0 0.0 ? Ss Oct15 : /bin/bash root 0.0 0.0 ? S Oct15 : [kworker/:]
3.3
db2pd_edu_120.out 输出按照对EDU按照占用的CPU时间排序
Database Member -- Active -- Up days :: -- Date ---14.48.37.897471 List of all EDUs for database member db2sysc PID: db2wdog PID: db2acd PID: EDU ID TID Kernel TID EDU Name USR (s) SYS (s) USR DELTA SYS DELTA ======================================================================================================================================== db2agent (SAMPLE) 24280.590000 478.060000 42.250000 1.080000 db2agent (SAMPLE) 23898.440000 454.140000 40.980000 0.900000 db2agent (SAMPLE) 23530.870000 446.600000 40.830000 0.850000 db2agent (SAMPLE) 22660.420000 430.300000 40.600000 1.000000 db2agent (SAMPLE) 23262.550000 443.450000 40.640000 0.900000 db2agent (SAMPLE) 22989.210000 438.320000 40.660000 0.880000 db2agent (SAMPLE) 22994.820000 436.550000 40.540000 0.900000 db2agent (SAMPLE) 23656.830000 450.830000 40.540000 0.840000 db2agent (SAMPLE) 23687.730000 450.920000 40.430000 0.920000 db2agent (SAMPLE) 23498.360000 445.650000 40.440000 0.900000 db2agent (SAMPLE) 22711.160000 427.530000 40.450000 0.850000 db2agent (SAMPLE) 23338.770000 443.420000 40.270000 1.020000 db2agent (SAMPLE) 22876.610000 435.050000 40.340000 0.920000 db2agent (SAMPLE) 23423.810000 446.610000 40.340000 0.900000 db2agent (SAMPLE) 22886.840000 433.260000 40.330000 0.910000 db2agent (SAMPLE) 23631.250000 450.080000 40.220000 1.010000 db2agent (SAMPLE) 23291.960000 443.260000 40.250000 0.980000 db2agent (SAMPLE) 23276.780000 445.550000 40.270000 0.920000 db2agent (SAMPLE) 22218.640000 419.450000 39.990000 0.960000 db2agent (SAMPLE) 23387.590000 442.670000 39.970000 0.930000 db2agent (SAMPLE) 22597.700000 427.340000 39.910000 0.970000 db2agent (SAMPLE) 22962.390000 437.080000 39.990000 0.870000 db2agent (SAMPLE) 23466.230000 448.500000 39.830000 1.020000 db2agent (SAMPLE) 23581.980000 450.790000 39.910000 0.920000 db2agent (SAMPLE) 22448.450000 423.550000 39.840000 0.930000 db2agent (SAMPLE) 22930.950000 437.310000 39.740000 0.870000 db2agent (SAMPLE) 22260.260000 423.640000 39.640000 0.910000 ...
3.4
这里以EDU ID 110为例子,可以通过db2pd_eve.out找到其执行的SQL语句(这里可能不准确,因为抓取的是当前正在执行的SQL, 推荐结合mon_get_pkg_cache_stmt的输出)
Dynamic SQL Statements: Address AnchID StmtUID NumEnv NumVar NumRef NumExe Text ... 0x00007FAC67B6C640 select * from TEST1 where KPICODE like '2222|!|!|%' order by DCTIME desc fetch first rows only with ur ...
3.5
Application SNAPSHOT显示sort、rows read都非常高
Application Snapshot Application handle = Application status = UOW Executing .. Rows inserted = Rows updated = Rows selected = Rows read = Rows written = .. Total sorts = .. Total User CPU Time used by agent (s) = 24801.492324 Total System CPU Time used by agent (s) = 0.000000 Agent process/thread ID =
3.6
剩下的工作是:可以按照相同的方法找到其他占用CPU的SQL,并进行调优。当然,实际上可能并没有这么简单,需要多分析应用的快照,可以看到SQL语句是什么时候开始执行的?执行了多长时间?执行SQL语句之前是什么状态?同一时刻有多少SQL语句在执行?平时有那么多吗?等等,这些都可以从应用的快照中获取。所以应用的快照也是必收数据,而且要多收几次。
Db2性能:系统CPU高问题分析的一些思路的更多相关文章
- 来看看是什么原因导致生产服上的系统CPU高的?
我们可能会遇到生产服务器CPU很高的问题,有时候能确定是哪个进程,但是不知道这个进程都在干什么,所以也无从下手,无法解决问题.只能不断的重启,重启等. 最近也看了[一线码农]的一些教程,觉得都很不错, ...
- 生产环境服务CPU高问题分析
问题描述: 现网个别时候会出现CPU突然飙高的现象,飙高后不能恢复正常. 分析过程: CPU飙高后抓dump,最好本机看,其它机器看dump可能需要下载服务运行机器的sos,clr 0:000 ...
- 转 cpu高 问题分析定位
文章来源: http://www.blogjava.net/hankchen/archive/2012/08/09/377735.html 一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原 ...
- java进程CPU高分析
JVM导致系统CPU高的常见场景: 内存不足,JVM gc频繁,一般会伴随OOMJVM某个线程死循环或者递归调用 定位和解决1.内存不足,gc频繁可参考我的这遍文章解决.https://blog.cs ...
- 再记一次 应用服务器 CPU 暴高事故分析
一:背景 1. 前言 大概有2个月没写博客了,不是不想写哈
- 关于linux系统CPU篇--->CPU使用率升高
1.CPU使用率为单位时间内CPU使用情况的统计,以百分比的方式展示. LINUX作为一个多任务操作系统,将每个CPU的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运 ...
- db2 cpu使用率高问题分析处理
性能调优步骤 明确问题->收集数据->分析数据->细化.定位问题->优化 环境: db2 问题:%usr CPU高,大约99%,db2sysc进程使用的最多 收集数据 ---系 ...
- 性能分析(6)- 如何迅速分析出系统 CPU 的瓶颈在哪里
性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 前言 在做性能测试时,我们会需要对 Linux 系 ...
- 关于linux系统CPU篇--->不容易发现的占用CPU较高进程
1.系统的CPU使用率,不仅包括进程用户态和内核态的运行,还包括中断处理,等待IO以及内核线程等等.所以,当你发现系统的CPU使用率很高的时候,不一定能找到相对应的高CPU使用率的进程 2.案例分析, ...
随机推荐
- 微软BI 之SSRS 系列 - 基于时间段参数的 MDX 查询以及时间日历 Date Picker 的时间类型参数化
今天在天善问答里看到一个问题,如果我没有理解错的话,它应该是指比如在一个报表中选取一个时间段,然后求出这个时间段的某个 Measure 的 SUM 和.并且同时求出这两个时间点对应的上一年的时间点之间 ...
- MongoDB副本集配置系列七:MongoDB oplog详解
1:oplog简介 oplog是local库下的一个固定集合,Secondary就是通过查看Primary 的oplog这个集合来进行复制的.每个节点都有oplog,记录这从主节点复制过来的信息,这样 ...
- Android studio3.1.3 打包jar,混淆
最近公司需要将数据进行打包提供给用户,需要我们提供数据解析的jar给用户,为了防止数据格式的泄露,需要进行混淆.这里记录一下封装jar并混淆的过程. 1.创建module 之后创建了几个需要演示混淆的 ...
- [Aaronyang] 写给自己的WPF4.5 笔记7[三巴掌-ItemsControl数据绑定详解与binding二次处理 3/3]
我要做回自己--Aaronyang的博客(www.ayjs.net) 博客摘要: 全方位的讲解了转换器的使用,单值,多值转换器,条件转换器,StringFormat等方式 详细的实践地讲解了Items ...
- Oracle之外键(Foreign Key)使用方法具体解释(二)- 级联删除(DELETE CASCADE)
Oracle外键(Foreign Key)之级联删除(DELETE CASCADE) 目标 演示样例解说怎样在Oracle外键中使用级联删除 什么是级联删除(DELETE CASCADE)? 级联删除 ...
- Android BLE蓝牙开发-读写数据 获取UUID
https://www.jianshu.com/p/3711cfbf7128 一个ble蓝牙设备有多个包括多个Profile 一个Profile中有多个服务Service(通过服务的uuid找到对应的 ...
- GuavaCache学习笔记三:底层源码阅读
申明:转载自 https://www.cnblogs.com/dennyzhangdd/p/8981982.html 感谢原博主的分享,看到这个写的真好,直接转载来,学习了. 另外也推荐另外一篇Gua ...
- adb命令使用总结
1.启动/停止 启动 adb server 命令: adb start-server (一般无需手动执行此命令,在运行 adb 命令时若发现 adb server 没有启动会自动调起.) 停止 adb ...
- Python多线程与多线程中join()的用法
多线程实例 https://www.cnblogs.com/cnkai/p/7504980.html 知识点一:当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时 ...
- python 的正则表达式
在python中,对正则表达式的支持是通过re模块来支持的.使用re的步骤是先把表达式字符串编译成pattern实例,然后在使用pattern去匹配文本获取结果. 其实也有另外一种方式,就是直接使用r ...