哪种型号最适合Windows XP的服务器型号?
如果要求是: 1. c ++; 2.使用async boost:asio(设置BOOST_ASIO_HAS_IOCP); 3.客户端无限期长时间与服务器通信。
基于boost的多少套接字服务器:asio能否正常稳定进程?
答案 0 :(得分:1)
确实没有单一的答案适用于所有类型的Windows设置。您在评论中指出,您有64个并发连接由单个线程提供服务。那样就好。事实上,单个线程可以提供超过64个连接的服务 - 具体取决于平均消息执行的工作量。许多设计涉及将消息复制到队列,然后让后台工作线程处理该队列中的消息。这样,带有消息处理程序的线程仍然非常敏感。
单个线程可以为多少个连接提供服务?这是你需要尝试的东西。它可能是5,000,5,000甚至500,000+。为等待处理的消息队列提供服务的线程池也是如此。您需要尝试不同数量的线程。结果可能会有很大差异,具体取决于cpu时间,文件或数据库I / O的完成程度以及硬件的现代化程度。另外,请记住线程有一些显着的开销。例如,前段时间的一张SO海报说,有1,000,000个线程的设计在抵达时已经死亡。今天仍然可能是这样。因此,您的工作就是找到能够最有效地为最多连接提供服务的线程数。
使用最先进的硬件和精心设计的服务器可以实现的连接总数是多少?基于我所读到的 - 1,000,000+。如果您在C#中使用WCF进行此操作,请计划不到一半。
答案 1 :(得分:1)
boost :: asio中的连接没有限制。但是,有一些外部限制可以打击你(按重要性排序):
您的应用速度和内存使用情况。
线程模型,通常是您的应用设计。
连接类型(SSL或无SSL)。你以前可能会用完内存 插座。在unix i上,除了SSL的正常限制100k和1M的正常限制 非SSL
Windows最大套接字限制。
答案 2 :(得分:0)
套接字的数量受操作系统的限制,尽管它很大。您将遇到的主要问题是将尝试同时工作的并行进程(线程)的数量,因为它们将争夺CPU时间和内存以及磁盘I / O ....
此外,持续很长时间的客户端必须正确编写,以便它不会泄漏任何内容(内存和其他任何资源。)否则您将遇到麻烦(特别是如果您使用线程。)
说到内存,为每个套接字连接创建单独的进程是我所知道的避免内存碎片的最佳方法。
最后一点,我所知道的boost :: asio在非阻塞模式下打开套接字,我还没有看到改变它的方法。正确关闭这样一个套接字是非常困难的(即确保你读取整个数据,因为在操作系统发送剩余信息之前你会收到一个关闭错误......所以你需要一个完整的握手。)