0

我正在尝试重写我当前的项目以包含更多功能和稳定性,并且需要一些帮助来设计它。这是它的主要内容(对于 linux):

  • TCP_SERVER 接收连接(认证数据包)
  • TCP_SERVER 启动一个新的(线程/分叉)来处理新的客户端
  • TCP_SERVER 将接收来自客户端 > 的许多数据包,这些数据包将被添加到循环缓冲区
  • 将为该客户端创建一个单独的线程来处理这些数据包并构建对象列表
  • 应该创建另一个线程来将部分对象列表发送到另一个客户端

将所有处理分成线程的原因是因为服务器将收到很多数据包并且处理将无法跟上(这需要快速,因为它的时间敏感)(我不确定如果内部有 tcp 是否会丢弃数据包缓冲区变得太大?),另一个线程发送到另一个客户端以尽可能快地处理。

因此,对于每个新连接,应该创建 3 个线程。1 接收数据包,1 处理它们,1 将处理后的数据发送到另一个客户端(从技术上讲,这是同一个人/IP,只是在不同的设备上)

我需要帮助设计这个,如何构建这个,使用什么(forks/threads),使用什么库。

4

2 回答 2

0

试图自己做这件事会给你带来一个痛苦的世界。专注于您的实际应用程序,并利用现有的套接字处理框架。例如,您说:

对于每个新连接,应创建 3 个线程

该声明如下: 1. 您以前没有大规模地这样做过,也没有意识到所有这些线程将产生的影响。2. 您从未对线程创建或同步操作进行基准测试。3. 这种方法可能出错的事情非常多。

认真考虑使用为您完成大部分工作的现有库。解决这个问题实际上可能需要数年时间,而且您最好专注于您的代码,而不是所有的随机管道。

Boost C++ 库似乎有一个很好的异步 C++ 套接字处理基础设施。将其与一些现有的 C++ 线程池结合起来,您可能会很快拥有一个高性能的解决方案。

我也会质疑您为此使用 C++。Java 和 C# 都很好地完成了高度可扩展的套接字服务器,并且一些高级语言工具(Spring、Guarva 等)可能非常非常有价值。如果您想通过 TLS 或其他机制保护这一点,您可能还会发现在 Java 或 C# 中比在 C++ 中更容易。

您将关心的一些主要事项: 1. 真正的异步 I/O 将在性能和可扩展性方面取得巨大的胜利。努力做到这一点。boost asio 库看起来很不错。2. 专注于你的特性和稳定性,而不是构建一个新的套接字处理平台。3. 线程很昂贵,避免创建它们。线程池是你的朋友。

于 2013-11-04T03:54:13.083 回答
0

您计划为服务器处理的每个连接创建一个或多个线程。线程不是免费的,它们会带来内存和 CPU 开销,并且当您有许多活动线程时,您也开始出现资源争用。

你预计什么使用模式?您是否期望当您有 8 个连接时,所有 8 个网络线程将消耗 100% 的 cpu 核心推/拉数据包?还是您希望他们的周转率相对较低?

随着您添加更多线程,您将开始不得不花费更多时间来争夺互斥锁等资源。

一种更好的模式是为网络 io 设置一个或多个线程 - 大多数操作系统都有说“告诉我这些网络连接中的一个或多个何时具有 io”的机制,这比让许多单独的线程都在执行的效率节省一个连接也是一样的。

然后对于实际处理,启动一个工作线程池来执行实际工作,从而最大限度地减少对资源的竞争。您可以监控工作负载,以确定是否需要加快速度来满足交付要求。

您可能还想研究一些东西来为您实现网络 IO 基础架构;我使用libevent获得了非常好的性能结果,但是我只需要处理非常高性能/可靠性的网络系统。

于 2013-11-04T04:05:40.723 回答