Cómo limitar un proceso específico a un conjunto de núcleos de CPU con powershell
🔍 WiseChecker

Cómo limitar un proceso específico a un conjunto de núcleos de CPU con powershell

Deseas restringir una aplicación o servicio específico para que use solo ciertos núcleos de CPU en Windows 11 o Windows 10. Esto suele ser necesario cuando un proceso en segundo plano monopoliza los recursos del procesador o cuando necesitas asegurar que una aplicación crítica obtenga acceso dedicado a núcleos. Windows incluye una herramienta integrada llamada máscara de afinidad del procesador que te permite vincular un proceso a procesadores lógicos específicos. Este artículo explica cómo usar PowerShell para establecer la afinidad de núcleos de CPU para cualquier proceso en ejecución.

Puntos clave: Establecer la afinidad de procesos con PowerShell

  • Get-Process y (Get-Process).ProcessorAffinity: Recupera la máscara de afinidad actual de cualquier proceso en ejecución.
  • Cálculo de la máscara de afinidad (binario a decimal): Convierte el conjunto de núcleos de CPU deseados en un número decimal que representa la máscara de bits de los núcleos.
  • (Get-Process -Id PID).ProcessorAffinity = DecimalValue: Asigna directamente una nueva máscara de afinidad a un proceso por su ID de proceso.

ADVERTISEMENT

Qué es la afinidad de núcleos de CPU y por qué la cambiarías

Cada proceso en ejecución en Windows tiene una propiedad llamada afinidad del procesador. Esta propiedad define qué núcleos de CPU lógicos puede usar el programador del sistema operativo al asignar subprocesos de ese proceso. De forma predeterminada, un proceso puede ejecutarse en cualquier núcleo. Cambiar la afinidad restringe el proceso a un subconjunto de núcleos.

Es posible que desees limitar un proceso a núcleos específicos por varias razones. Una aplicación que consume muchos recursos, como un codificador de video o un host de máquina virtual, se puede confinar a unos pocos núcleos para que otros procesos obtengan los núcleos restantes. Algunos programas heredados tienen restricciones de licencia vinculadas al número de núcleos. En escenarios de prueba, simulas un entorno de uno o dos núcleos limitando un proceso a uno o dos núcleos.

La máscara de afinidad es una máscara de bits donde cada bit representa un procesador lógico. El núcleo 0 es el bit 0 con valor 1. El núcleo 1 es el bit 1 con valor 2. El núcleo 2 es el bit 2 con valor 4. El núcleo 3 es el bit 3 con valor 8, y así sucesivamente. Para asignar los núcleos 0 y 2, sumas sus valores 1 + 4 = 5. El valor decimal 5 es la máscara de afinidad para los núcleos 0 y 2.

Requisitos previos

Necesitas Windows PowerShell 5.1 o PowerShell 7 en Windows 10 o Windows 11. Ejecuta PowerShell como administrador para cambiar la afinidad de los procesos del sistema. Para tus propios procesos de usuario, no se requieren derechos de administrador.

Pasos para limitar un proceso específico a un conjunto de núcleos de CPU usando PowerShell

Sigue estos pasos para identificar el proceso de destino, calcular la máscara de afinidad correcta y aplicar el cambio.

  1. Abre PowerShell como administrador
    Presiona la tecla Windows, escribe PowerShell, haz clic derecho en Windows PowerShell o PowerShell y selecciona Ejecutar como administrador. Haz clic en Sí si el Control de cuentas de usuario lo solicita.
  2. Encuentra el ID de proceso (PID) del proceso de destino
    Ejecuta el comando Get-Process -Name "notepad" | Format-Table Id, ProcessName reemplazando notepad con el nombre real del proceso. Si no conoces el nombre exacto, ejecuta Get-Process | Select-Object Id, ProcessName para listar todos los procesos en ejecución. Anota el PID del proceso de destino.
  3. Determina la máscara de afinidad decimal para los núcleos deseados
    Decide qué núcleos de CPU deseas asignar. Por ejemplo, para usar los núcleos 0 y 2 en un sistema con 4 núcleos lógicos, la máscara binaria es 0101 (bits 0 y 2 establecidos). El valor decimal es 1 + 4 = 5. Para un cálculo fácil, usa esta línea de PowerShell: $cores = @(0,2); $mask = 0; foreach ($c in $cores) { $mask += [math]::Pow(2, $c) }; $mask. Esto genera el valor de máscara decimal 5.
  4. Establece la afinidad del procesador para el proceso de destino
    Usa el comando (Get-Process -Id PID).ProcessorAffinity = DecimalMask. Reemplaza PID con el ID de proceso real y DecimalMask con el valor decimal del paso 3. Por ejemplo: (Get-Process -Id 1234).ProcessorAffinity = 5. Esto restringe el proceso a los núcleos 0 y 2.
  5. Verifica el cambio
    Ejecuta (Get-Process -Id PID).ProcessorAffinity para confirmar que el valor de la máscara coincide con el número decimal deseado. La salida muestra la máscara decimal. Para ver qué núcleos están asignados, convierte el decimal de nuevo a binario: [convert]::ToString((Get-Process -Id PID).ProcessorAffinity, 2). La cadena binaria muestra 1 para los núcleos asignados.

Ejemplo: Limitar el Bloc de notas solo al núcleo 0 de la CPU

Abre el Bloc de notas. Ejecuta Get-Process -Name "notepad" | Format-Table Id, ProcessName y anota el PID, por ejemplo 5678. Calcula la máscara solo para el núcleo 0: valor decimal 1. Ejecuta (Get-Process -Id 5678).ProcessorAffinity = 1. El Bloc de notas ahora se ejecuta exclusivamente en el núcleo 0.

ADVERTISEMENT

Problemas comunes al establecer la afinidad de procesos

Error “Acceso denegado” al cambiar la afinidad

Si ves un error de Acceso denegado, el proceso se ejecuta como otro usuario o es un proceso del sistema protegido. Cierra todas las instancias del proceso y luego ejecuta PowerShell como administrador. Para procesos del sistema como svchost, debes ejecutar PowerShell como SYSTEM usando herramientas como PsExec o el Programador de tareas integrado.

La afinidad se restablece después de reiniciar el proceso

El cambio de afinidad no es permanente. Cuando el proceso finaliza y se reinicia, Windows asigna la afinidad predeterminada (todos los núcleos). Para que el cambio persista, crea una tarea programada que ejecute el comando de PowerShell al inicio o cada vez que se inicie el proceso. Usa el Programador de tareas para activar el script al iniciar el proceso mediante eventos del registro de eventos para la creación de procesos.

Cálculo incorrecto del número de núcleos o de la máscara

Windows numera los procesadores lógicos empezando desde 0. En un sistema con hyper-threading habilitado, cada núcleo físico aparece como dos procesadores lógicos. Usa la pestaña Rendimiento del Administrador de tareas para ver el número total de CPU lógicas. Verifica dos veces tu conversión de binario a decimal. Un error común es usar el número de núcleos como valor de máscara. Para solo el núcleo 3, la máscara es 8, no 3.

PowerShell Set-ProcessAffinity vs máscara de afinidad manual

Elemento PowerShell (Get-Process).ProcessorAffinity Afinidad manual del Administrador de tareas
Método Asignación por línea de comandos automatizable Casillas de verificación de la GUI en el Administrador de tareas
Automatización Totalmente automatizable en scripts y tareas programadas Debe hacerse manualmente cada vez que se inicia el proceso
Selección de núcleos Usa una máscara decimal derivada de la máscara de bits binaria Casillas de verificación para cada procesador lógico
Derechos requeridos Administrador para procesos del sistema Administrador para todos los procesos
Persistencia No persiste entre reinicios a menos que se automatice con script No persiste entre reinicios

Ahora puedes limitar cualquier proceso en ejecución a núcleos de CPU específicos con un solo comando de PowerShell. Esta técnica te brinda un control detallado sobre la asignación de recursos del procesador sin herramientas de terceros. Para una afinidad permanente, combina el comando con una tarea programada que se active al crear el proceso. El cálculo de la máscara de núcleos sigue un patrón binario simple que funciona de forma idéntica en Windows 11 y Windows 10.

ADVERTISEMENT