ArcGIS Server浏览地图服务无响应原因分析说明
1、问题描述
从4月17号下午5时起,至18号晚9点,客户单位部分通过ArcGIS Server发布的地图服务(该部分地图服务的数据源为数据库SJZX)无法加载浏览,表现为长时间无响应。同时,通过ArcMap加载数据库中的要素类时,表现为"卡死",并长久无响应。
2、问题观察
通过收集该时间段内某1小时之间的性能数据,得到其耗时排名前6的SQL如下:
发现SQL ID 为gj2c1wk1brmaa 和 bxqcnpc5q5330 的两个SQL,其在1个小时的跨度内,执行次数为0。这说明,在这1个小时之内,该SQL一直在执行,且没有结束。SQL ID为bxqcnpc5q5330的SQL执行时间为3624秒,接近完整的1小时(3600s);SQL ID为gj2c1wk1brmaa的SQL执行时间为271786秒,这说明有271786/3600=75个进程在执行这个操作,且持续1小时未结束。
继续观察,发现这两个SQL都与TABLE_LOCKS表有关,SQL ID为bxqcnpc5q5330的SQL在执行时需要获得该表的排它锁;SQL ID为gj2c1wk1brmaa的SQL在执行时需要获得该表的共享锁(即TM锁)。猜测,这两条SQL长时间未执行结束,其根本原因在于无法获得其所需要的锁,即TABLE_LOCKS上发生了锁的阻塞。
3、问题分析
SQL ID为bxqcnpc5q5330的SQL需要获得排它锁,它可能被其它的排它锁或共享锁(TM锁)阻塞。
SQL ID为gj2c1wk1brmaa的SQL对TABLE_LOCKS表中的记录进行删除操作,需要获得该表的共享锁(TM锁),它可能被排它锁阻塞。
我们作两种假设:
1)TABLE_LOCKS上已经有其它的排它锁
这时候,符合bxqcnpc5q5330、gj2c1wk1brmaa两个SQL的表现。但排名前6的SQL中,还有cffvq2hst53md、00xnu55uqdns0、3ub7rzsp3rpyh 三个SQL有成功执行的次数(这三个SQL分别是向TABLE_LOCKS表中增加记录、获得TABLE_LOCKS的共享锁、根据PID(进程ID)删除TABLE_LOCKS表中记录),如果TABLE_LOCKS上已经有其它的排它锁,这几个SQL也会被阻塞,不可能执行成功。因此TABLE_LOCKS上已经有其它的排它锁的假设不成立。
2)TABLE_LOCKS上有未释放的共享锁(TM锁)
这时侯,TABLE_LOCKS上的共享锁(TM锁)会阻塞bxqcnpc5q5330 SQL,但bxqcnpc5q5330 SQL之前的共享锁(TM锁)请求不会被阻塞(包括cffvq2hst53md、00xnu55uqdns0、3ub7rzsp3rpyh),bxqcnpc5q5330 SQL之后的共享锁(TM锁)请求会被bxqcnpc5q5330 SQL的排它锁请求阻塞(尽管bxqcnpc5q5330 SQL还没有真正获得到锁,但它在锁的队列中会阻塞发生在它之后的SQL)。因此,该假设符合目前观察到的现象。
4、现象模拟再现
根据上述问题分析结果,我们可以基于假设条件进行现象模拟再现。
1)TABLE_LOCKS上有未释放的共享锁(TM锁)
当对TABLE_LOCKS执行了新增、删除、更新操作,但未提交事务时(有可能是事务异常结束),共享锁(TM锁)将不会释放。
2)对TABLE_LOCKS请求排它锁
当使用ARCMAP、ARCCATALOG对database connection中的对象(包括要素类、要素集、表等)进行删除操作时,会请求排它锁。
该会话请求的锁模式为6,即排它锁。
已经开始出现"卡死"并长时间无影响的现象。
3)对TABLE_LOCKS请求共享锁
通过ARCMAP、ARCCATALOG加载图层时,需要向TABLE_LOCKS中增加1条记录,此时需要请求TABLE_LOCKS表上的共享锁。
此时加载图层已被阻塞。
4)释放第1)步中的共享锁(TM锁)
所有的阻塞都迎刃而解了。
ArcGIS Server浏览地图服务无响应原因分析说明的更多相关文章
- ArcGIS Server SOE地图服务重启特别卡
ArcGIS Server 服务器端扩展,SOE代码调试时,需要经常重新编译.替换地图服务中的扩展, 由于未知问题,本地开发环境包含SOE的地图服务,每次重启都需要耗费相当长的时间,大体上20多分钟, ...
- ArcGis server发布地图服务
ArcGIS server发布服务: 首先修改地图文档属性中的关联默认数据库 最后使用分享将地图服务发布到server上,是地图服务可以使用: 注意一定要勾选 Feature Access选项 fea ...
- tomcat服务无响应堆栈分析
tomcat服务突然无响应了,导出内存堆栈和线程堆栈,分析后发现是同步锁使用不合理导致的. [root@prd-dtb-web-01 ~]# [root@prd-dtb-web-01 ~]# jmap ...
- 一次Mysql连接池卡死导致服务无响应问题分析(.Net Mysql.Data 6.9.9)
问题: 进程启动后,线程数迅速上升至最小线程数后,缓慢上升(线程池限制)到数千,然后由于线程过多,CPU飙升到90%. 对外表现为Api无响应或连接超时. 背景 有些数据存在于另一个机房,通过内网专线 ...
- cloudstack下libvirtd服务无响应问题
在cloudstack4.5.2版本下,偶尔出现libvirtd服务无响应的情况,导致virsh命令无法使用,同时伴随cloudstack master丢失该slave主机连接的情况.最初怀疑是lib ...
- 重写TiledServiceLayer实现Arcgis访问Mapabc地图服务 (转载)
package com.baixin.main;/** * * @ClassName: MapAbcToArcGISTLayer * @Description: ArcGIS访问MapAb ...
- JavaWeb和WebGIS学习笔记(六)——使用ArcGIS for Server发布地图服务
系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...
- ArcGIS pro 发布地图服务(一)动态地图服务
1.软件:arcgis pro 2.4 数据:.mxd文档. 2.导入mxd文档. 3.登录portal账号 4.分析—发布 5.在server中的地图服务 JavaScript api 查看 6. ...
- C#中winform下利用ArcEngine调用ArcGIS Server发布的服务 AE 10
开发环境:vs2010 + AE 10 测试 public Form1() { ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engi ...
随机推荐
- jQuery实现的全选、反选和获取当前所有选中的值功能
链接: jQuery实现的全选.反选和获取当前所有选中的值功能 <ul id="list"> <li><label><input type ...
- 微信小程序开发--flex详细解读
一.结构:flex布局 是由一个大的容器加上多个子元素组成. <view class="container"> <view </view> <v ...
- Go语言学习——三分钟看透iota
源起枚举 最近做需求时,有一个需要枚举的场景,大概有10+个枚举类型,不愿意像定义一个开关那样敷衍的写成 const ( SwitchOff = 0 SwitchOn = 1 ) 显得不够精致~ 于是 ...
- MEDICI仿真NMOS器件晶体管语法笔记
MEDICI仿真NMOS器件晶体管 TITLE TMA MEDICI Example 1 - 1.5 Micron N-Channel MOSFET 给本例子取的标题,对实际的模拟无用 COM ...
- SqlServer数据库之递归
递归的实现比较简单,这里就直接贴SQL了. --简单创建一个用户表 CREATE TABLE User( UserID ,) , ParentUserID INT ) 假设这张有几千条数据,开始递归它 ...
- I still have a dream!
当聊起梦想时,哥总会说别跟我谈梦想,我已经戒了!现在的我对梦想并不感冒,总是冷眼旁观很多事情,那些经不起时间检验的事和人,总会消散在历史云烟中,若干年后,又有谁还会记得那些遗弃在历史尘埃中,琐碎的芝麻 ...
- Linux服务器PHP后门查杀
shell脚本一句话查找PHP一句话木马 # find ./ -name "*.php" |xargs egrep "phpspy|c99sh|milw0rm|eval( ...
- construct2 入门
construct2特点 construct2是一款跨平台二维游戏开发引擎,不需要编码,通过定义各个部件和事件完成html5的游戏开发.该引擎可以将开发的封装成多种形式,如phonegap.cocoo ...
- python之线程和进程(并发编程)
python的GIL In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native ...
- django modelformse批量编辑 查询学生班级成绩
复习先知 关于三张表的编辑学生成绩在跨表查询的对象查询种,只能通过找到两张表的关联的对象,进行跨表,就是在一对多或多对多的模型找到他们俩的class_id或student_id在关联时,会通过他们找到 ...