医院业务软件健康管理实战案例分享

满堂花醉三千客,一剑霜寒十四州。这篇文章主要讲述医院业务软件健康管理实战案例分享相关的知识,希望能为你提供帮助。
程序质量不佳造成的锁等待事件

业务健康度(第一期)调查数据显示:医院分钟级非空闲等待(锁等待)主因集中于两大领域。?
1、不当的人工操作:开发人员操作、建索引、报表统计、备份系统……
2、程序质量不佳(代码、结构)造成的锁等待事件约80%集中于长事务:长事务造成、缺失索引造成……

医院业务软件健康管理实战案例分享

文章图片
?
?


医院业务软件健康管理实战案例分享

文章图片
第一类行锁事件:DML语句的运行直接造成长时间的行锁等待


DML语句通常指更新UPDATE、插入INSERT、删除DELETE操作?


医院业务软件健康管理实战案例分享

文章图片

?
第一种行锁表现的处置方法
医院业务软件健康管理实战案例分享

文章图片



真实案例1
(1)问题发现:登录全景软件——问题溯源模块,发现2021-11-22 16时40分左右(注意下图红框部分),系统产生了持续数十分钟左右的阻塞问题。
医院业务软件健康管理实战案例分享

文章图片
?
(2)阻塞关系溯源:通过点击“阻塞链图”,展示阻塞与被阻塞的逻辑关系,发现是由PID为2279的进程阻塞了PID为11的进程。
医院业务软件健康管理实战案例分享

文章图片



(3)进程信息查看:阻塞会话SID2279由diagnose.exe程序发起,该程序对exam_rpt表进行update操作,生成了行锁,阻塞了会话SID11的update语句。
医院业务软件健康管理实战案例分享

文章图片

(阻塞进程在update表EXAM_RPT相关行时,产生了行锁,造成其他对表EXAM_RPT进行DML操作的事务被迫等待。)
医院业务软件健康管理实战案例分享

文章图片

(阻塞者执行的SQL语句)?


医院业务软件健康管理实战案例分享

文章图片

(被阻塞者执行的SQL语句)
由抓取到的SQL语句可见,阻塞者与被阻塞者所操作的为同一张表EXAM_PRT。头锁进程执行update操作,对表EXAM_RPT加了行锁,且该语句极有可能走全表扫描,导致执行时间较长,以至于阻塞了后续进程。


医院业务软件健康管理实战案例分享

文章图片
第二类行锁事件:长事务相关行锁?
医院业务软件健康管理实战案例分享

文章图片

第二种行锁表现的处置方法
【医院业务软件健康管理实战案例分享】
医院业务软件健康管理实战案例分享

文章图片



第二类行锁事件:使用全景软件发现并定位程序阻塞问题
真实案例1
(1)问题发现:登录全景软件——问题溯源模块,发现2021-11-1610时56分左右,系统产生了持续十多分钟左右的阻塞问题。
医院业务软件健康管理实战案例分享

文章图片
?
(2)阻塞关系溯源:通过点击“阻塞链图”,展示阻塞与被阻塞的逻辑关系,发现是由PID为13的进程阻塞了PID为21,130,132,141等和下一级252,12,1729等多个进程。
医院业务软件健康管理实战案例分享

文章图片



(3)进程信息查看:阻塞会话SID13在执行“selectNVL(QUANTITATIVE_RESULT, ‘’), NVL(QUALITATIVE_RESULT, ‘’), TEST_COUNT,INSPECTION_INSTRUMENT FROM LIS_INSPECTION_RESULT……”语句执行前,该会话还执行了其他语句,其中有一条语句对LIS5_REPORT_AI_CHECK_LIST表上产生的锁,而这条产生锁的语句并不是在执行结束后立即提交(commit),程序逻辑大概率是在(包含多条SQL的)整个会话事务结束时才提交,这就造成了锁存在的时间比较长,当有其他会话(SID21,130等)去访问该表时,就产生了锁等待事件,这是造成此次应用堵塞事件的根本原因。这也是医院业务系统常见的一种阻塞问题。
医院业务软件健康管理实战案例分享

文章图片
医院业务软件健康管理实战案例分享

文章图片
医院业务软件健康管理实战案例分享

文章图片

(阻塞进程部分SQL语句)
医院业务软件健康管理实战案例分享

文章图片

(被阻塞进程SQL语句)
由抓取到的SQL语句可见,被阻塞者是因为表LIS5_REPORT_AI_CHECK_LIST被加锁导致产生了阻塞,而头锁此时被抓取到的是对表LIS_INSPECTION_RESULT的查询语句,两语句涉及到的是不同的表。因此可以断定,是阻塞者正在执行的事务先前有某语句对表LIS5_REPORT_AI_CHECK_LIST执行了加锁操作,导致后续进程被阻塞,这也是医疗系统中很常见的一类阻塞问题。?
医院业务软件健康管理实战案例分享

文章图片
总结:分钟级阻塞事件知识图谱(成因分类、处置方式部分)




医院业务软件健康管理实战案例分享

文章图片



?
医院业务软件健康管理实战案例分享

文章图片
问题处置建议


对于此类程序质量不佳造成的锁等待问题,通常有如下建议:
1、应急处置
当我们能够在问题发生的早期发现问题,并拥有上帝视角来观察锁等待事件的时候,处置将变成一个简单的选择题,以下我们通过两个例子来进行这种智能化处置方式的说明。
案例1
在实际场景中,头锁进程8029是一个来自电子病历程序(emr.exe)的进程,它堵塞了一个门诊程序(his.exe)的进程8649,而8649进一步堵塞了一个关键的门诊挂号进程3073,该进程是门诊挂号业务的自增序列(对应的是每个病人的门诊号,每一个新病人的编号自动+1),3073被堵塞之后造成所有的门诊挂号事务无法进行,现实中造成大量病人无法挂上号。


?
医院业务软件健康管理实战案例分享

文章图片

 
注意!!!医院业务中那些不起眼的自增计数器被堵塞往往是大范围业务失效的直接原因。
拥有智能系统后的应急处置方案:在浏览了上图了解了此次锁等待事件的发生经过后,迅速关闭或回滚造成阻塞的8029事务,如果急于加速业务恢复时间,还可以选择马上关闭3073进程,实现资源的迅速释放。
案例2
医院业务软件健康管理实战案例分享

文章图片

这个例子展示的医院锁等待事务的复杂性,以及智能化手段的必要性,这是一个困扰某医院多年的锁等待事件,由于阻塞关系过去复杂,过去采用人工分析一直不能明确责任方。而事实上这个例子中的头锁进程2531,是一个非常不起眼的小程序,但经过多个不同业务程序之间的复杂传递,最终,2531的运行,总会导致整个取药业务的缓慢甚至短时间失效。
拥有智能系统后的应急处置方案:迅速关闭或回滚造成阻塞的2531进程,如果业务逻辑允许,未来可以采用智能化手段来实现以下功能:即一旦这个小程序的运行又一次影响到取药业务,则可以通设置简单的关键字和阀值,用智能化手段自动进行处置。
2、优化业务程序
采用关键字段加索引,使用分区表,使用绑定变量等多种方式,优化SQL语句的执行效率,降低行锁持有的时间,从而减少因DML语句造成的阻塞问题。
对于长事务,可进行适当拆分,增加提交次数,或采用微服务的架构---使事务变的更小、单个事务运行时间变短,由程序运行造成的分钟级阻塞明显减少。


医院业务软件健康管理实战案例分享

文章图片
下期分享


医院业务软件健康管理实战案例分享(三)
---解析过量问题的发现、分析和处置

    推荐阅读