Come si può prevedere il tempo necessario per la comunicazione di due processi in due macchine diverse in un cluster?

1

Sto cercando di sviluppare un'applicazione di elaborazione che richiede molta memoria (> 500 gb). Acquistare una singola macchina è troppo costoso. Tuttavia, posso acquistare ~ 100 piccole istanze su Digital Ocean o simili, dividere la memoria in blocchi e utilizzare TCP per emulare memoria condivisa tra le istanze.

Ora, la mia domanda è: come posso misurare / prevedere il tempo necessario per due processi in due macchine diverse come quella di condividere informazioni, rispetto a IPC e memoria condivisa? Ci sono regole pratiche? Non voglio i valori esatti, ma sapere più o meno quanto più velocemente uno sarebbe molto utile per visualizzare la fattibilità di questo approccio.

    
posta MaiaVictor 08.06.2014 - 06:24
fonte

2 risposte

5

Questo suona strano, il ritardo della rete IO cancellerebbe la maggior parte dei vantaggi nell'accesso ai dati della memoria su una singola macchina. Mi chiedo se il tuo approccio sarebbe addirittura più veloce di acquistare una singola macchina con molti SSD da eseguire come memoria virtuale, o persino macchina in esecuzione su memoria virtuale utilizzando un normale HDD.

In secondo luogo, è necessario ridisegnare la logica prima di trasformare il sistema in un sistema distribuito. Non è possibile dividerne uno grande in uno più piccolo e quindi renderlo più piccolo in modo strettamente accoppiato tramite rete. L'accoppiamento e la condivisione dovrebbero avvenire solo sui risultati finali (o risultati intermedi speciali sufficientemente completi da rimanere nel file system). Non risultati così intermedi e temporanei da rimanere (o restare) in memoria.

    
risposta data 08.06.2014 - 07:17
fonte
4

Il primo passo per l'analisi di ordine di grandezza è il primo passo.

Prende (nominalmente) un'istruzione per accedere a una parola di memoria locale. Supponendo che ci vogliono 1000 istruzioni per formattare il pacchetto TCP / IP e accodarlo per la trasmissione, e altre 1000 istruzioni all'estremità per ricevere, dequeue e interpretarlo, e rendersi conto che un "accesso" richiede due pacchetti, uno in in ogni direzione, stai parlando di un minimo di 4000 istruzioni per accesso.

A quel punto, il tuo screamer Intel a 4 GHz è, su accessi non locali, come circa un 8086 a 4 MHz.

Questo è prima di considerare il sovraccarico della rete. Supponendo 100 macchine fisiche ("istanze"), supponendo di 16 porte router, sono necessari 8 router: uno al centro di una stella, connesso agli altri sette, con ciascuno di quelli connessi a circa 16 macchine. Supponendo che gli accessi non locali siano distribuiti uniformemente, ogni accesso non locale richiederà tre hop di router: uno al router locale, uno al centro stella, uno al router locale. (Poiché si presuppone una distribuzione uniforme, solo circa 1/7 dei tuoi accessi sarà a una macchina che condivide il router locale. Per un'analisi di primo ordine, puoi ignorare quella fortunata interruzione.) Perché devi andare avanti e indietro, Stai parlando di 6 hop di router e 4000 istruzioni, NON INCLUSO LE OPERAZIONI DI ROUTER, per eseguire un accesso non locale.

L'analisi di ordine di grandezza di primo ordine del primo ordine sembrerebbe indicare che la tua applicazione morirà di vecchiaia in attesa di pacchetti nelle code del router.

    
risposta data 08.06.2014 - 16:30
fonte