【发布时间】: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