Quiero ammend respuestas anteriores.
Erlang, o más bien el sistema de tiempo de ejecución Erlang (erts), predetermina el número de programadores (subprocesos del sistema operativo) y el número de runqueues a la cantidad de elementos de procesamiento en su plataforma. Eso son núcleos de procesadores o hilos de hardware. Puede cambiar estos parámetros en tiempo de ejecución usando:
erlang:system_flag(schedulers_online, NP) -> PrevNP
Los procesos Erlang no tiene afinidad con cualquier programadores todavía. La lógica que equilibra los procesos entre los programadores sigue dos reglas. 1) Un programador hambriento robará trabajo de otro planificador. 2) Las rutas de migración están configuradas para enviar procesos de programadores con muchos procesos a planificadores con menos trabajo.Esto se hace para asegurar la equidad en el conteo de reducción (tiempo de ejecución) para cada proceso.
Los programadores, sin embargo, se pueden bloquear con elementos de procesamiento específicos. Esto no se hace por defecto. Para permitir que Erts hacen la scheduler-> núcleo afinidad uso:
erlang:system_flag(scheduler_bind_type, default_bind) -> PrevBind
Varios otros tipos de vinculación se pueden encontrar en la documentación. ¡Usar afinidad puede mejorar enormemente el rendimiento en situaciones de carga pesada! Especialmente en situaciones de contención de bloqueo alto. Además, el kernel de Linux no puede manejar hyperthreads por decir lo menos. Si tienes hyperthreads en tu plataforma, deberías usar esta característica en erlang.
Sí, tengo la sensación de que algo en esta línea está sucediendo ... –