voglio ammend risposte precedenti.
Erlang, o meglio il sistema di runtime Erlang (erts), imposta automaticamente il numero di schedulatori (thread del sistema operativo) e il numero di code di attesa sul numero di elementi di elaborazione sulla piattaforma. Questo è il core del processore o il thread dell'hardware. È possibile modificare queste impostazioni in fase di runtime utilizzando:
erlang:system_flag(schedulers_online, NP) -> PrevNP
I processi di Erlang non ha un'affinità a qualsiasi pianificatori ancora. La logica che bilancia i processi tra gli scheduler segue due regole. 1) Un programmatore affamato ruberà il lavoro da un altro schedulatore. 2) I percorsi di migrazione sono configurati per spingere i processi dagli scheduler con molti processi agli scheduler con meno lavoro.Questo viene fatto per assicurare equità nel conteggio delle riduzioni (tempo di esecuzione) per ogni processo.
Gli schedulatori tuttavia possono essere bloccati su elementi di elaborazione specifici. Questo non è fatto per impostazione predefinita. Per consentire erts fanno l'uso affinità scheduler-> nucleo:
erlang:system_flag(scheduler_bind_type, default_bind) -> PrevBind
diversi altri tipi di legatura possono essere trovati nella documentazione. L'utilizzo dell'affinità può migliorare notevolmente le prestazioni in situazioni di carico pesante! Soprattutto in situazioni di contesa di blocco elevato. Inoltre, il kernel linux non può gestire i hyperthreads per non dire altro. Se hai hyperthreads sulla tua piattaforma dovresti davvero usare questa funzione in erlang.
Sì, ho la sensazione che qualcosa di simile stia succedendo ... –