2012-06-10 33 views
5

Nuestro modelo de negocio requiere que los usuarios cobren en función de horas/uso de la CPU.Cálculo del uso de CPU

Inicialmente estaba pensando simplemente en usar StopWatch y luego usar el tiempo transcurrido como una unidad de medida.

Pero el problema que veo con este enfoque es que, en el día cuando 5000 usuarios están accediendo al servidor, el tiempo transcurrido para el mismo código será mayor que en la noche cuando solo 50 usuarios están accediendo al servidor.

Otra opción es cobrar a los usuarios en función de las iteraciones realizadas en los datos que los usuarios pasaron. También hay un par de problemas con este enfoque.

  • Algunas funciones no requieren ninguna iteración sobre los datos.
  • El uso de CPU para x + y es inferior al de x + y * z.

¿Cuál es una buena forma de calcular la información de uso de CPU en C#/.Net para que todos los usuarios mantengan la misma operación independientemente de la carga del servidor?

Posiblemente, ¿cantidad total de instrucciones reales del nivel de ensamblaje? ¿Hay alguna manera de obtener esa información en C#?

¿Qué otras recomendaciones se pueden abordar?

Muchas gracias por investigar sobre esto.

Respuesta

14

Ejecute lo que sus usuarios quieran ejecutar en un process por separado y busque su CPU time después de que el proceso haya finalizado. Esto también es diferente del tiempo de reloj de pared, ya que solo tiene en cuenta el tiempo que el proceso realmente se ejecutó en la CPU.

ejemplo Mínimo para aquellos que no están dispuestos a leer documentación:

ProcessStartInfo psi = new ProcessStartInfo(@"C:\Blah\Foo.exe"); 
Process p = Process.Start(psi); 
p.WaitForExit(); 
TimeSpan time = p.TotalProcessorTime; 
p.Close(); 

Es posible que desee ejecutar esta manera asíncrona, sin embargo.

No es necesario estimar, adivinar o magia negra. No se puede calcular confiablemente de todos modos.

+2

¿Puede compartir algunos ejemplos de ejecutar un código en un proceso separado y obtener su tiempo de CPU? – Moon

+0

+1 para "para aquellos que no están dispuestos a leer la documentación" (así como para tener una respuesta correcta :-)) – phoog

+0

BTW, ¿qué ocurre si quiero rastrear el uso de una sola función? Puedo envolver ese código dentro de un exe. ¿Pero hay alguna forma mejor? Si la función ejecuta alguna otra tarea en el hilo de fondo, ¿serán parte del mismo proceso y afectarán al 'TotalProcessTime'? – Moon