声明:所有文章只作为学习笔记用,转载非原创
官方内存
https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_9.7.0/com.ibm.db2.luw.admin.perf.doc/doc/c0005383.html
计算数据库大小
https://www.csdn.net/gather_2d/MtTaEgxsMTA3Mi1ibG9n.html
https://bbs.csdn.net/topics/350125563
锁
https://blog.csdn.net/huaxin520/article/details/8281777?utm_source=blogxgwz9
https://www.talkwithtrend.com/Article/188841
DB2 锁和并发
--学习资料整理
主要内容:
锁等待
锁升级
死锁
一、锁等待
1、锁等待:当应用程序对一个对象请求的锁不能够立刻得到时,该程序将进入一个等待服务的队列,等待占用该锁的应用程序提交或回滚来释放该锁。
2、锁定超时检测,能够防止应用程序在异常情况下无限制地等待释放锁定。
3、locktimeout参数配置任何应用程序应等待获取锁定的最长时间,这样可以帮助避免全局死锁的情况发生。如果锁定请求处于暂挂的时间大于locktimeout值,那么请求应用程序将收到错误(-911)并将其事务回滚。
locktimeout的默认值为-1,它关闭锁定超时检测。如果该值为-1,则应用程序将会出现无穷锁等待现象。
4、对于生产系统中的OLAP,一开始为60秒比较好,对于OLTP大约为10秒比较好。对于开发环境,应该使用-1,以识别和解决锁等待的情况。如果有大量的并发用户,则可能需要增加OLTP时间,以避免回滚。
5、如果快照监控结果输出中“Lock Timeouts”是一个较高的数,那么可能原因有:
a、LockTimeOut的值太低
b、某个事物持有锁的时间有所延长
c、锁升级
6、锁等待可能造成如下结果:
a、引起死锁(死锁是锁等待的一个特例),有死锁检测器处理;
b、等待超时,等待的应用程序返回SQLCODE -911和原因码68,并自动回滚;
c、如果locktimeout的值被设置为-1,则应用程序将永远等待,直到能够获得所需要的锁;
d、对于行、表、数据分区和MDC块锁定,应用程序可根据业务逻辑需要使用SET CURRENT LOCK TIMEOUT 来覆盖数据库级别的locktimeout设置。
7、锁等待问题解决流程和步骤:
a、把数据库监控开关打开:
db2 update dbm cfg using DFT_MON_LOCK on DFT_MON_STMT on
db2 update montitor switches using lock on sort on bufferpool on uow on table on statement on
补充:
查看数据库的参数配置(前提:连接上数据库):
db2 get db cfg
b、监控SQL脚本:
select agent_id, substr(stmt_text, 1, 100) as statement, stmt_elapsed_time_ms from table(snapshot_statement('SAMPLE', -1)) as b
where agent_id in (select agent_id_holding_lk from table(snapshot_lockwait('SAMPLE', -1)) as a order by lock_wait_start_time asc fetch first 20 rows only ) order by stmt_elapsed_time_ms desc
;--(这个脚本非常使用,要熟记)
此语句会按照执行时间的长短的先后顺序排列出所有造成lockwait的SQL语句。
c、可以将上述的a和b写到shell脚本中,每隔30秒运行一次,把监控结果输出到一个文件中;
d、一旦定位引起锁等待的SQL后,若改SQL语句写的效率很低,可以考虑对该SQL调优;若该SQL没有创建最合理的索引,尝试使用db2advis工具为引起锁等待的SQL创建最合理的索引;
e、如果创建索引和调优SQL仍然不能解决问题,考虑能否根据业务逻辑选择UR隔离级别。但这种方式只能解决读的问题;
f、在业务逻辑允许的情况下,考虑设置DB2_EVALUNCOMMITTED、DB2_SKIPDELETED和DB2_SKIPINSERTED来提高并发;
g、最后考虑能否对引起锁等待的SQL语句关联的表做数据归档、业务分离等。
总结:以前,只能在数据库级别通过更改locktimeout数据库配置参数的值来指定锁定等待超时时间。锁定等待策略通过新的SET CURRENT LOCK TIMEOUT可以在语句级别指定(DB2 V9.5以后),此语句更改CURRENT LOCK TIMEOUT专用寄存器的值。CURRENT LOCK TIMEOUT专用寄存器指定在返回指示不能获取锁定的错误之前等待锁定的秒数。
8、捕获引起锁等待的SQL。使用db2pd监控工具找到正在等待的锁定的所有者,然后再找出相应的SQL语句进行调整。
a、判断数据库中是否存在大量锁等待,使用get snapshot for database来监控
db2 get snapshot for database on prod | grep -i lock
此语句执行结果中,查看Lock Waits等数据,判断数据库中是否有大量的锁等待。
b、确定哪个事务包含锁定。通过运行具有-locks属性的db2pd命令来显示有关当前锁定的信息;在Sts(状态)列中查找带“W”(表示等待){“G”,是granted,被授权获得锁}的行。“所有者”列指示哪个事务持有该锁定。
c、通过运行db2pd -transactions来标识正在运行事务的应用程序,该事务正在持有锁定;
d、通过运行db2pd -agents来标识正在运行应用程序的代理进程;
e、通过运行db2 get snapshot for application agentid 1602(对应APPHANDL)--应用程序句柄,定位锁等待的SQL语句和正在等待的agentid;
9、利用db2pd捕获锁超时;
为了捕捉死锁,可以创建一个死锁事件监视器。每当出现死锁时,此死锁事件监视器便写一个条目。但是,对于锁超时就没有类似的事件监视器。下面将举例说明,如何利用db2pd捕获锁超时。
a、锁监视db2pd选项:locks - TranHdl - database - file - showlocks - wait
其中:TranHdl:用于指定事务句柄,以便只监视由特定事务持有的锁;
showlocks:用于将锁名称扩展成有意义的解释。对于一个行锁,将显示如下信息:表空间ID、表ID、分区ID、页和槽。通过编目视图SYSCAT.TABLES,可以将表空间ID和表ID映射到相应的表名。
调用命令:
检查锁信息:db2pd -db database_name -locks
检查锁等待:db2pd -db database_name -locks wait showlocks
占用cpu 高
https://www.cnblogs.com/dahaoran/p/9292821.html
vmstat 1 10 > vmstat.1
ps -elf > pself.1
ps aux > psaux.1
iostat 1 10 > iostat.1
db2pd -eve > db2pd_eve.out
db2pd -edus interval=120 > 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
进程
http://blog.itpub.net/22661144/viewspace-1477182/
https://www.cnblogs.com/gnuhpc/archive/2012/12/07/2807332.html
https://www.linuxrumen.com/rmxx/1604.html
https://www.cnblogs.com/Little-Coder/p/10137597.html
https://blog.51cto.com/5063935/2074303
实例共享内存
每个 DB2 实例都有一个实例共享内存。实例共享内存是在数据库管理器启动(db2start)时分配的,并随着数据库管理器的停止(db2stop)而释放。这种内存集用于实例级的任务,例如监控、审计和节点间通信。下面的数据库管理器配置(dbm cfg)参数控制着对实例共享内存以及其中个别内存池的限制:
实例内存( instance_memory)。
监视器堆( mon_heap_sz):用于监控。
Audit Buffer( audit_buf_sz):用于 db2audit 实用程序。
Fast Communication buffers ( fcm_num_buffers):用于分区之间的节点间通信。仅适用于分区的实例。
如果 instance_memory被设为 AUTOMATIC,则可以使用下面的命令来确定它的值:
db2 attach to instance_name(其中 instance_name是实例的名称)
db2 get dbm cfg show detail
为了发现分配给主缓冲池的内存有多少,可以发出:
SELECT * FROM SYSCAT.BUFFERPOOLS
虽然大多数内存池的大小是由配置参数预先确定的,但下面两种内存池的大小在默认情况下却是动态的:
1. 包缓存: pckcachesz = maxappls * 8
2. 编目缓存: catalogcache_sz = maxappls * 4
3. 活动应用程序的最大数量: maxappls = AUTOMATIC
AUTOMATIC的效果是允许任意数量的连接数据库的应用程序。DB2 将动态地分配所需资源,以支持新的应用程序。因此,包缓存和编目的大小可以随着maxappls的值而变化。
网友评论