Mono上的Socket.BeginReceive性能

时间:2009-09-08 18:42:34

标签: c# multithreading mono

我正在用C#开发一个服务器。该服务器将充当备份服务的数据服务器:客户端将连续发送数据,大量数据,特别是在同一个tcp通道中发送最多五个文件的数据块。我会慢慢地将数据发送到服务器,我不想杀死客户带宽,所以我不需要加速最大数据发送,因此,我可以使用单个tcp通道来处理所有事情。 / p>

说这个,实际上服务器使用BeginReceive方法从客户端获取数据,在Windows上,这意味着IOCP。我的问题是:BeginReceive将如何在linux / freebsd trough mono上执行?在Windows上,我已经阅读了很多东西,表现非常好,但是这个软件,服务器部分,将在linux或freebsd上运行单声道,我不知道这些方法是如何实现的!

更多,尝试减少(Begin | End)Receive方法的Async State对象的继续分配我保留一个用于tcp连接,并且在BeginReceive回调中我复制数据然后重用它(自然我不知道)清除数据,因为我知道通过EndReceive返回值读取了多少)。缓冲区设置为8kb,所以我最大限度地复制8kb的数据,它不应该杀死resoruces。

我的目标是最多可以达到400/500的连接数。它不是那么多,但同时,服务器(机器)将通过LVM + Linux软件Raid镜像和使用clamav进行防病毒检查,通过自己的文件系统(首先在C#中使用保险丝开发,后来在C中开发)来处理文件软件必须尽可能轻巧!

编辑:我忘了说机器将(可能)是英特尔酷睿2双核2.66+ GHz(3 MB L2 - FSB 1066 MHz),2 GB内存,SO使用64位。 / b>

单声道是使用epoll(libevent)还是kqueue(在freebsd上)?我应该做一些特定的事情来尝试最大化表现?我可以做些什么来不杀死接收数据包的资源吗?

2 个答案:

答案 0 :(得分:2)

我知道这有点晚了,但我刚发现了这个问题......

Mono能够处理您需要的连接数量等等。我经常测试xsp2(Mono ASP.NET独立服务器),同时连接超过1k ..如果这是一个高负载的情况,你应该设置MONO_THREADS_PER_CPU,直到找到ThreadPool的正确线程数

在Linux上,Mono在可用时使用epoll(现在总是如此)。

答案 1 :(得分:1)

我不能特别谈到单声道上的那个功能的性能,但是通常单声道表现得非常好。正如你所说,4-500个连接,并不是很多,所以我怀疑你有任何问题。

说到这一点,为这种事情设置测试应该不是很难。我认为这可能是你得到最终答案的唯一方法。