DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: cuiqingbo
今日帖子: 16
在线用户: 7
导航: 论坛 -> Web应用开发 斑竹:bodies  
作者:
男 wooder (木头) ★☆☆☆☆ -
普通会员
2021/8/24 10:56:32
标题:
服务隔一阵就卡住,必须把进程杀掉重新启动才行,怎么破? 浏览:2617
加入我的收藏
楼主: 用的DSHTTPService,服务是在云服务的windows环境下运行,现在是运行一阵就卡住,大概半个月左右,无法连接登录了,必须把服务进程杀掉重启才行,访问量其实也不大。我估计是有点内存泄漏,但是云服务本身内存很大,肯定够的,请教这怎么去调试找到卡住原因?
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/8/24 11:00:10
1楼: DSHTTPService 是个什么东东?没yong 过。

卡住,要么是服务器内存泄漏超了,这个你可以观察你的程序占用的内存。要么是内部哪里出错代码跑飞了导致。
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/8/24 11:01:17
2楼: 这种实际运行期的调试,除了观察内存使用情况,也就只能写 log 来观察了吧?还有异常信息抓住写 log。
----------------------------------------------
-
作者:
男 wooder (木头) ★☆☆☆☆ -
普通会员
2021/8/24 11:07:40
2楼: 谢谢,   DSHTTPService就是三层结构里,中间件经常用到的那个控件。另外DSServerClass的lifeCycle是Session。请教一下DSHTTPService的BufferKBSize要不要设一下,设多大好?卡住的时候,云服务的内存还有很多。
----------------------------------------------
-
作者:
男 wooder (木头) ★☆☆☆☆ -
普通会员
2021/8/24 11:12:46
3楼: 我这个服务应该就是个最简单的DataSnap server
----------------------------------------------
-
作者:
男 wooder (木头) ★☆☆☆☆ -
普通会员
2021/8/24 11:25:13
4楼: 发现TDSServer有个ChannelQueueSize属性,默认值是100,先改大些试试。
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/8/24 12:07:49
5楼: 哦,是 Delphi 自带的那个 DataSnap 的 Server?它是支持的直接 TCP 连接,每个客户端一个连接?如果是这种情况,最好把客户端在做完和服务器的操作后就断开。

比如从服务器读取数据时连上,读完就断开。客户端的数据需要提交给服务器时再重新连接上,提交完断开。把客户端做成无状态模式。
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2021/8/24 12:47:54
6楼: 这种现象一般有两种可能,要么是内存泄漏,要么是内核对象没有管理好。
这个想要准确定位要用大量的日志来记录运行状况才行。
不过我觉得你可以换个变通的办法,用双服务来解决,原服务增加一个自定义控制码,另一个服务只一个功能,就是每一段时间例如10分钟给你原来的服务发送这个自定义控制码,如果在一个可接受范围内能正确响应则不做任何处理,如果超时或者不响应那么就由这个新服务来重启你原来的服务就可以了。
----------------------------------------------
--
作者:
男 www12345 (风云) ★☆☆☆☆ -
盒子活跃会员
2021/8/24 20:00:20
7楼: 直接怀疑是有连接断开后,DataSnap并没有断开,造成有死连接
----------------------------------------------
一卡通专家的中专家www.cnduh.com
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2021/8/25 0:23:52
8楼: 1、建议先独立 exe(cgi 之类的)模式运行,通过 fastmm4 解决内存泄露问题
2、如果怀疑网络问题,建议编译为 isapi 通过 iis 加载,利用 iis 的进程守护、定期重启
----------------------------------------------
-
作者:
男 qiuyan81 (苦恋树) ★☆☆☆☆ -
普通会员
2021/8/26 9:14:48
9楼: 这个很大程度就是死链接问题,由于没做心跳机制,客户端异常断开,没能通知到到服务端断开,导致服务端一直挂着连接在哪里。。

tcp协议本身支持心跳机制,你可以在连接成功后设置socket的keeplive,具体代码百度下就有了。
----------------------------------------------
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2021/8/26 9:58:16
10楼: key:ms tcp keeplive
https://www.cnblogs.com/shuaixf/archive/2010/08/18/1802553.html
https://blog.csdn.net/huangyimo/article/details/81908195
https://blog.csdn.net/shenya1314/article/details/70187767
https://blog.csdn.net/zhaozh2000/article/details/6293925
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 wooder (木头) ★☆☆☆☆ -
普通会员
2021/8/27 9:02:47
11楼: 感谢楼上各位回答。我现在用的是DSHTTPService,访问也是用的HttpPort,应该是走的http协议,这个控件只有个active属性,没看到有keepLive这样的属性,有个SessionTimeout属性,现在设的是10小时,我的理解就是过了10小时,创建的Session就过期清除了。现在是云服务的内存还剩很多,百分之八十没用,这个Datasnap Server进程大概内存只占了20、30Mb的时候就无法连接了,必须重新启动才行。不行我只好弄个什么计划,半夜定期重启它。
----------------------------------------------
-
作者:
男 wooder (木头) ★☆☆☆☆ -
普通会员
2021/8/27 9:09:12
12楼: 相关联的是DSServer和DSServerClass,我对这两个也不太熟悉,看也没什么参数可设的。
----------------------------------------------
-
作者:
男 wooder (木头) ★☆☆☆☆ -
普通会员
2021/8/27 9:27:32
13楼: 把BufferKBSize改大些看看。看以前设的是8000kb,应该是8Mb,加个0改成80Mb试试。
----------------------------------------------
-
作者:
男 qiuyan81 (苦恋树) ★☆☆☆☆ -
普通会员
2021/8/27 17:21:29
14楼: 你怀疑是内存泄漏的话,fastMM会用吗?用那个调试内存泄漏看看。
----------------------------------------------
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/8/27 18:11:45
15楼: DSHTTPService 这个我没用过,看起来是 HTTP。

你看看它内部是不是用的 Indy THTTPServer。

HTTP 访问,是每次访问后就要断开连接的。不知道你的客户端是每次调用后就断开连接,还是没用断开连接?你可以观察一下连接数量是否很多,达到极限?一般这种东西它同时支持的连接数量有限,比如 100 条。假设连接太多没断开,估计后面的访问就连不上了。

假设客户端每次访问完成后都断开了连接,那就要检查服务器端的代码,断开连接后是否释放了相关的资源。

这个东西我没用过,不知道具体细节。但大概的概念就是这些。目前我用基于 Indy 的 WebService Server,暂时没碰到楼主类似的问题。
----------------------------------------------
-
作者:
男 nickemma (N.E Zhou) ★☆☆☆☆ -
普通会员
2021/8/30 11:46:42
16楼: @wooder
赞同 pcplayer 的观点,另外我提多一个就是,是否采用了多线程技术。
特别在多线程中使用临界Lock,比如:在某一个过程/函数中Lock了,然后调用了其他过程/函数,又有Lock,这样就很容易产生卡死现象。

我曾经试过由于多线程的Lock问题而产生服务端不定时卡死。特别在测试的时候一点问题都没有,上线后会不定时卡死,后来慢慢排查才发现这个问题。

还有提醒一点,如果服务端会频繁访问数据库,用到FD、ADO等数据组件,而且还会根据客户端需求而创建、销毁的,建议采用“控件/组件池”技术,程序开始就创建好N个,使用的时候从池里面获取,用完丢回去池里面,程序关闭的时候才销毁池
----------------------------------------------
-
作者:
男 wooder (木头) ★☆☆☆☆ -
普通会员
2021/8/31 17:39:58
17楼: @pcplayer 感谢回答。我的这个datasnap客户端基本就是完全仿照delpi配的例子来改写的,我看了下用的是TDSRestconnection控件,这个控件有个HTTP属性,我不清楚http每次调用,还要具体操作什么来明确表示断开。你那种方法是做什么操作?

@nickemma 对,我是挺想用池方面技术,不过一直不太会用,服务端这边用的数据库控件就是FDConnection,数据库是Sqlserver和FireBird,我看FDConnection有个属性是Pooled,这个地方不太会用,以前好像设成True的话,会出错。
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2021/9/2 19:38:39
18楼: 怎么会说到连接上去的,而且连心跳包都出来了?http本身就是短链接,当然如果强制用了http2.0的话那就表示是该链接是多路复用的,楼主既然用了现成的库,应该不可能会让调用方去处理这个东西。
另外,http有一个connect属性,可以指定keep-alive模式,该模式可以指定服务端保持连接有效,但实际应用场景基本上很多httpserver都会忽略这个属性的。关于这个属性更多的信息楼主自己去找资料。
楼主也可以抓个包看看http头里到底有什么,也可以自己模拟一下数据收发看看实际的连接情况。但是这比较花时间,因为你的错误是偶发性的。最终还是那句话,你一定要探究出问题到底出在什么地方的话,就只能用日志的方式去找。
但是依我的经验来看就两个:一个是内存,一个是内核对象。内存我觉得可能性较小,因为如果是由于内存膨胀导致崩溃的话,那对服务器性能影响相当明显,按理你只要一看就能看到。我觉得更多的可能还是在内核对象的管理上,这个东西比较难查,除了用人工的方式读代码以外只能用日志找。

所以我还是建议楼主,如果你要快速上线就选择多进程的模式,多加一个守护服务,这样算是成本最低的方式。
----------------------------------------------
--
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/9/3 10:30:07
19楼: 楼上说的有道理。想快速上线运营业务,先搞多进程模式。

之前有一个将网-络-通-讯-的-阻塞模式的帖子里,我提到过多线程和多进程。比如早期甲骨文的名气就是稳定,其实它就是多进程,一个客户端连接的服务器端出问题了,不影响其它客户端连接,因为每个客户端连接的服务器端是一个独立的进程。

如果用 Delphi 来开发,现在它的 DataSnap 也有很多不同的模式,具体细节我不清楚。我拿以前的 WebService 来做例子。它的 WebService 可以开发几种不同的模式:
1. StandAlone 模式。一个独立的 EXE 程序,内含一个 Indy 的 HTTP Server,不依赖外部的 HTTP SERVER 诸如  IIS 这样的东西。它内部响应每个客户端的连接就是多线程。

2. IIS 的 ISAPI 模式,其实就是一个 IIS 执行的一个 DLL;

3. IIS 的 CGI 模式,一个独立的 EXE,但每个客户端访问,是访问的 IIS,每个客户端访问,理论上 IIS 会独立执行一个 EXE 的进程。也就是每个进程单独对应一个客户端。

4,5,APACHE 底下对应的类似 IIS 的模式。

我一般开发用 StandAlone 模式,比较容易单步跟踪。然后如果真要上线,我编译成 CGI 模式,这样不怕它有问题服务器崩溃了。这种情况,只要 IIS 不崩溃就没事。

当然,你如果是用 APACHE,也是可以的。

----------
提交时,居然提示:输入的内容包含违法信息:网…
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS