资源描述
在AX项目实施中, AOS服务异常暂停是大家比较容易遇到的问题,也是较为棘手和迫切需要解决的问题之一。在这里来探讨一下常见的原因和可能的解决方法。
AOS服务异常暂停的原因,总的来说,主要有三个方面:
1. Orphaned AX sessions。
2. 系统资源耗尽。
3. 网络因素。
我们在这里主要讨论Orphaned AX Sessions。
什么是Orphaned Session
Orphaned Session,中文直译过来就是孤儿对话,其实就是对话(Session)还在保持一个活动的状态,但是原来使用该对话连接到AOS的客户端已经关闭了。那么其实这个时候AOS 服务的自动重起或者暂停,都是属于一种自我保护措施,以释放占用的资源。
为什么会产生Orphaned Session
Orphaned Session的产生是因为客户端在关闭的时候,却无法同时释放它所占有的网络连接。
这里列出几个常见的,导致产生Orphaned Session的情况:
a. 强行关闭AX客户端
b. 客户端崩溃
c. 与终端服务器(terminal server)的设置与配置有关
d. W3wp.exe的强行关闭 (Enterprise Portal)
e. 网络断开
f. 强行关闭Com connector/.NET Business connector 客户端,或者因为代码原因导致Com connector/.NET Business connector 客户端未能释放网络连接。
那么Orphaned AX Session的产生,我们可以从事件查看器中找到一下类似的日志:
1. Event ID 180
2.
3. Object Server X: RPC error: Client provided an invalid session ID X
4. Object Server X: RPC error: Client provided an invalid context
5. RPC exception 1726 occurred in session X
6.
7. Event ID 186
8.
9. SPID SPID_number for Session Id X, is still present in the database. Please delete the SPID from the database.
10.
11. Event ID 110
12.
13. Object Server X: No ping from X. Terminating the session.
复制代码
查找产生Orphaned AX Session的原因
那么当我们根据所产生的日志来判定,AOS服务异常暂停是因为Orphaned Sessions所导致的话,我们该怎样来判定具体是由什么原因造成的呢?
首先先找到到底是哪个用户的session导致的,通常我们可以通过以下语句来找到
1. select * from sysuserlog where logoutdatetime = 0 and sessionid = x (AX2009)
复制代码
或者
1. select * from sysuserlog where logouttime = 0 and sessionid = x (AX4)
复制代码
2010-4-19 21:30 上传
下载附件 (83.23 KB)
特别要注意的是UserId和ComputerName。
找出用户之后,可以通过询问用户来找出到底用户采取了什么活动导致客户端未能正常关闭。
譬如说,有些用户喜欢用Windows任务管理器来关闭AX客户端,或者用户在使用某个客户化功能的时候发生了AX客户端异常关闭。
当情况属于上面所说的后者的时候,我们就可以去检查客户化代码,找出导致出现Orphaned Sessions的原因。
使用终端服务器所导致的Orphaned sessions
在生产环境中,客户会经常使用终端服务器(Terminal Server)来连接到AOS服务。那么有些用户会使用远程桌面(Remote desktop) 来登录终端服务器,可是当使用完AX的时候,有时候不是登出(Log out)而是直接中断(Disconnect)远程桌面连接,这个时候就会产生问题。因为用户中断远程桌面连接,该用户的AX Session还是处于激活(Active)状态。但是终端服务器的 Time out时间设定往往会小于AX Session的Timeout时间设定。就造成了终端服务器的session已经关闭了,可是AX Session还没有关闭,这个时候也会产生Orphaned Sessions。
我们通过上面的描述,清除了解了终端服务器所导致的Orphaned sessions的原因,那么我们很自然就可以通过设定AX Session的Time out时间设定,以及终端服务器的Time out时间设定来解决这个问题。
下面通过英文版操作系统来看看如何设定这两个参数
首先打开管理工具(Administrative Tools), 然后选择终端服务配置( Terminal Services Configuration)。
点击连接( Connections),右键选择 RDP-Tcp,再点击属性( Properties)。看到Session tab,再这个时候就可以看到终端服务器的Idle session limit了。
2010-4-19 21:30 上传
下载附件 (85.05 KB)
从上面的截图我们可以看到10分钟后,终端服务器就会关闭不是活动状态的Session,我们只要把AX的设置设到少于这个时间,在终端服务器关闭Session之前抢先把AX的session提前关闭了,就防止了Orphaned Sessions的出现。
2010-4-19 21:31 上传
下载附件 (74.89 KB)
如上面截图所示,我们可以把Automatic shutdown设为9分钟。
网络连接产生的Orphaned AX Sessions
我们在生产环境中,有时候会发现当AOS服务异常停止时,事件日志会出现下面的记录:
1. The event ID 110 or “Object Server X: No ping from X. Terminating the session”。
复制代码
这个时候通常就代表客户端和AOS间的物理网络连接出现问题。可以通过ping命令来查证网络是否还是处于连通状态。
企业门户与第三方程序所产生的Orphaned AX Sessions
我们前面讨论的好像只和AX胖客户端相关(注意这里的胖客户端非指V3中的胖客户端,而是AX native client),但是其实使用企业门户或者其它定制的Web客户端都会产生Orphaned Sessions。
譬如说我们使用任务管理器来中断IIS的工作进程,也会导致Orphaned Sessions的出现。但是我们需要更多关注的是使用COM Connector/.NET Business Connector来开发第三方程序来连接AOS的时候,一定要在代码里保证里每一个Logon方法产生的AX
Session,在未被使用的状态下,一定要及时调用Logoff方法来关闭。我的经验是,在实际项目中,70%以上的Orphaned AX Sessions的产生都来源于第三方开发的程序。
展开阅读全文