我们公司想出租的新游戏服务器刚出来。然而,游戏开发者没有创建任何类型的休眠模式来在没有玩家连接时关闭物理,所以空服务器正在吃30%左右的CPU。
我发现这个游戏panel addon限制了应用程序的CPU使用率。
我已经在C#.NET中为我们公司编写了一些小应用程序来帮助改进我们的服务,我想知道如何创建这样的东西。有可能吗?
答案 0 :(得分:3)
您可以考虑简单地降低流程的优先级。这不会直接限制CPU,但会导致进程线程的调度次数低于具有正常和更高优先级的进程。
检查System.Diagnostics.Process.PriorityClass
(doc)
答案 1 :(得分:2)
我的猜测是服务器应用正在进行轮询而不是事件驱动。除非将这段代码转换为事件驱动,否则轮询将使用CPU。应用程序将一直处于休眠状态,直到它从操作系统收到需要处理的事件。轮询只会旋转寻找事件并浪费CPU。除非以任何方式减少CPU使用率,否则降低进程的优先级将无济于事。需要重写此应用程序以提高CPU效率。
答案 2 :(得分:0)
这answer对你来说可能很有意思,我就是这样做的。
如何限制C#程序的CPU使用率?
我不知道你是否可以这样做,但你可以通过Priority属性更改执行线程的线程优先级。您可以通过以下方式设置:
Thread.CurrentThread.Priority = ThreadPriority.Lowest;
另外,我认为你真的不想限制它。如果机器处于闲置状态,你会喜欢它忙于完成任务,对吗? ThreadPriority有助于将其传达给调度程序。
答案 3 :(得分:0)
我假设游戏服务器是线程化的。如果是这种情况,您可以在应用程序上实用地强制CPU关联。如果你有办法判断游戏是否有用户,即如果UDP数据包进入指定的端口,你可以说“嘿,没有人连接”。然后,您可以让程序强制所有工作线程都在同一个核心上。
所以,如果你有一个8核心cpu并且所有线程都在一个核心上,那么最多它将使用12.5%的cpu。
一旦看到分配端口上的数据包,就可以将关联性分配给所有核心。
你可以更进一步说“有没有”闲置“游戏。如果有任何空闲游戏,全部开启......让我们说..核心7,然后运行HLT指令的无限循环比游戏更高的优先级,但强迫线程睡觉,所以它不会完全饿死游戏。
这会导致CPU耗电量减少,但工作量会增加很多,并且出现问题的可能性也会增加。
我坚持只强迫亲和力,让所有空闲游戏分享一些给定的核心。