一个新的游戏服务器刚刚问世,我们公司愿意提供出租。然而,游戏开发者并没有创建任何休眠模式来在没有玩家连接时关闭物理,因此空服务器正在消耗 30% 左右的 CPU。
我发现这个游戏面板插件限制了应用程序的 CPU 使用率。
我用 C# .NET 为我们公司编写了一些小应用程序,以帮助改进我们的服务,我想知道我将如何创建这样的东西。是否可以?
一个新的游戏服务器刚刚问世,我们公司愿意提供出租。然而,游戏开发者并没有创建任何休眠模式来在没有玩家连接时关闭物理,因此空服务器正在消耗 30% 左右的 CPU。
我发现这个游戏面板插件限制了应用程序的 CPU 使用率。
我用 C# .NET 为我们公司编写了一些小应用程序,以帮助改进我们的服务,我想知道我将如何创建这样的东西。是否可以?
您可能会考虑简单地降低进程的优先级。这不会直接限制 CPU,但会导致进程线程的调度频率低于具有正常和更高优先级的进程。
检查System.Diagnostics.Process.PriorityClass
(文档)
我的猜测是服务器应用程序正在轮询而不是事件驱动。除非将这段代码转换为事件驱动,否则轮询将使用 CPU。应用程序将休眠,直到它从操作系统接收到它需要处理的事件。轮询只会旋转寻找事件并浪费 CPU。除非以任何方式减少 CPU 使用率,否则降低进程的优先级不会真正有帮助。此应用程序需要重写以提高 CPU 效率。
我假设游戏服务器是线程的。如果是这种情况,您可能能够务实地在应用程序上强制 CPU 亲和性。如果你有办法判断游戏是否有用户,即 UDP 数据包是否从分配的端口进入,你可以说“嘿,没有人连接”。然后,您可以让您的程序将所有工作线程强制到同一个核心上。
所以,如果你有一个 8 核 cpu,并且所有线程都在一个核心上,那么它最多会使用 12.5% 的 cpu。
一旦您看到数据包进入分配的端口,您就可以将关联分配回所有核心。
你可以更进一步说“有没有“空闲”游戏。如果有任何空闲游戏,它们都在……比如说……核心 7,然后在更高的位置运行 HLT 指令的无限循环优先级高于游戏,但强制线程休眠,这样它就不会完全饿死游戏。
这将导致 CPU 使用更少的功率,但会做更多的工作并且出现问题的可能性更高。
我会坚持只强制亲和力,让所有闲置游戏共享一些给定的核心。