2009-03-09 30 views
9

Tengo un sistema de cuatro núcleos con una aplicación de terceros que de vez en cuando realiza varios procesos (siempre el mismo ejecutable pero varias instancias) y toma el 100% del tiempo de la CPU. También tengo un par de servicios web ejecutándose en la misma caja (IIS y de terceros).¿Cómo establecer la afinidad del procesador en un ejecutable en Windows XP?

El problema con todos los núcleos que están ocupados es que hace que este servidor web de terceros agote el tiempo de espera (IIS funciona bien, pero más lento de lo normal). No tengo control sobre el servidor web de terceros, es parte del producto más grande y tiene que estar operativo. Entonces, traté de jugar con la afinidad del procesador (a través de SysInternals Process Explorer) y limitar esos molestos procesos a 3 núcleos de 4 y dedicar el 4to núcleo al servidor web de terceros, y parece funcionar bastante bien.

El problema es que solo establece afinidad en el proceso en ejecución y no en el nivel ejecutable, por lo que después de que esos procesos finalicen y vuelvan a reaparecer como un nuevo proceso, todo vuelve a ser igual: toman los 4 núcleos. Por lo tanto, he buscado en Google esta utilidad ImageCfg.exe de Microsoft, pero no puedo encontrarla en el sitio web de Microsoft para descargarla y veo que algunas personas la probaron y ahora se quejan de que realmente no funciona.

¿Hay alguna manera de mantener la afinidad con el ejecutable?

+1

Tu primera llamada debería ser del editor del software en cuestión. Pregúnteles cómo limitar el uso del hilo. – NotMe

+0

Sin embargo, el problema sigue siendo interesante porque el software puede no tener esa característica. Y ciertamente hay otro software por ahí que no ... sería molesto tener que llamar al proveedor cada vez. – ine

Respuesta

5

Una característica de Process Lasso es establecer la afinidad de un proceso cada vez que se inicia ese proceso.

3

Use SetProcessAffinityMask(). Y cuidado, Processor Affinity is inherited!

Tendrá que utilizar ImageFileExecutionOptions, específicamente the "Debugger" option, y escribir su propio pequeño ejecutable que llama SetProcessAffinityMask() en sí mismo, y luego genera un nuevo proceso, que es el que desea establecer afinidad por . Establezca eso como el depurador, y listo.

+1

Lea realmente la documentación de este. Puede dispararse fácilmente en el pie con esto; muchas trampas –

5

Es posible que desee mirar el parámetro /AFFINITY al start.

De la ayuda:

AFFINITY The new application will have the specified processor 
      affinity mask, expressed as a hexadecimal number. 

Como la afinidad del procesador en Windows es una máscara de bits que puede necesitar un poco de experimentación, pero me gustaría asumir 1 ser el primer núcleo, por lo tanto, 7 siendo los tres primeros núcleos y F siendo todo las cuatro. O 8 por solo el cuarto.

Puede reemplazar tareas programadas o accesos directos con una llamada al start con los parámetros apropiados.

+1

Windows XP no tiene la opción '/ affinity'. –

3

Puede usar la corrección de afinidad de aplicación de un solo proceso para forzar un procesador en el nivel ejecutable, lo que forzará el proceso en un núcleo.

Este artículo, http://msdn.microsoft.com/en-us/library/bb173458.aspx, tiene un párrafo sobre cómo habilitar la cuña hacia la parte inferior.

+0

El artículo se ha movido a http://msdn.microsoft.com/en-us/library/ee417693.aspx –

0

Puede intentar establecer la prioridad del proceso para que, incluso si decide usar el 100% de la CPU, algo que es de mayor prioridad pueda hacerse cargo cuando sea necesario.

Doing this automatically (en lugar de tener que jugar en el administrador de tareas) es algo que pregunté hace un tiempo.

+0

La pregunta es acerca de la afinidad del procesador, no la prioridad del proceso. –

3

La utilidad ImageCfg.exe funciona. Lo acabo de usar para resolver un problema de la compañía hoy.Está disponible de http://www.robpol86.com/pages/imagecfg.php

Imagecfg -a 0x3 xxx.exe

limita el .exe para CPU0 y CPU1, por ejemplo.

+0

No sé por qué, pero no funcionó en mi caso. – bychkov

6

http://waynes-world-it.blogspot.com/2009/06/processor-affinity-on-windows-server.html

PowerShell

Uso PowerShell para establecer la afinidad del procesador para uno o más procesos en ejecución. Hay un script de ejemplo a continuación, que establece la máscara del procesador de calc.exe en los primeros 4 procesadores. Me gusta este método porque el script es simple, sería fácil de programar, funciona en x86 y x64, es compatible con múltiples procesos del mismo nombre y, al menos en parte, porque resalta la facilidad de administración con PowerShell.

Tenga en cuenta que si utiliza el factorial de un número grande con calc.exe (n!) Generará 100% de CPU que puede ser útil para la prueba. La máscara de abajo es 0xf = 1,111 - una máscara que permite el uso de sólo los primeros cuatro procesadores:

$calcSet = Get-Process -ProcessName "calc" 
foreach ($calc in $calcSet) {$calc.ProcessorAffinity=0xF} 
1

Es evidente que este hilo es anticuado, pero im añadiendo un comentario de todos modos sólo en caso de que alguien googles sobre este tema (como yo)

podría intentar configurar la prioridad del proceso, de modo que incluso si decide utilizar el 100% de la CPU, algo que es más alta prioridad puede asumir el control cuando tiene que hacerlo.

Hacer esto automáticamente (en lugar de tener que jugar en la tarea manager) es algo que pregunté hace un tiempo.

El comando de inicio se puede utilizar para establecer la prioridad de inicio de un proceso.

Por ejemplo. start "my path\my process" /LOW para baja prioridad.

animales conmutadores prioritarios LOW, NORMAL, HIGH, REALTIME, ABOVENORMAL, BELOWNORMAL

podría ser llamado desde un archivo batch, por ejemplo.

+0

La pregunta es sobre la afinidad del procesador, no la prioridad del proceso. –

Cuestiones relacionadas