Contrariamente al consejo de algunos de los otros encuestados, para algunos sistemas (sin duda el comercio de alta frecuencia y sin duda muchos otros sistemas de muy baja latencia como los motores de búsqueda), vinculando un hilo a un núcleo de CPU (o hiper núcleos ranurados, un único subproceso de CPU) puede tener enormes beneficios de rendimiento.
La vista ingenua pero cada vez más rechazada es que el aumento de los hilos (dentro de lo razonable) aumenta el rendimiento para dichos sistemas. Sin embargo, la evidencia aumenta que cuando se diseñan correctamente, las soluciones que utilizan muy pocos subprocesos para la mayoría del procesamiento pueden superar considerablemente las soluciones de alta concurrencia, a veces por factores de diez o incluso cien.
La razón principal de esto es el cambio de contexto. La conmutación de contexto es el proceso en el que una CPU vacía su entorno de trabajo para que cache la RAM actual (si tiene suerte) o RAM principal (si no lo está), y lee en el entorno de trabajo para el siguiente subproceso: y es una de las operaciones más caras que puede realizar un sistema de baja latencia.
Si desea minimizar el cambio de contexto donde la baja latencia es primordial, ciertos procesos críticos pueden estar mejor restringidos a un único núcleo o subproceso de CPU. Cuando es necesario que varios hilos lean o escriban datos que se gestionan mediante esos procesos críticos restringidos por hilos, es posible que desee ver el patrón "Disruptor", que utiliza un buffer de anillo más una serie de trucos inteligentes para permitir que sea muy rápido. acceso a datos compartidos, mientras que casi nunca requiere un bloqueo exclusivo de esos datos (vinculado a continuación).
Para realizar tareas de afinidad de subprocesos (CPU binding) de manera independiente del sistema operativo en Java, puede utilizar la biblioteca de subprocesos Java Thread Affinity de Peter Lawrey, también enlazada a continuación. También tenga en cuenta el ejemplo en el que Peter vincula un hilo de lectura a un hiper hilo de un núcleo hiperhilado y un hilo de escritor al otro, un truco que podría tener beneficios apreciables (aunque no lo he probado).
Barney
http://lmax-exchange.github.io/disruptor/
https://github.com/peter-lawrey/Java-Thread-Affinity/wiki/How-it-works
¿Seguro que quieres hacer esto? En muchos casos, es mejor dejar que el SO y/o JVM tomen decisiones de programación. –
Es más para fines de prueba que quiero hacerlo. – user381261