【问题标题】:Socket.BeginReceive Performance on MonoMono 上的 Socket.BeginReceive 性能
【发布时间】:2009-09-08 18:42:33
【问题描述】:

我正在用 C# 开发服务器。该服务器将充当备份服务的数据服务器:客户端将连续发送数据,大量数据,具体而言,将在同一 tcp 通道中发送最多五个文件的数据块。我将缓慢地将数据发送到服务器,我不想浪费客户带宽,所以我不需要在最大数据发送时加快速度,因此,我可以为所有事情使用单个 tcp 通道。

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

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

我的目标是最多获得 400/500 个连接。不是那么多,但与此同时,服务器(机器)将通过自己的文件系统(首先在 C# 中使用 fuse 开发,然后在 C 中开发)在 LVM+Linux 软件 Raid 镜像和使用 clamav 的防病毒检查上处理文件,所以软件必须尽可能轻巧!

编辑:我忘了说这台机器(可能)是 Intel Core 2 Duo 2.66+ GHz(3 MB L2 - FSB 1066 MHz),具有 2 GB 内存和使用 64 位的 SO。

mono 是使用 epoll(libevent)还是 kqueue(在 freebsd 上)?我应该做一些具体的事情来尝试最大化性能吗?我可以做更多的事情来不杀死接收数据包的资源吗?

【问题讨论】:

    标签: c# multithreading mono


    【解决方案1】:

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

    Mono 能够处理您需要的连接数量以及更多。我定期测试 xsp2(Mono ASP.NET 独立服务器)同时连接超过 1k .

    在 linux 上,Mono 在可用时使用 epoll(最近一直如此)。

    【讨论】:

    【解决方案2】:

    我无法具体谈论该功能在单声道上的性能,但总的来说,这些天单声道的性能非常好。正如你所说,4-500 个连接,不是很多,所以我怀疑你会遇到任何问题。

    话虽如此,为这种事情设置测试应该不是很难。我认为这可能是您获得针对您的情况的决定性答案的唯一方法。

    【讨论】:

    • 感谢您的建议!我写了一个简单的压力软件,它能够在发送数据的同时设置一组连接,非常简单。在具有 3000 个同时连接的 Windows 上测试我的服务器显示我的服务器将处理大约 250 个连接,但我认为这取决于我的客户端机器(运行压力软件的机器),因为它是一个旧的 centrino 2ghz 和 1gb 内存(= 它一次只能执行一个线程)。我需要做一些修复,但是今天下午我会在我的 linux 测试机上尝试这些东西!
    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多