2011-02-07 61 views
5

我们公司想出租的新游戏服务器刚刚问世。然而,当没有玩家连接时,游戏开发者没有创建任何类型的休眠模式来关闭物理,所以空的服务器正在吃掉CPU的30%左右。节流CPU应用程序的使用情况

我发现这个游戏panel addon它限制了应用程序的CPU使用率。

我已经在C#.NET中为我们的公司编写了一些小应用程序,以帮助改进我们的服务,我想知道如何去创建类似这样的东西。可能吗?

+0

根据游戏的具体情况,人为地放慢速度会导致很多事件被备份,或者当你想要再次使用时,它会基本上没有响应,清除限制导致的积压。你可能没问题,这让我明白,当时30%的cpu可能是有价值的。可能是因为当然有东西是不必要的。 :) – Chris 2011-02-07 17:20:30

+0

哇,这听起来很烦人。如果有的话,它会吃掉很多额外的权力。 – Bengie 2011-02-07 18:39:14

回答

3

您可能会考虑简单地降低过程的优先级。这不会直接限制CPU,但会导致进程线程的调度次数少于具有普通和更高优先级的进程。

检查System.Diagnostics.Process.PriorityClassdoc

0

answer可能是你感兴趣的,这就是我会怎么做。

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

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

Thread.CurrentThread.Priority = ThreadPriority.Lowest; 

另外,我不认为你真的想盖住它。如果机器处于闲置状态,您希望它忙于处理任务,对吧? ThreadPriority可帮助将此信息传递给调度程序。

0

我假设游戏服务器是线程化的。如果是这种情况,您可能会实际强制应用程序上的CPU关联。如果您有办法确定游戏是否有用户,即UDP数据包是否进入指定的端口,您可以说“嘿,没有人连接”。然后你可以让你的程序强制所有工作线程进入同一个核心。因此,如果你有一个8核心的CPU,并且所有的线程都在一个核心上,那么它最多会使用12.5%的CPU。

一旦您看到分组进入分配的端口,您可以将关联分配给所有核心。

你可以更进一步说“有没有”空闲“游戏,如果有任何空闲游戏,这些游戏都在......核心7,然后运行HLT的无限循环指令的优先级高于游戏,但强制线程进入睡眠状态,因此它不会完全停止游戏。

这会导致CPU使用更少的功率,但会有更多的工作并且具有更高的优先级机会的问题。

我会坚持只有迫使亲和力,并让所有的空闲游戏分享一些特定的核。

2

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

相关问题