accept出现错误是怎么回事!!
我用的是 ace 5.5 ,跑在windows2003 服务器上。服务器启动后,在接受到1000~3000 个连接时,ACE就会崩溃,在 accept 内部 ACE_WIN32_Asynch_Accept::accept 内部 accept_handle = ACE_OS::socket (addr_family, SOCK_STREAM, 0); 处。是我自己使用的问题还是ace本身的问题呀。 我用的是ACE的完成端口模型。好像跟人多也没有关系,像是有规律的 ,到了 3000个连接时就要down掉(从服务器启动一共连入3000客户端时,平时有40~80个人在线)。是不是我的什么句柄没有释放,还是ace5.5 版本本身有问题。
有这样几个现象:
1 好像和人数无关,崩溃时都不是人数最多时。
2 好像和服务器启动后的总连接数有关,总是在1000~3000之间,3000左右的最多。
3 accept 出问题后,几个监听线程都回出同样的问题,我try catch 住了以后,后来的客户端都连接不上了,但是已经进入的客户端还能正常收发消息。
高手们帮帮忙呀,愁死了我,服务器几乎是1天down一次。 看你说的情况很像内存泄露,是不是关闭连接的地方有未清理的资源?观察一下你的服务占用的内存情况,有没有随运行时间的推移不停增长的迹象。
在资源耗尽的情况下,确实会有套接字创建失败的问题,大概可以确定你的服务是资源耗尽了,具体原因再好好查一查。
ace5.5的完成端口模型我也在用,还是很稳定的。 您指的是系统内存占完,还是别的什么资源。
服务器的整体内存占用很少,2G的内存才占300兆(一共),进程本身的内存也不增长多少,现在是内存25m,虚拟内存28m,一直是差不多这样。
我怀疑是占用了其他的什么资源没有释放,但是不知道是什么资源。 我提个建议,我也遇见过服务器程序异常的时候,你这样调试一下:
1、上传windows服务器程序的时候,要连带release的PDB调试文件,放在一起运行。
2、服务器上面安装windows符号。
3、在出现问题的时候,运行ProcessExplorer,打开异常的服务器程序,打开线程堆栈,你能发现那些线程正在做什么,调用的顺序关系,能看见函数名的。
4、ProcessExplorer需要配置符号目录位置,要指向你的服务器程序所在的目录。
5、复制你看到的堆栈信息,保存并分析。
我就是凭借上面的办法,找到了我的服务器程序的问题!
页:
[1]