DELPHI高性能大容量SOCKET并发(九):稳定性问题解决

文章详细描述了在使用IOCP进行TCP服务器开发时遇到的内存错乱问题,该问题由接收缓存与对象销毁同步引起。解决方案是将接收缓存与对象分离,并使用锁机制确保内存安全。此外,还改进了连接断开检测方法,以避免锁竞争导致的性能问题。通过这些优化,服务器能够稳定运行7*24小时。作者强调了日志在调试稳定性问题中的重要性,提供了日志记录的关键点建议。
摘要由CSDN通过智能技术生成

IOCP接收缓存导致的内存错乱

在用IOCP控件写了一个ERP服务器后,服务器会发生运行3天后,出现莫名的内存错误,用FastMM检测,是本没有内存错误的地方,而且内存错误出现的地方也不固定。这是一个不可重现的Bug,后续通过打日志把错误范围缩小后发现,每次出现内存错误之前都是由于有链接断开释放,因此就加了日志逐步定位到是TSocketHandle释放引起的,具体原因是:在IOCP中,每个Socket连接需要投递一个接收请求,并给出数据存放内存,原来是销毁TSocketHandle的同时,销毁投递接收请求的缓存,这样有可能对象销毁后,IOCP返回一个异步接收消息,会导致写入到已销毁的接收缓存,造成内存被重写,导致内存错误。

解决办法,是用锁和对象分离相同的机制,把接收缓存和对象分离,在释放对象的时候不释放接收缓存,等待超过30分钟后,重新使用这个锁和接受缓存,这样做即可以解决内存错乱问题,也起到了锁和接收缓存的池化处理。

具体代码处理:

投递请求缓存和对象分开,采用是锁和对象分离相同的机制。

  {* 客户端对象和锁 *}
  TClientSocket = record
    Lock: TCriticalSection;
    SocketHandle: TSocketHandle;
    IocpRecv: TIocpRecord; //投递请求结构体
    IdleDT: TDateTime;
  end;
  PClientSocket = ^TClientSocket;<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值