我的应用服务器经常会处于龟息状态,检查内存和CPU的使用都很稳定,但是它就是不响应其他的请求,可能要过个十几分钟才行,请大家畅所欲言,讨论一下各种可能的原因。2

那就是程序问题了吧
 
你在message处理里创建了其他的com对象来处理业务?
应该是这里的问题
message处理是串行的,如果你处理的某个消息时间过长,应该可能出现这样的情况
解决办法是,你写一个日志在消息处理里,查一下到底在哪里出现了这些问题
 
学习,我以前也碰到过这样的问题,甚至将客户端、服务器、应用程序层装到一台计算机上,有时候也会这样?
 
to menxin
我之所以使用往主窗口PostMessage,再由主窗口创建相关COM对象处理
是因为我必须对当前的数据进行后台的对比操作,使用PostMessage只是为了不影响当前操
作的执行效率,如果你有其他的办法,不这样用也可以的,说实话,我都不知道怎么再
DCOM服务器里建立另一个线程进行业务处理,水平有限,请多多指导!
如果说这个消息处理耗时的话,可能也就耗在它执行的几个SQL语句上,这个对比过程最少
需要执行四条select语句,那么这个日志要怎么记录呢?
注意:问题不是很经常的出现,而这个发送消息的操作应该可以说是非常频繁,日志要怎么
写才能很好的发现问题呢?请指教!
 
好问题,学习!!!
 
你的PostMessage怎么用的,消息处理函数里都操作了什么?
不是传了个接口指针过来了吧.
 
我在PostMessage之前往一个全局的队列增加数据,将所需信息写入
(数据是通过队列来传递的)然后PostMessage给主窗口
主窗口接收消息后根据队列的信息创建所需的COM对象,COM对象对队列进行先进先出的
操作,在操作过程中执行了一系列的SQl语句
 
某些服务没开起
未启用
 
to 魔鬼大师
我水平有限,不是很明白,能否说得详细一点
我用的是进程外的服务器,服务都是由客户端激活的,需要服务器自身开启什么吗?
 
to siyan:
真的很抱歉我做的項目中全是用DCOM的﹐我想提出以下几點問題
SOCKET的效率原本就比DCOM差的﹐你的項目是在公司內部使用嗎﹖
不用走防火牆的話我看還是用DCOM吧﹐效率要高得多。
此外我對你用MESSAGE來處理一些邏輯﹐覺得此方法不妥﹐可靠性
有質疑。別在你的項目中出現這么大的技朮風陰。
我覺得既然有段時間是正常的﹐你就應該從網絡的配置上找找問題。
good luck! ^_^
 
to coolzew
DCOM的配置比较麻烦,好像要求客户端登录域吧,而且初次连接的效率比较低下。
Socket的效率虽然差一点,但是我觉得还是可以接收的,项目已到后期,恐怕不适合
再做这些改动了,你的好意只能心领。
对于使用Message的方式,我本人也觉得较为牵强,所以才在这里重点提出,至于
使用的原因我在前面回复menxin的时候已经说了,如果你有好的方法,请多多指教!
我对网络的东西几乎可以说是一无所知,如果你能告诉我该如何查找是否是这方面
的原因,将不胜感激!
 
以前我也碰到类似的问题,我是编程爱好者又不懂太深,所以把服务器重新安装,就没有出现这样的问题了。但是我敢断定网络没有问题。
 
对于使用往主线程PostMessage的问题已另开一贴讨论,请诸位参与
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1961367
在这里请大家继续讨论其余的可能原因,只要有必要就另行开贴深入讨论
谢谢大家!
 
是用BDE连接后台数据库吗?
如果是,请注意BDE的Session数目限制以用BDE驱动的参数配置。
 
to szf
MAXFILEHANDLE已经设为128,而实际session数最多时是60多个
其余的设置也都做了相应调整(基本参照李维书中描述),还有什么需要特别注意的吗
 
to xeen
另外开辟的线程好像有问题,在某些时候,应用服务器会占用100%的CPU资源
不知道为什么,很是令人担心
 
BDE的Session上限是48个呀(印象中是这样),超过好象就不稳定了。
我们的系统有几个程序都使用BDE和MIDAS的,分别运行都很稳定,连续半年是没问题。
但放在同一台机上运行就老出奇怪的问题,诸如内存不足,不响应,Appserver退不干净,
非得杀进程。而且每次出问题,都要所有的BDE一起退出来才行的。
后来调整了BDE参数才改善了一点。
实际上,我发现BDE在连接SQL数据库时,Session只要超过十几个,就不稳定了。
我觉得是BDE的问题,你试试负载分担时,把其中一台应用服务器的客户数限制在十个以内,看看会不会出问题。
另外,Scktsrvr程序也设置成把超时不动的连接清掉吧。
 
to szf
我这里不出现你所说的那种情况,BDE的配置已经优化过了,性能还是挺好的
而且我也没有那个硬件条件去限制每台服务器的连接数在20个以内,至于Scktsrvr的无效连
接(不是当天的连接)我们现在是手动清除的
to all
更改了往主窗口PostMessage的方式之后,感觉服务器好了很多,至少现在还没有发现
它不响应消息的时候,象以前我要移动服务器程序窗口有时都要等待一会才能响应
我怀疑是否是因为往主窗口PostMessage之后导致了主线程的消息阻塞,从而影响整个
服务器的消息处理,只是才疏学浅无法证实,惭愧惭愧!
真的很希望问题能就此解决,各位大侠有什么想法仍请不吝赐教,不胜感激!
 
to siyan:
Cpu 占用率太高可能是因为一段时间队列为空,线程的循环空转造成的。
解决的办法有两种:
简单的:
在循环中判断一下:
if 队列为空 then
begin

解除互斥封锁;
sleep(500);
//休眠一会儿;
end;
复杂的:
再设立一个互斥员或者信号量来表明队列的状态(空or 非空).这样你处理数据线程
需要两个WaitForSingleObject语句,ApartmentThread仍然需要一个.
不过我觉得第一种方法已经足够好了:)

 
又运行了一个星期了,看样子也算是稳定了,不管问题有没有最终解决,这个帖子还是结了
吧。不过人多分少,分得少的富翁如果有意见可以提,我可以另开贴补偿。
下午又要去出差了,加入另一个更难缠的项目,一且只能听天由命吧。
 
顶部