C# Socket的问题,请大家帮忙看一看

我的收藏 发布于 2011/07/21 10:27
阅读 1K+
收藏 1

先谢谢大家。软件环境是 .net 3.5

Socket 服务器采用的是SocketAsyncEventAgrs 类来写的。

首先描述下需求。此项目分为3个模块,A是接收数据服务器,专门负责客户端发来的数据,进行初步匹配,B是解析服务器,专门解析数据,C是数据库服务器,把解析后的数据放入数据库

接着说一下详细流程,A接收到数据后,把数据放入队列线程,在队列线程中进行初步匹配,然后把匹配后的数据发送到B解析,现在问题出来了,

1,如果我单开一个发送数据的线程,包含一个Socket,就是把初步匹配后的数据放入这个发送线程,然后再发往B服务器。这样做的问题是,假如客户端500个连接,每秒发一条数据上来,然后队列线程匹配后放入发送线程再发往B,可是一秒钟处理不了500条数据,下一秒又有500条上来,这样一来,内存就一直网上飚,飙到1G多,程序就崩溃了。

2,出现了1中的情况,我把程序改了一下,在队列线程放一个socket,然后队列线程匹配数据后直接发往B。这样以来不到1分钟,B就崩溃了。

实在找不到原因。请大家帮忙看一下,感激不尽

注:队列线程匹配数据是用线程池来处理的。

加载中
0
我的收藏
我的收藏

顶一下,怎么没人冒个泡啊,说来过也可以哇,是我的问题描述的不清楚么?

0
开源红薯烹调技术专家
开源红薯烹调技术专家
我感觉不能用这种填鸭式,鸭肯定吃不消的!应该是吃多少送多少,没吃完的放仓库。仓库总比鸭肚子要大啊!
0
我的收藏
我的收藏

引用来自“FoxHunter”的答案

我感觉不能用这种填鸭式,鸭肯定吃不消的!应该是吃多少送多少,没吃完的放仓库。仓库总比鸭肚子要大啊!
大哥,没懂...  能否详细说下思路
0
开源红薯烹调技术专家
开源红薯烹调技术专家

我不知道 程序上面是否优化了

但从现象上说,你描述的是内存耗竭。不断地将得到的东西往另一个服务端塞,而且全塞在了内存中,你的服务器内存有多大,每条消息要占用多少资源。如果出现异常,你接受的这不知道多少个的消息就都将没有了。所以这种操作是很危险的

1、没有考虑接受端的承载能力就不断的给他发包(洪水攻击就是这样让硬件崩溃的)

2、即便能够承受,是否做好了充分的异常处理机制

因此,你试一试通过数据库来缓存处理(因为你内存吃不消,只好转硬盘了,不过每秒500个数据写入也是个麻烦事了,要不就扩内存提高效率或增加服务器)

你可以这样测试啊,在目前情况下找到发包临界值,扩充内存看略高于临界值后会不会崩溃。如果不会那你就扩内存并控制包能够在这个临界值内。

总的来说,就是服务端相互需要沟通的。即我处理完了,请您再提交信息。而不是我提交了信息请您处理。而且线程处理也要适当加sleep的,不然cpu也吓人的啊

0
我的收藏
我的收藏

引用来自“FoxHunter”的答案

我不知道 程序上面是否优化了

但从现象上说,你描述的是内存耗竭。不断地将得到的东西往另一个服务端塞,而且全塞在了内存中,你的服务器内存有多大,每条消息要占用多少资源。如果出现异常,你接受的这不知道多少个的消息就都将没有了。所以这种操作是很危险的

1、没有考虑接受端的承载能力就不断的给他发包(洪水攻击就是这样让硬件崩溃的)

2、即便能够承受,是否做好了充分的异常处理机制

因此,你试一试通过数据库来缓存处理(因为你内存吃不消,只好转硬盘了,不过每秒500个数据写入也是个麻烦事了,要不就扩内存提高效率或增加服务器)

你可以这样测试啊,在目前情况下找到发包临界值,扩充内存看略高于临界值后会不会崩溃。如果不会那你就扩内存并控制包能够在这个临界值内。

总的来说,就是服务端相互需要沟通的。即我处理完了,请您再提交信息。而不是我提交了信息请您处理。而且线程处理也要适当加sleep的,不然cpu也吓人的啊

谢谢你的回答。另我再补充一下

本项目是做GPS定位的,公司卖GPS硬件,这个项目只是辅助产品,老板可不管,你程序处理完了这次数据了再让gps发下一条。

内存增加是因为,第一秒接收到500条数据,线程开始处理这些数据,可是这一秒处理不了500条,剩下就在队列里面,而下一秒又来500条,又扔队列,所以越扔越多,内存就开始上升,升到一定程度,就挂了。

0
钛元素
钛元素
堆栈的概念。我这个小店只允许进100个人,有500个?好,进来100个,其他的全部给我排队去,然后先进先出
0
我的收藏
我的收藏

引用来自“钛元素”的答案

堆栈的概念。我这个小店只允许进100个人,有500个?好,进来100个,其他的全部给我排队去,然后先进先出

呵呵,谢谢回答,先进先出是队列吧。服务器那块 是用的堆来控制连接池。如果只处理连接,不管数据的话2000个都不是问题。现在就是因为数据排队把内存排没了

0
我的收藏
我的收藏

再顶一次,大哥们都帮小弟看看哇。

0
笨蛋EGG
笨蛋EGG

我感觉按流程这个程序没什么问题啊····只是你服务器顶不住,处理不了这么多数据而已,,

1、C#本来就不快,想快的还是C++的之类,直接上底层之类的吧,处理速度应该会有所提升的(没有验证比较过,道听途说而已)。

2、你想要一台本来就只能处理100条数据的服务器,长时间超越极限的处理500条数据,这个是不现实的,服务器或程序崩溃是迟早的事而已。如果程序可以无限优化,那估计腾讯和facebook就不会花如此的巨资打造自己的数据中心了。

3、如果要取软件与硬件的平衡点,那么就可能要牺牲速度,把队列形式形成文件形式或数据库的形式放入到硬盘中,这样减少崩溃的可能性,但是相对性会大大降低速度性能。

我的收藏
我的收藏
有道理,谢谢回答
返回顶部
顶部