Domanda

Qualcuno sa se c'è una sorta di 'bilanciamento del carico' nella libreria standard erlang? Cioè, se ho alcuni molto semplici operazioni su una molto grande insieme di dati, l'overhead di costruire un processo per ogni articolo sarà più grande eseguire l'operazione sequenziale. Ma se riesco a bilanciare il lavoro nel 'giusto numero' di processo, esso deve svolgere meglio, quindi sono praticamente chiedendo se c'è un modo semplice per eseguire questa operazione.

A proposito, qualcuno sa se un'applicazione OTP fa un certo tipo di carico equilibrio? Voglio dire, in un'applicazione OTP v'è il concetto di un "processo di lavoro" (come un lavoratore thread Java-ish)?

È stato utile?

Soluzione

Il plists modulo probabilmente fa quello che si vuole. Si tratta essenzialmente di un'implementazione parallela del lists modulo, motivo per essere utilizzato come un rimpiazzo. Tuttavia, è anche possibile controllare come si parallelizza sue operazioni, ad esempio attraverso la definizione di quanti processi di lavoro dovrebbe essere deposto le uova, ecc.

Probabilmente lo faresti calcolando un numero di lavoratori a seconda della lunghezza della lista o il carico del sistema, ecc.

Dal sito web:

  

plists è un rimpiazzo per   elenchi del modulo Erlang, rendendo più   operazioni lista parallela. Può   operare su ogni elemento in parallelo,   per le operazioni di IO-bound, su sottoliste   in parallelo, per sfruttare   macchine multi-core con CPU-bound   operazioni, e attraverso i nodi Erlang,   per parallizing all'interno di un cluster. esso   gestisce gli errori e fallimenti dei nodi. esso   può essere configurato, sintonizzati, e ottimizzato   per ottenere prestazioni ottimali   la riduzione del sovraccarico.

Altri suggerimenti

Vedere moduli pg2 e pool.

pg2:get_closest_pid/1 implementa abbastanza semplice piscina processo distribuito. slave restituisce pid "vicini", ossia processo locale casuale se disponibile, altrimenti casuale processo remoto.

<=> implementa il bilanciamento del carico tra i nodi iniziato con modulo <=>.

Non c'è, a mio avviso, utile strumento di bilanciamento del carico generica otp. E forse è solo utile per avere uno in casi specifici. E 'abbastanza facile da implementare uno voi stessi. plists possono essere utili negli stessi casi. Io non credo in parallelo-biblioteche come un sostituto per la cosa reale. Amdahl perseguiterà per sempre se si cammina su questa strada.

Il giusto numero di processi di lavoro è uguale al numero di scheduler. Questo può variare a seconda di quale altro lavoro è fatto sul sistema. Usa,

erlang:system_info(schedulers_online) -> NS

per ottenere il numero di scheduler.

La nozione di overhead quando inondando il sistema con una grande varietà di processi di lavoro è un po 'difettoso. C'è ambientale con nuovi processi ma non tanto quanto con os-thread. L'overhead principale è messaggio copiatura tra processi, questo può essere alleviato con l'uso di binari in quanto solo il riferimento al binario viene inviato. Con eterms la struttura viene prima expanded poi copiato l'altro processo.

Non c'è modo di prevedere come costo del lavoro meccanicamente senza misurarla per esempio farlo. Alcuni persona deve determinare come partizionare il lavoro per alcune classi di attività. Nella parola di bilanciamento del carico capisco qualcosa di molto diverso da quello nella sua interrogazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top