5

一个新的游戏服务器刚刚问世,我们公司愿意提供出租。然而,游戏开发者并没有创建任何休眠模式来在没有玩家连接时关闭物理,因此空服务器正在消耗 30% 左右的 CPU。

我发现这个游戏面板插件限制了应用程序的 CPU 使用率。

我用 C# .NET 为我们公司编写了一些小应用程序,以帮助改进我们的服务,我想知道我将如何创建这样的东西。是否可以?

4

4 回答 4

3

您可能会考虑简单地降低进程的优先级。这不会直接限制 CPU,但会导致进程线程的调度频率低于具有正常和更高优先级的进程。

检查System.Diagnostics.Process.PriorityClass文档

于 2011-02-07T17:10:56.230 回答
2

我的猜测是服务器应用程序正在轮询而不是事件驱动。除非将这段代码转换为事件驱动,否则轮询将使用 CPU。应用程序将休眠,直到它从操作系统接收到它需要处理的事件。轮询只会旋转寻找事件并浪费 CPU。除非以任何方式减少 CPU 使用率,否则降低进程的优先级不会真正有帮助。此应用程序需要重写以提高 CPU 效率。

于 2011-02-07T19:56:52.500 回答
0

这个答案对你来说可能很有趣,我就是这样做的。

如何限制 C# 程序占用的 CPU 使用率?

我不知道您是否可以这样做,但是您可以通过Priority属性更改执行线程的线程优先级。您可以通过以下方式设置:

Thread.CurrentThread.Priority = ThreadPriority.Lowest;

另外,我不认为你真的想限制它。如果机器处于空闲状态,您希望它忙于任务,对吗?ThreadPriority 有助于将此信息传达给调度程序。

于 2011-02-07T17:15:20.687 回答
0

我假设游戏服务器是线程的。如果是这种情况,您可能能够务实地在应用程序上强制 CPU 亲和性。如果你有办法判断游戏是否有用户,即 UDP 数据包是否从分配的端口进入,你可以说“嘿,没有人连接”。然后,您可以让您的程序将所有工作线程强制到同一个核心上。

所以,如果你有一个 8 核 cpu,并且所有线程都在一个核心上,那么它最多会使用 12.5% 的 cpu。

一旦您看到数据包进入分配的端口,您就可以将关联分配回所有核心。

你可以更进一步说“有没有“空闲”游戏。如果有任何空闲游戏,它们都在……比如说……核心 7,然后在更高的位置运行 HLT 指令的无限循环优先级高于游戏,但强制线程休眠,这样它就不会完全饿死游戏。

这将导致 CPU 使用更少的功率,但会做更多的工作并且出现问题的可能性更高。

我会坚持只强制亲和力,让所有闲置游戏共享一些给定的核心。

于 2011-02-07T18:48:19.517 回答