2011-02-07 31 views
5

Acaba de aparecer un nuevo servidor de juegos que nuestra empresa desea ofrecer para alquilar. Sin embargo, los desarrolladores del juego no crearon ningún tipo de modo de hibernación para apagar la física cuando no hay jugadores conectados, por lo que un servidor vacío consume aproximadamente un 30% de CPU.CPU de acelerador Uso de la aplicación

Encontré este juego panel addon que limita el uso de la CPU de las aplicaciones.

He escrito algunas aplicaciones pequeñas en C# .NET para que nuestra empresa ayude a mejorar nuestros servicios y me pregunto cómo podría crear algo como esto. ¿Es posible?

+0

Dependiendo de lo que esté haciendo el juego, siempre existe la posibilidad de que reducir la velocidad de forma artificial solo haga que se realicen copias de seguridad de muchos eventos o algo así que básicamente no responda cuando lo desee utilizar nuevamente mientras borra el atraso que ha causado la aceleración. Puede que estés bien, solo me llama la atención que comprender lo que está haciendo en ese momento con el 30% de la CPU podría ser valioso. Podría ser que no es bueno tener cosas, por supuesto. :) – Chris

+0

Guau, eso suena molesto. En todo caso, consumirá mucha energía extra. – Bengie

Respuesta

3

Puede considerar simplemente bajar la prioridad del proceso. Esto no limitará la CPU directamente, pero hará que los hilos de los procesos se programen con menos frecuencia que los procesos con prioridades normales y superiores.

Comprobar System.Diagnostics.Process.PriorityClass (doc)

+0

Parece probable que sea lo que hace el programa vinculado, por lo que +1 para esta respuesta. No puedo imaginar ninguna forma de limitar las acciones de un programa internamente sin ingeniería inversa y parcheo del código existente, que probablemente sea una violación de derechos de autor/CLUF según su país y el programa en cuestión. – Jason

+0

El panel de juego que utilizamos tiene la opción de ejecutar servicios con una prioridad más baja, sin embargo, este juego parece usar cualquier CPU disponible. Es por eso que preferiría estrangularlo en lugar de simplemente reducir la prioridad. –

+0

@Michael, si baja la prioridad, entonces no es un problema. Saldrá efectivamente del camino cuando otro proceso quiera usar la CPU. No dejes que tu CPU% gauge te engañe. Además, verifique para asegurarse de que no haya otro proceso en ejecución. Algunos de estos servidores de juegos engendran otros procesos. – Brad

0

Este answer podría ser interesante para ti y así es como yo lo haría.

Cómo restringir el uso de la CPU un programa C# lleva?

No sé si puede hacerlo, pero puede cambiar la prioridad de subproceso del subproceso de ejecución a través de la propiedad Priority. Se podría establecer que por:

Thread.CurrentThread.Priority = ThreadPriority.Lowest; 

Además, no creo que realmente quieres para colmo. Si la máquina está inactiva, le gustaría que se ocupe de la tarea, ¿verdad? ThreadPriority ayuda a comunicar esto al programador.

0

Asumo el servidor del juego está roscado. Si este es el caso, es posible que pueda forzar pragmáticamente la afinidad de la CPU en la aplicación. Si tuvieras una manera de saber si el juego tenía usuarios o no, es decir, si los paquetes UDP están ingresando en el puerto asignado, podrías decir "hey, nadie está conectado". A continuación, puede hacer que su programa fuerce todos los hilos de trabajo en el mismo núcleo.

Por lo tanto, si tiene una CPU de 8 núcleos y todos los hilos están en un núcleo, como máximo usaría 12,5% de CPU.

Una vez que vea los paquetes que entran en el puerto asignado, puede asignar la afinidad a todos los núcleos.

Podrías ir un paso más allá y decir "¿Hay juegos" inactivos "? Si hay juegos inactivos, que están todos en ... digamos ... núcleo 7, luego ejecuta un ciclo infinito del HLT instrucción en una prioridad más alta que el juego, pero forzar el hilo a dormir para que no muera de hambre por completo el juego.

Esto haría que la CPU utilizara menos energía, pero sería mucho más trabajo y tendría una mayor posibilidad de problemas.

que se pegaba a forzar única afinidad, y dejar que todos los juegos de inactividad comparten algunas básica recogida.

2

Mi conjetura es que la aplicación del servidor está haciendo encuestas en lugar de ser impulsada por eventos. El sondeo usará CPU a menos que este fragmento de código se convierta en evento controlado. La aplicación dormirá hasta que reciba un evento del sistema operativo que necesita procesar.El sondeo simplemente girará buscando un evento y desperdiciará la CPU. Reducir la prioridad del proceso no ayudará realmente a menos que se reduzca el uso de la CPU de alguna manera. Esta aplicación debe ser reescrita para que sea más eficiente con la CPU.