【发布时间】:2016-04-20 06:15:28
【问题描述】:
我是 C++ 后端开发人员。我为实时游戏开发服务器端。因此,应用程序架构如下所示:
1) 我有类客户端,它处理来自游戏客户端的请求。请求示例:登录、在商店购买东西(游戏内部商店)或制作一些东西。此客户端还处理来自游戏客户端的用户输入事件(通常是事件,当玩家玩游戏时,它会在一秒钟内从游戏客户端向服务器发送十次)。
2) 我有线程池。当游戏客户端连接到服务器时,我创建客户端实例并将它们绑定到池中的线程之一。所以,我们有一对多的关系:一个线程 - 许多客户。循环用于选择线程进行绑定。
3) 我使用 Libev 来管理服务器内的所有事件。这意味着当客户端实例通过网络从游戏客户端接收一些数据,或者处理一些请求,或者试图通过网络向游戏客户端发送一些数据时,他锁定了hi的线程。当他做一些东西时,其他客户端共享同一个线程将被锁定。
因此,线程池是应用程序的瓶颈。为了增加服务器上的并发玩家数量,谁可以毫无延迟地玩,我需要增加线程池中的线程数。
现在应用程序在具有 24 个逻辑 cpu 的服务器上工作(cat /proc/cpuinfo 说它)。我将线程池大小设置为 24(1 个处理器 - 1 个线程)。这意味着,在当前在线 2000 名玩家的情况下,每个线程都服务于大约 84 个客户端实例。 top 说处理器的使用率不到 10%。
现在问题。如果我增加线程池中的线程数是增加还是减少服务器性能(上下文切换开销与每个线程锁定的客户端)?
UPD 1)服务器有异步IO(libev + epoll),所以当我说客户端在发送和接收数据时被锁定时,我的意思是应对缓冲区。 2)服务器也有后台线程用于慢任务:数据库操作,硬计算操作,...
【问题讨论】:
-
根据经验:运行线程数应大致等于 CPU 内核数。
-
好的,但是如果有 10 个线程空闲并等待某些事件,并且 14 个线程过载,情况会怎样。我认为如果服务器只有 10% 的负载,我可以增加线程数,因为其中一些会休眠。
-
“线程池是应用程序的瓶颈”是一个大胆的主张,是什么让你这么认为?无论如何,你问你系统的性能是什么。您应该做的第一件事是设置测量方法。首先,你的问题已经过时了。其次,您可以衡量自己在提高性能方面的尝试。
-
是的,我认为在不同情况下衡量性能是个好方法。我会花一些时间来做这件事。在此之前我想知道专家的意见,因为我在stackoverflow上提问。 (我办公室里没有人可以回答这个问题)
-
当线程被锁定时,客户端是否发送、接收或执行任何其他阻塞操作?即使 CPU 或多或少处于空闲状态,这也可能会锁定线程。如果是这种情况,线程池中的更多线程将是一个解决方案。
标签: c++ linux multithreading performance cpu