1.监控工具: 快照监视器(snapshot monitor): 特定时刻数据库活动的信息。返回的数据量由监控器开关决定,这些开关在DBM配置文件或会话级别设置。会有额外的性能影响。快照监视器数据是收集和存放在内存中(DBM的mon_heap_sz参数)
事件监视器(event monitor): 记录DB2数据库一段时间内的数据活动。允许收集一段时间内的信息包括死锁,链接,SQL语句。可能产生大的数据量,对系统影响比较大。
db2pd: 用户收集DB2实例和数据库的统计信息。包括数据库事务,表空间,表统计信息,动态SQL,数据库配置等。可将结果保存文件中。不需要获取DB2内部锁(latches)和到数据库的连接。
db2mtrk: 用于查看实例,数据库,代理进程当前对内存的使用情况。
2.快照监视器: 数据库管理器级别,通过修改DBM参数设置监控监视器开关: db2 get dbm cfg |grep dft_mon / db2 update dbm cfg using DFT_MON_TIMESTAMP off
每个连接到数据库的应用程序(会话)都有自己的监视器开关,与DBM和其他无关。会话连接数据库时,继承DBM的监视器开关设置:db2 get monitor switches / db2 update monitor switches using lock on
通过执行命令db2 get snapshot for locks/db/applications/tables/tablspaces/bufferpools/dynamic sql on sample >snap.out 或调用db2GetSnapshot() API得到快照
db2 get snapshot for application agentid (appication-handle) |grep -i id 获取应用的详细信息,进程号等
重置计数器,将所有监视器的计数器归零:reset monitor for db sample 或者reset monitor all
利用表函数得到快照,必须连接数据库。使用表函数发出SQL查询,返回一张监视器数据表。每列代表一个监视器元素,每行代表正在被监控的数据对象:select * from table((表函数)([DB名称],[分区号])) as [结果集名称]
db2 "select * from table(snapshot_table('sample',-1)) as T"
db2 "select * from table(snapshot_lock(cast(null as char),-1)) as lock_info"
快照表函数有2个输入参数,varchar(255)用于数据库名称,输入null表示当前已链接数据库。smallint用于分区号,-1或null表示当前已连接分区,-2表示捕获全局分区。
性能管理视图(都属于sysibmadm模式):
applications 数据库运行的应用, log_utilization 日志利用率的信息
bp_hitratio 缓冲池命中率, log_running_sql 执行时间最长的SQL
bp_read_io/bp_write_io 缓冲池读写信息等 snapbp 缓冲池的基本信息
container_utilization 表空间容器利用率 snaptab 表的信息
locks_held 当前锁的信息 tbsp_utilization 表空间利用率信息
lockwaits 锁等待的信息 top_dynamic_sql 资源消耗最多的SQL
1.监控案例:db2 get snapshot for all on sample > snap.out
识别是否存在死锁: grep -n "Deadlocks detected" snap.out | grep -v "= 0" | more
执行最频繁的语句: grep -n "Number of executions" snap.out |grep -v "= 0" |sort -rn -k 5 |more
读取行数最多的语句:grep -n "Rows read" snap.out |grep -v "= 0" |sort -rn -k 4 | more
总执行时间最长: grep -n "Total execution time " snap.out | grep -v "= 0" |sort -rn -k 5| more
显示语句文本: grep -n "Statement text" snap.out |more
2.监控案例(表函数)
先连接数据库:db2 connect to sample
执行查询: db2 "select snapshot_timestamp,table_name,rows_written,rows_read from table(snapshot_table('sample',-1)) as T"
创建一个或多个表保存监视器的数据:
db2 "create table instance_snap(snap_time timestamp not null,local_cons bigint,rem_cons bigint)"
db2 "insert into instance_snap select snapshot_timestamp,local_cons,rem_cons_in from table(snapshot_dbm(-1)) as snapshot_dbm"
db2 "select * from instance_snap"
3.snapshot管理视图
便于snapshot监视器结果的分析和统计,实例监控开关需要打开。
执行时间最长的20条语句:
db2 "select ROWS_READ/(NUM_EXECUTIONS+1) as AVG_ROWS_READ,ROWS_WRITTEN/(NUM_EXECUTIONS+1) as AVG_ROWS_WRITTEN,STMT_SORTS/(NUM_EXECUTIONS+1) as AVG_SORTS,TOTAL_EXEC_TIME/(NUM_EXECUTIONS+1) as AVG_EXEC_TIME,substr(STMT_TEXT,1,200) as SQL_STMT from sysibmadm.snapdyn_sql order by AVG_EXEC_TIME desc fetch first 20 rows only"
排序最多的20条语句:
db2 "select STMT_SORTS/(NUM_EXECUTIONS+1) as AVG_SORTS,TOTAL_EXEC_TIME/(NUM_EXECUTIONS+1) as AVG_EXEC_TIME,substr(STMT_TEXT,1,200) as SQL_STMT from sysibmadm.snapdyn_sql order by AVG_SORTS desc fetch first 20 rows only"
3.db2pd db2pd监控各种DB2数据库活动的监控工具。交互执行,且运行非常快,不需要获取任何锁。不需要建立到数据库的连接。
显示DB2的版本和当前操作系统的信息: db2pd -version -osinfo
检测动态SQL语句的内容和当前隔离级别:db2pd -d sample -dynamic
显示系统中静态语句包的信息: db2pd -d sample -static (可以估算被调用次数最多的静态存储过程)
检测存在锁等待的表: db2pd -d sample -locks wait showlocks 得到存在锁等待的表空间ID和表ID号,Sts列G(granted)表示此事务拥有type锁,W表示事务等待。Owner列显示锁的所有者。
select tabschema,tabname from syscat.tables where tbspaceid = 2 and tableid =6 确定存在锁等待的schema和表名
db2pd -d sample -transactions 将事务映射到应用程序。AppHandl对应TranHdl,db2 list applications可以查看到所对应的连接
显示应用程序和相应代理信息: db2pd -agents (可以将代理线程与应用程序对应起来)
输出EDU列别奥 : db2pd -edus (interval=3)
显示缓冲池信息,命中率: db2pd -d sample -bufferpool (需要打开bufferpool监控器开关)
检测系统日志的使用情况: db2pd -d sample -logs
tcb表状态信息: db2pd -d sample -tcbstats (包含被访问过的表的信息)
通常调用一次db2pd带多个选项: db2pd -d sample -locks wait showlocks -transactions -agents -applications -dynamic -file db2pd.out -repat 15 40(每隔15秒执行一次,共执行40次)
4.db2top 在多分区数据库系统,使用db2top需要特别谨慎。对于多分区的数据库做全局快照需要很大内存空间,对系统性能有影响。
左上角:最近一次快照的时间;refresh:每隔多少秒一次快照,可以在命令行用-i指定;右边括号表示系统捕获快照所耗时间
下一行:当前的运行规则。d表示delta;a表示active,显示活动变化的数值;e表示扩展显示;p表示分区,all所有分区,cur当前分区,数字表示指定分区。
右上角:操作系统类型,当前监视的分区,实例和数据库名。
功能键:k键,切换d=y/n; /键,进入搜索功能;
Z/z键,升序/降序排列,从0列开始;
L键+哈希值,指定SQL语句;
x键,找到当前语句的访问计划(sqllib/misc/explain.ddl已经执行过)。
子窗口:
d:数据库
t:表空间
D:动态SQL
l:应用程序
b:缓冲池
U:锁
T:表 --可以显示每个表的大小
5.事件监视器:(未被广泛运用,会产生非常大的文件) 事件监视器记录某事件(Event)或转变(Transition)出现时某段时间内数据库活动情况。事件监视器类似其他数据库对象,它由SQL DDL语句创建的。可以像快照监视器开关那样打开和关闭。
创建事件监视器时,必须先声明被监视事件的类型。当事件发生时,相应事件记录被记录下来。database,tables,deadlocks,tablespaces,connections,statements,transactions。
事件监视器的输出放在目录或者命名管道中,或者表中。
事件监视器创建方法: 1.创建一个SQL event monitor,写入文件:db2 create event monitor SQLCOST for deadlocks,statements write to file '/db2db/event' (write to table)
2.激活||取消激活事件监视器: db2 "set event monitor SQLCOST state =1 " || db2 "set event monitor SQLCOST state =0 "
3.使用db2evmon工具格式化原始数据: db2evmon -db sample -evm SQLCOST > sqltrace.txt
db2 list tables for all |grep -i stmt,找到输出表,分析输出:
1.按照执行时间降序排列执行时间最长的SQL语句:
db2 "select stmt_text,(stop_time-start_time) ExecutionTime from stmt_sql_trace where stmt_operation not in (7,8,9,19) order by decimal(ExecutionTime) desc fetch first 10 rows only"
2.按照执行频率降序排列执行次数最多的SQL语句:
db2 "select distinct(stmt_text),count(*) Count from stmt_sql_trace where stmt_operation not in (7,8,9,19) group by stmt_text order by count(*) desc fetch first 10 rows only"
3.按照CPU时间降序排列最耗CPU时间的SQL语句:
db2 "select stmt_text,user_cpu_time UserCPU from stmt_sql_trace where stmt_operation not in (7,8,9,19) order by usercpu desc fetch first 10 rows only"
4.按照总排序时间降序排列时间最长的SQL语句:
db2 "select stmt_text,total_sort_time TotalSortTime from stmt_sql_trace where stmt_operation not in(7,8,9,19) order by decimal(total_sort_time) desc fetch first 10 rows only"
6.db2mtrk: db2mtrk是DB2进行内存跟踪的工具,可以用于查看实例,数据库,代理进程当前对内存的使用情况。
db2mtrk -i -v -d -p -m
-i 显示当前实例的内存使用情况
-d 显示数据库的内存使用情况
-v 显示详细信息
-p 显示代理进程专用内存使用率
-m 显示最大的内存使用上限
7.活动监视器(基于图形界面,底层调用监控命令和参数)
添加新评论0 条评论