3

哪种型号最适合 Windows XP 的服务器型号?

如果要求是: 1. c++ ;2. 使用 async boost:asio ( BOOST_ASIO_HAS_IOCP 已设置); 3.客户端无限长时间与服务器通信。

有多少基于 boost:asio 的 socket 服务器可以正常稳定进程?

4

3 回答 3

1

boost::asio 内的连接没有限制。但是,有一些外部限制可能会影响到您(按重要性排序):

  • 您的应用程序速度和内存使用情况。

  • 线程模型,通常是您的应用程序设计。

  • 连接类型(SSL 或非 SSL)。您可以在套接字之前耗尽内存。在 unix i 上,SSL 的正常限制为 100k,非 SSL 的限制为 1M。

  • Windows 最大套接字限制。

于 2013-09-25T10:14:47.890 回答
1

确实没有适用于每种类型的 Windows 设置的单一答案。您在评论中指出您有 64 个并发连接由单个线程提供服务。那也行。事实上,一个线程可以服务超过 64 个连接 - 取决于平均消息执行的工作量。许多设计涉及将消息复制到队列,然后让后台工作线程处理该队列中的消息。这样,带有消息处理程序的线程仍然非常敏感。

一个线程可以服务多少个连接?这是你需要试验的东西。可能是 5,000、50,000 甚至 500,000+。对于为等待处理的消息队列提供服务的线程池也是如此。您需要尝试不同数量的线程。结果可能会完全不同,具体取决于完成了多少 cpu 时间、文件或 DB I/O,以及您的硬件有多现代。另外,请记住,线程存在一些重大开销。例如,前一段时间的 SO 海报说,具有 1,000,000 个线程的设计在到达时就已失效。这在今天可能仍然是正确的。因此,您的工作是找到可以最有效地为最多连接提供服务的线程数。

使用最现代的硬件和精心设计的服务器可以实现的连接总数是多少?根据我所读到的 - 1,000,000+。如果您在 C# 中使用 WCF 进行此操作,请计划不到一半。

于 2013-09-24T16:09:48.680 回答
0

套接字的数量受操作系统的限制,尽管它很大。您将遇到的主要问题是尝试同时工作的并行进程(线程)的数量,因为它们都将争夺 CPU 时间、内存和磁盘 I/O……。

此外,必须正确编写持续很长时间的客户端,以便它不会泄漏任何东西(内存和任何其他资源。)否则你会遇到麻烦(特别是如果你使用线程。)

说到内存,为每个套接字连接创建单独的进程是我所知道的避免内存碎片的最好方法。

最后一件事,我知道的 boost::asio 以非阻塞模式打开套接字,我还没有看到改变它的方法。正确关闭这样的套接字非常困难(即确保您读取了整个数据,因为在操作系统向您发送剩余数据之前您收到关闭错误......所以您需要一个完整的握手。)

于 2013-09-24T08:54:11.220 回答