找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3436|回复: 5

测试 ace acceptor 性能,问题如下

[复制链接]
发表于 2008-4-29 10:06:41 | 显示全部楼层 |阅读模式
****** ace 下的 ACE_SOCK_Acceptor 拒绝服务,过一段时间后又提供服务,不知道什么原因????
这个是程序的一部分功能,我简化出来了,现在修改后能彻底编译通过

//服务器段
#include "ace/sock_acceptor.h"
int main(int argc,char *argv[])
{
ACE_SOCK_Acceptor acceptor_;
ACE_INET_Addr server_addr;
server_addr.set(9999,"");
acceptor_.open(server_addr,1);
for(;;)
{
ACE_INET_Addr logging_peer_addr;
ACE_SOCK_Stream logging_handler_;
if(acceptor_.accept(logging_handler_,&logging_peer_addr) == -1)
{
ACE_ERROR_RETURN((LM_ERROR,"%p\n","accept()"),1);
}
//ACE_SOCK_Acceptor 进行压力测试,看能顶住多少连接,我开一个客户端, 跑了 3 分钟都没有ACE_SOCK_Acceptor 就拒绝接受外面的连接了,把所有客户端停下,等 几分钟后,又可以提供服务了,也就是 accept 能成功了,很是郁闷,难道 ace 这么脆弱吗????
ACE_DEBUG((LM_DEBUG,"Accepted connection from %s\n",logging_peer_addr.get_host_name()));
logging_handler_.close();
}
}

//客户端
#include "ace/os.h"
#include "ace/sock_connector.h"
int main(int argc,char * argv[])
{
ACE_INET_Addr server_addr;
server_addr.set(9999,"localhost");
for(;;)
{
ACE_SOCK_Connector connector;
ACE_SOCK_Stream logging_peer_;
if(connector.connect(logging_peer_,server_addr) < 0 )
{
ACE_DEBUG((LM_ERROR,"connect %s fail\n",server_addr.get_host_name()),1);
ACE_OS::sleep(ACE_Time_Value(30,0));
continue;
}
logging_peer_.close();
}
}
使用
netstat -a 查看,9999 端口上由很多 time_OUT 的连接,不知道是不是 close 失败了..
原来问题如下:
[url=http://community.csdn.net/Expert/topic/4957/4957046.xml?temp=.5337641]http://community.csdn.net/Expert/topic/4957/4957046.xml?temp=.5337641[/url]
 楼主| 发表于 2008-4-29 10:06:49 | 显示全部楼层
我尝试分析一下,未必全对啊,大家一起思考。
这不是ACE的问题,是你使用上欠考虑。
第一,你的ACE_SOCK_Acceptor 打开的时候,默认的后备队列只有5,
int open (const ACE_Addr &local_sap, int reuse_addr=0, int protocol_family=PF_UNSPEC, int backlog=ACE_DEFAULT_BACKLOG, int protocol=0)
ACE_DEFAULT_BACKLOG 默认是5,在Unix网络编程里面,关于这个值的含义,有详细的阐述。最主要的就是,这个值依赖于系统的实现,其实有所差别,但是它含义是已经连接的socket + 等待队列中的socket,而不仅仅是后者的数量。所以,我建议你加大这个数值,比如200,试试看。
第二,ACE用面向对象的方法封装了OS的各种API,后面其实还是这些,你必须懂这些API,才能更好的利用ACE发挥能力。比如,如果你要求大量的网络连接,可以使用异步的acceptor,在windows下面是AcceptEx,效能很高!
第三,ACE绝不脆弱,相信2000多高手的的智慧吧。
 楼主| 发表于 2008-4-29 10:07:02 | 显示全部楼层
1. 改大 listen 队列的数值,这个估计不是解决的最好方式,一般操作系统是5,一些操作系统可以到 14,这个可能是最大数值了,你说的 200,估计不怎么可能

2. 改 acceptor 为 acceptex ,这个可以考虑一下,我们使用 ace,底层的实现可能没有很多时间,

要是能有一本 深入浅出 mfc 一类的 深入浅出 ace 就强啊

3. ace 的强大那不用说了,否则老大你也不会建立这个网站拉,哈
 楼主| 发表于 2008-4-29 10:07:10 | 显示全部楼层
200并不大,很普通了,你看看windows网络编程里面的代码就知道了。unix网络编程里面的说明不过是说了当你取各种数值的时候,系统内核如何对待的。这个队列值,绝不是只有14个。

大家共同进步吧。以后等我们都强大了,再写个<<深入浅出ACE>>,哈哈哈.
 楼主| 发表于 2008-4-29 10:07:23 | 显示全部楼层
"netstat -a 查看,9999 端口上由很多 time_OUT 的连接"

netstat显示的TCP状态只有TIME_WAIT,没听说过有TIME_OUT的啊?

楼主的服务端程序是单线程同步处理的,客户端也是,这样的设计,吞吐量自然不可能高啊。
发表于 2008-4-29 13:11:09 | 显示全部楼层
学习一下,刚ACE起步,呵呵
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-25 13:10 , Processed in 0.028807 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表