nono436 发表于 2010-12-28 11:32:47

跪求阿!

我想测试2000个连接服务器建立时间,测试代码启动了20线程,每个线程启动100个主动连接,我测试了下,需要花费大概3分钟,是不是太慢了,因为采用对象池,基本上make_svc和connect_handler,open基本上不花费多大时间,但为什么这么慢?
同时我还发现,如果我采用for循环发起100个连接,端口假如从100-200,因为采用阻塞连接,所以可以认为必定为端口为150的connect_handler的open肯定比端口为156的open先调用,但我测试为什么发现,有部分端口号靠后的open先调用,换句话说端口号某些靠后的现建立了连接。这是为什么?

winston 发表于 2010-12-28 18:59:43

1、这种使用线程的模式很低效,因为线程消耗资源、线程的切换更消耗资源。
2、在现代OS上面,线程都是抢占式调度,所以后创建的线程先调度运行并不奇怪。
不要用这种模式做服务器系统,正确的办法,是使用线程池,合理的预先创建合适数目(跟硬件相关)的线程做业务处理,用队列来排队,尽量避免处理过慢导致阻塞。

modern 发表于 2010-12-29 11:20:46

按你说的情况,
如果你是1个线程for 100次connect(顺序指定连接者的端口100-200),
看你用的是reactor模型,由于是同步调用,不应该出现后发先至的情况。

另外对于你说测试慢的问题,其实很简单,
既然是同步调用,在几个关键点把时间记录下来,
最后写道一个csv文件里分析即可。
(任何你熟悉度的格式,csv的好处是可以直接使用excel作图)。

nono436 发表于 2010-12-29 15:22:36

谢谢!我再好好学学
页: [1]
查看完整版本: 跪求阿!