当前位置:编程学习 > C#/ASP.NET >>

求助~~~~关于socket的问题,标题要长~~~~~~~~~~~~~~~

最近在考虑优化通讯服务端的事情。查过一些资料,资料里面都说使用异步的socket会导致系统缓冲区满,出现10055错误,所以除了accpet之外。。。。我不敢使用异步了,其实是否使用icop我不是很在意。
我现在需要的是有谁能给我提供一个思路,一个海量数据接收发送的socket服务端的优化。
我自己写的服务端,往往同时处理1000个客户端就会出现掉包的情况(我自己写的1000个线程同时发送接收10个字以内的字符串,服务器电脑就是我自己的笔记本。。。WIN7,I5-M系列CPU,6G内存,64bit系统),苦恼啊~~

我看到网上有一个商业版的Beetle组件,可以实现海量数据的接收发送,而且还稳定。仔细看了下他文章的描述,感觉这个组件的思路是这样的:
使用合并数据包的方式,将socket的发送操作尽量减少,每次传输的都是体积大的数据包。但是有个问题,OS的缓冲区只有64K大小,他无非就是send的次数少一点,数据一样多,他怎么保证不会10055呢?
组件要钱的··咱没钱,而且我们自己就是搞开发的,不花这个冤枉钱,因此我过来求助了,有什么好的想法也可以说上两句,三个臭皮匠顶个诸葛亮嘛··如果讨论有结果了,我就将大家提供的宝贵思路综合综合,写个服务端socket放到论坛上来,开源嘛。

在此,求助了···· socket 大数据 服务器 --------------------编程问答-------------------- 难道又要无功而返了???

不能这样啊,每次问的问题都让我无满意回帖,真伤人啊 --------------------编程问答-------------------- 1.是否为TCP连接?若是则不会出现丢包,可能是你的连接断开造成
2.1000个线程会造成过多的线程上下文切换而浪费了大量的CPU资源
3.TCP内部有合并包设置NODELAY --------------------编程问答-------------------- 1.确实是tcp连接,掉包也确实是超时之后失去连接导致,这就是为什么我想大家帮忙想想如何提高吞吐量的原因
2.确实,我想过这个问题,但是当我看过了beetle这个组件的介绍之后,我就不认为是上下文的原因了
3.NODELAY感觉像是取消了nagle算法的,这样不会有问题吗?如果我的数据来往很频繁的话 --------------------编程问答-------------------- 1.吞吐量的原因要查看服务所占用的资源情况,若是CPU和带宽都很高的情况只能增加硬件
2.无法确认,不过最好还是使用线程池
3.若是包比较多,而且很小,就不要取消NAGLE算法,因为它会自动合并包

以上只是猜测,具体还是要靠数据说话,^_^ --------------------编程问答-------------------- 会不会是数据库方面的问题呢,这么多连接同时操作导致延迟啊?最后新的线程无法建立了。
看一下每个连接处理需要多少时间。 --------------------编程问答--------------------
引用 4 楼 wodegege10 的回复:
1.吞吐量的原因要查看服务所占用的资源情况,若是CPU和带宽都很高的情况只能增加硬件
2.无法确认,不过最好还是使用线程池
3.若是包比较多,而且很小,就不要取消NAGLE算法,因为它会自动合并包

以上只是猜测,具体还是要靠数据说话,^_^


thx,确实要数据说话。
我自己再完善一下服务端的测试程序,看看CPU和内存占用以及调度线程的情况。
线程池的话,我不是很喜欢微软的线程池,我比较喜欢自己建立的线程,我一般都是建立固定数量的线程来处理socket接收到的数据队列。
我没打算取消nagle算法,这个还是有点用的



引用 5 楼 tcmakebest 的回复:
会不会是数据库方面的问题呢,这么多连接同时操作导致延迟啊?最后新的线程无法建立了。
看一下每个连接处理需要多少时间。


我做测试的时候没用到数据库,跟数据库没关系 --------------------编程问答-------------------- 没有做过这样的应用场合不好说。自己做的一般连接数不太大。并发也不太大,IO也不会多大。

对于楼主所要求小包发送的,我估计我会用udp方式。 --------------------编程问答-------------------- 友情顶一把,期望有高人论述。 --------------------编程问答-------------------- 谢谢帮顶,发了几个问题帖子,这个帖子终于有人理了。。感动啊,你们太给力了

我也不是必须要这个吞吐量,只不过我想搞清楚到底怎么才能更好的写一个socket服务端。
看过一些资料之后,我就觉得我之前觉得还不错的自己写的socket服务端在吞吐率上来看简直就是渣啊。。。。

UDP我一般不使用,除非是可有可无的消息,比如通知消息之类的,正式生产数据传输用UDP要悲剧的。 --------------------编程问答-------------------- 开源,把测试例子也放出来
大家测试测试

--------------------编程问答-------------------- 好的,我这两天又看了些资料,还是觉得用iocp比较好一点

我找了点资料,正在参考资料写一个socket传输的服务端,写完了,共享上来

只不过最近两天有点事情要忙,要耽搁两天 --------------------编程问答-------------------- 你并发1000不用异步用阻塞式开N个线程的方式?JAVA中做过用异步的NIO开销要少很多很多。 --------------------编程问答--------------------
引用 12 楼 abcmsnet 的回复:
你并发1000不用异步用阻塞式开N个线程的方式?JAVA中做过用异步的NIO开销要少很多很多。


是的,我开了1000个thread,每个thread都有一个信号灯,刚开始都是wait,后来我需要发送的时候,让这1000个信号灯全部release
如此一来1000个thread几乎可以看成是并发了
--------------------编程问答-------------------- 楼主为啥要创建这么多线程,确实太浪费了 --------------------编程问答--------------------
引用 9 楼 jy251 的回复:
谢谢帮顶,发了几个问题帖子,这个帖子终于有人理了。。感动啊,你们太给力了

我也不是必须要这个吞吐量,只不过我想搞清楚到底怎么才能更好的写一个socket服务端。
看过一些资料之后,我就觉得我之前觉得还不错的自己写的socket服务端在吞吐率上来看简直就是渣啊。。。。

UDP我一般不使用,除非是可有可无的消息,比如通知消息之类的,正式生产数据传输用UDP要悲剧的。

那QQ聊天不也是用UDP,其实UDP也不见得不稳定啊,这说法都是来源于90年代的大学课本。UDP只是不面向连接。你可以学习QQ,在UDP发送后等待对方返回确定(当然通信的协议就要你自己定了)。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,