首页 新闻 会员 周边 捐助

Tcp连接数量和效率

0
悬赏园豆:10 [已解决问题] 解决于 2013-07-09 15:28

需求是一个客户端程序使用TCP连接访问服务端,其中也可能会用多线程的方式来访问.

 

现在的问题是,仅仅针对客户端,是多个线程共用一个连接好,还是每个线程各用一个自己的连接好?

客户端中的连接数量会对客户端的吞吐量和效率有影响吗?

garry的主页 garry | 菜鸟二级 | 园豆:495
提问于:2013-06-27 17:22
< >
分享
最佳答案
0

创建TCP连接的成本很高,建议使用连接池

收获园豆:10
dudu | 高人七级 |园豆:30948 | 2013-06-27 17:38

谢谢杜杜.用连接池的确是可以改善创建连接的效率.
我另外的疑问是:比如有这样的场景,某个系统会用memoryCacheClient类去访问服务端的缓存,这时候一个memoryCacheClient就会创建一个TCP连接.系统中可能会有多线程并发访问.此时有俩种做法
1.memorycache客户端类做成单例,整个系统都共用这个单例建立唯一的TCP连接去访问服务端. 

2.实例化多个memoryCacheClient创建多个TCP连接去访问服务端

那么哪种做法对于系统来说是最合适呢?

garry | 园豆:495 (菜鸟二级) | 2013-06-27 19:14

@garry: 

Memcached Client也要用连接池,你也可以看一下EnyimMemcached的实现代码:https://github.com/enyim/EnyimMemcached

dudu | 园豆:30948 (高人七级) | 2013-06-27 20:45

@garry: 就用你这个memoryCacheClient实现一个单例,类本身实现一个线程池来应对多线程的访问。

在大地画满窗子 | 园豆:102 (初学一级) | 2013-06-27 21:10

@在大地画满窗子: 用单例,实例化EnyimMemcached的成本很高

dudu | 园豆:30948 (高人七级) | 2013-06-27 21:23

@dudu: 

也就是说,客户端访问服务端的吞吐量跟连接数无关喽?
碰到这种场景的时候,头脑中首先冒出来的想法就是多线程下载比单线程快,推想是不是几个连接的情况下并发吞吐量要大于单个连接?

garry | 园豆:495 (菜鸟二级) | 2013-06-27 23:00

@garry: 多线程与MemcacheClient单例没有冲突

dudu | 园豆:30948 (高人七级) | 2013-06-28 10:29

@dudu: 

好吧,可能是我没有描述清楚,多线程下载实际上是客户端创建了多个连接去服务端请求数据.比单个连接去请求数据要快.
我的问题就是,客户端去服务端访问数据的时候,假设并发非常大的情况下,是用唯一的一个连接好,还是用一定数量的连接好,最终问题的焦点是:在一个连接上执行n多查询和把查询分摊到数个连接上,哪种更好?

garry | 园豆:495 (菜鸟二级) | 2013-06-28 10:55

@garry: 多线程下载比单线程下载快是因为将一个下载任务分拆为多个,然后通过多线程进行并行下载

dudu | 园豆:30948 (高人七级) | 2013-06-28 11:01

@dudu: 

那么是不是同理可以这么认为呢:总并发请求1万次,如果用10个(假设)memoryCacheClient的实例,每个分摊1000次请求去访问MemoryCache服务器,比用一个memoryCacheClient实例去请求1万次,客户端的延迟更低,响应时间更快?

garry | 园豆:495 (菜鸟二级) | 2013-06-28 11:26

@garry: 

用10个MemcacheClient实例,性能会更差。因为创建MemcacheClient实例的开销很大。

总并发请求1万次,会需要1万个TCP连接,与多个MemcacheClient实例没有关系。

如果总并发请求通常在1万次,建议将EnyimMemcached的socketPool->minPoolSize设置为1万。

dudu | 园豆:30948 (高人七级) | 2013-06-28 11:37

@dudu: 

谢谢杜杜,关于这个场景我已经弄明白了,我理解的这里是短连接的场景,每个请求都是新建一个连接,用完就关闭,所以连接池对这种场景下非常重要.

如果是长连接的场景下呢,客户端是用一个连接好,还是用多个连接好呢?
比如说要访问netTcpBinding下的wcf服务,客户端要去并发访问,是每次创建一个代理用完就Close,还是共享一个wcf代理的单例,所有的访问都通过这个单例出去?

garry | 园豆:495 (菜鸟二级) | 2013-06-28 12:44

@garry: 建议每次用完就Close

dudu | 园豆:30948 (高人七级) | 2013-06-28 16:30

@dudu: 

嗯,好吧.目前正在对项目中的WCF调用进行性能测试,发现大部分的时间开销是消耗在了wcf代理的Open和Close上了,直接共用一个代理,并发高了之后又碰到调用超时的问题...

garry | 园豆:495 (菜鸟二级) | 2013-07-02 11:38

@garry: 建议找出具体在哪里调用超时了

dudu | 园豆:30948 (高人七级) | 2013-07-02 11:54
其他回答(2)
0

我可以路过吗 啊haha ~ 

alone__ | 园豆:60 (初学一级) | 2013-06-28 13:56
0

好吧,我不太懂你们聊的东西;不过我这边用异步去创建TCP连接进行操作,在性能很一般的CPU占用2%左右情况下,100个线程能处理1000多个连接;是1线程对多连接...LZ要的是1连接对多线程好传输快...猜想如果能在每个连接下动态的开多个异步,也应该可以实现合理的资源分配.

北落师门α | 园豆:17 (初学一级) | 2013-07-01 18:04

其实我的问题也很初级的,大致上就是通过TCP连接去访问服务端资源的过程中,连接会不会成为客户端的瓶颈,共用一个连接还是用多个连接的问题

支持(1) 反对(0) garry | 园豆:495 (菜鸟二级) | 2013-07-02 11:40

@garry: 多个连接应该只造成资源的浪费。

理论上应该是在一个连接下,开多个线程去收发。当然这需要服务端的支持。

支持(0) 反对(0) 北落师门α | 园豆:17 (初学一级) | 2013-07-02 19:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册