5

当社がレンタル用に提供したい新しいゲームサーバーが登場しました。ただし、ゲーム開発者は、プレーヤーが接続されていないときに物理をシャットダウンするための休止状態モードを作成していないため、空のサーバーは 30% 程度の CPU を消費しています。

アプリケーションの CPU 使用率を制限するこのゲームパネル アドオンを見つけました。

私は会社のサービスを改善するために C# .NET でいくつかの小さなアプリを作成しましたが、このようなものをどのように作成するのか疑問に思っています。出来ますか?

4

4 に答える 4

3

単純にプロセスの優先度を下げることを検討してください。これにより、CPU が直接制限されることはありませんが、プロセス スレッドが通常の優先度の高いプロセスよりもスケジュールされる頻度が低くなります。

チェックSystem.Diagnostics.Process.PriorityClassドキュメント

于 2011-02-07T17:10:56.230 に答える
2

私の推測では、サーバーアプリはイベント駆動型ではなくポーリングを実行しています。このコードがイベント駆動型に変換されない限り、ポーリングはCPUを使用します。アプリケーションは、処理する必要のあるイベントをOSから受信するまでスリープします。ポーリングはイベントを探すためにスピンするだけで、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 があり、すべてのスレッドが 1 つのコアにある場合、最大で 12.5% の CPU を使用します。

割り当てられたポートにパケットが入ってくるのを確認したら、アフィニティをすべてのコアに割り当てることができます。

これをさらに一歩進めて、「「アイドル」ゲームはありますか。すべてオンになっているアイドルゲームがある場合..コア7と言って、より高いHLT命令の無限ループを実行します。ゲームよりも優先されますが、ゲームを完全に飢えさせないようにスレッドを強制的にスリープさせます。

これにより、CPU の消費電力は少なくなりますが、より多くの作業が必要になり、問題が発生する可能性が高くなります。

私はアフィニティのみを強制することに固執し、アイドル状態のすべてのゲームが特定のコアを共有できるようにします。

于 2011-02-07T18:48:19.517 に答える