多线程TCP网络的性能



我正在使用TCP协议进行一个项目,该项目可能必须同时处理多个100或多个连接。

因此,我不确定我应该用什么方法收集和发送这些数据。

我想知道这里是否应用了更多线程=更多性能的原则。

我怀疑的原因是,所有数据仍然必须通过网络连接馈送,其中大多数设备一次只有1个活动数据。此外,我知道重复的上下文切换也会降低性能。

然而,我从其他来源看到,多线程确实在一定程度上扩展了网络性能,如果这是真的,为什么?

目前,我正在使用ASIO的Non-Boost变体来处理网络。

提前感谢您的帮助。

ASIO是epoll/IOCP的包装器,因此针对高性能非阻塞I/O进行了优化。通过这种设置,可以在单个线程上实现数十万个同时连接。事实上,老式的";每个客户端一个线程";由于上下文切换开销,安装程序永远无法达到此级别的性能。

话虽如此,根据使用的协议,处理网络请求和回复需要一些CPU时间,在高速率网络上,它可能会使io_service运行的单个CPU核心饱和。在这种情况下,可以并行化io_service,以便完成例程可以在多个核心上运行。如果线程数量不超过可用CPU内核/硬件线程的数量,仍然不会发生上下文切换。当同一个内核需要处理多个线程时,以及在用户和内核模式之间切换时(即每次系统调用两次(,都会发生上下文切换。

对服务器进行基准测试,看看它在一个线程上可以处理多少客户端。很可能这就足够了。并行io_service的代价是必须处理并行运行的完成例程,这几乎总是需要额外的同步,这意味着额外的开销。

您想要的线程数量与您拥有的CPU核心数量大致相同,包括超读取的线程。没有更多。

每个线程处理套接字的一个子集。这样,可以最大限度地提高CPU并行性,但最大限度地减少开销。

如果您确实需要100秒内的连接并且需要低延迟,则应该考虑UDP,在UDP中,单个套接字可以从许多远程地址接收。但是你必须自己实现可靠性。不过,多玩家AAA游戏服务器通常就是这样运行的。这是有充分理由的。

多线程与单线程是一个棘手的话题,我认为这一切都取决于您实现的角度
如果您在一个线程上有一个好的事件驱动系统,那么使用单线程进行低级别网络IO可能会更好。生成线程本身会带来性能损失,因为系统需要处理它们,当然使用额外的处理器会有所帮助,但正如您所说,当最终进入低级别时,所有线程都需要某种同步,再次受到损失,除非您每个线程使用一个套接字。

网络上多线程(每个线程一个套接字(的一个主要缺点是,系统在大多数时候都会受到"慢速loris"攻击。慢懒猴维基百科电脑爱好者的视频慢loris

因此,我认为您最好将多线程用于其他等待时间长或耗时的任务。当然你应该使用非阻塞IO。

最新更新