Usando solo un núcleo de CPU


9

Necesito ejecutar pruebas de rendimiento para mi programa concurrente y mi requisito es que se ejecute en un solo núcleo de CPU. (No quiero hilos cooperativos; quiero tener siempre un cambio de contexto).

Entonces tengo dos preguntas:

  1. La mejor solución: cómo firmar y reservar solo un núcleo de CPU solo para mi programa (para forzar al sistema operativo a no usar este núcleo de CPU). Supongo que no es posible, pero tal vez me equivoque ...

  2. ¿Cómo configurar Linux (Fedora 24) para usar solo un núcleo de CPU?



1
Tenga en cuenta que las CPU modernas pueden cambiar su velocidad dependiendo de cuántos núcleos estén en uso en total. Incluso si se asegura de que su proceso solo esté usando un solo núcleo y ningún otro proceso lo esté usando, la velocidad de ese núcleo será diferente dependiendo de cómo el sistema operativo usará los otros núcleos. Tenga esto en cuenta cuando ejecute sus pruebas.
liori

Debería poder desactivar los núcleos de la CPU desde el BIOS, tal vez sea más confiable para sus pruebas como @liori declaró anteriormente que el sistema operativo podría estar alterando la velocidad del núcleo.
Marcs

¿Qué pasa con la creación de una VM y asignarle solo un núcleo? Oh, acabo de leer el "no utilizar este núcleo de CPU", así que no importa ...
sakisk

Respuestas:


26

En Linux, la llamada del sistema para establecer la afinidad de la CPU para un proceso es sched_setaffinity. Luego está la tasksetherramienta para hacerlo en la línea de comando.

Para que ese único programa se ejecute en una sola CPU, creo que querría algo como

taskset -c 1 ./myprogram

(establezca cualquier número de CPU como argumento para el -cconmutador).

Eso debería estar lo suficientemente cerca de un sistema de procesador único, siempre y cuando sus otros procesos no se ejecuten demasiado en comparación con el que desea medir, o se programen en otras CPU. Si desea dedicar una CPU solo a ese proceso único y evitar que otros procesos se ejecuten en esa CPU, también necesitará establecer su afinidad.

Eso, no sé cómo hacerlo correctamente. Tendrá que configurar la afinidad del procesador initdesde muy temprano en el proceso de arranque para asegurarse de que se herede a todos los procesos del sistema. Como solución alternativa, puede usar taskset -c -p 0 $PIDpara todos los demás procesos para forzarlos a ejecutarse solo en la CPU # 0.

systemd también tieneCPUAffinity= que controlar la afinidad en los archivos de la unidad y hay un par de preguntas sobre cómo establecer la afinidad predeterminada aquí en unix.SE, pero no encontré ninguna con una buena solución.

Aunque como @Kamil Maciorowski comentó y respondió a otra pregunta en superuser.com , la configuración isolcpus=1 en la línea de comando del núcleo debería "aislar esa CPU de los algoritmos de programación generales", que es algo que puede desear.


Esto no responde la pregunta. Si bien el conjunto de tareas (u otros métodos para establecer la afinidad de la tarea) garantizará que un proceso se ejecute solo en el conjunto de núcleos especificado, no garantizará que solo ese proceso se ejecute en esos núcleos. Es decir, el sistema operativo podría programar otros procesos en el núcleo al que ha establecido su afinidad de procesos. En la práctica, esta es la respuesta más útil, pero tenga en cuenta las limitaciones y, en particular, tenga en cuenta que no da lo que pide en 1) "reservar solo un núcleo de CPU solo para mi programa (para obligar al sistema operativo a no use este núcleo de la CPU) "
James Greenhalgh

@JamesGreenhalgh, pero encontrar la manera de establecer la afinidad de la CPU para cada proceso respondería la pregunta. ¿Es posible establecer una afinidad de CPU predeterminada para nuevos procesos, como una opción de kernel (línea cmd)? Eso surtirá efecto al principio del proceso de arranque y afectará a todos los procesos.
jpaugh

De hecho, me perdí la cláusula entre paréntesis sobre evitar que otros procesos se ejecuten en esa CPU. O tal vez pensé que el mayor problema sería asegurarme de que el programa en cuestión se ejecutaría en un solo núcleo, en lugar de cuatro, y que los otros procesos podrían considerarse una molestia, lo que no importaría mucho comparado con eso Pero admito que no tenía una respuesta adecuada a esa parte de la pregunta, aparte de lo que Kamil comentó ahora.
ilkkachu

@jpaugh, creo que incluso entonces no podría aislarse por completo de la posibilidad de que otro proceso se ejecute en "su" núcleo. Por ejemplo, uno que restablezca su propia afinidad, o incluso el propio código del kernel que consuma tiempo no relacionado con la gestión de su proceso. Una vez más, estoy totalmente de acuerdo en que, en la práctica, esta respuesta es lo que la mayoría haría para resolver la mayor parte del problema, ¡pero estaría realmente interesado en leer una respuesta a esa parte final entre paréntesis!
James Greenhalgh
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.