2011-02-07 60 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效率。

相關問題