Lavorando sul presupposto che il tempo di download (e quindi l'utilizzo della larghezza di banda) sia il tuo fattore limitante, darei i seguenti suggerimenti:
Innanzitutto, scegli le istanze m1.large. Dei tre "livelli" delle prestazioni I / O (che include la larghezza di banda), le istanze m1.large e m1.xlarge offrono entrambe prestazioni I / O "elevate". Poiché il tuo compito non è associato alla CPU, la scelta meno costosa sarà quella preferibile.
In secondo luogo, la tua istanza sarà in grado di scaricare molto più velocemente di quanto qualsiasi sito possa pubblicare pagine - non scaricare una singola pagina alla volta su una determinata istanza, esegui l'attività contemporaneamente - dovresti essere in grado di fare almeno 20 pagine contemporaneamente (anche se , Immagino che probabilmente puoi fare 50-100 senza difficoltà). (Prendi l'esempio del download da un forum dal tuo commento, ovvero una pagina dinamica che impiegherà del tempo a generare il server, e ci sono altri utenti che utilizzano quella larghezza di banda dei siti, ecc.). Continuare ad aumentare la concorrenza fino a raggiungere i limiti della larghezza di banda dell'istanza. (Naturalmente, non effettuare più richieste simultanee allo stesso sito).
Se stai davvero cercando di massimizzare le prestazioni, potresti prendere in considerazione l'avvio di istanze in zone geograficamente appropriate per ridurre al minimo la latenza (ma ciò richiederebbe la geolocalizzazione di tutti i tuoi URL, il che potrebbe non essere pratico).
Una cosa da notare è che la larghezza di banda dell'istanza è variabile, a volte otterrai prestazioni più elevate e altre volte otterrai prestazioni inferiori. Nelle istanze più piccole, la variazione delle prestazioni è più significativa perché i collegamenti fisici sono condivisi da più server e uno di questi può ridurre la larghezza di banda disponibile. Tra m1.large istanze, all'interno della rete EC2 (stessa zona di disponibilità), dovresti avvicinarti alla velocità teorica di gigabit.
In generale, con AWS, è quasi sempre più efficiente andare con un'istanza più grande rispetto a più istanze più piccole (a meno che non si stia guardando specificamente qualcosa come il failover, ecc. Dove sono necessarie più istanze).
Non so che cosa implica la tua configurazione, ma quando ho già tentato in precedenza (tra 1 e 2 milioni di collegamenti, aggiornati periodicamente), il mio approccio era quello di mantenere un database dei collegamenti aggiungendo nuovi collegamenti quando venivano trovati e processi di fork per raschiare e analizzare le pagine. Un URL verrà recuperato (in modo casuale) e contrassegnato come in corso nel database, lo script scaricherà la pagina e, in caso di successo, contrassegnerà l'URL come scaricato nel database e invierà il contenuto a un altro script che ha analizzato la pagina, nuovi collegamenti sono stati aggiunti al database così come sono stati trovati. Il vantaggio del database qui era la centralizzazione: più script potevano interrogare il database contemporaneamente e (fino a quando le transazioni erano atomiche) si poteva essere certi che ogni pagina sarebbe stata scaricata una sola volta.
Un paio di ulteriori punti di menzione - ci sono limiti (credo 20) sul numero di istanze su richiesta che puoi eseguire contemporaneamente - se prevedi di superare tali limiti, dovrai richiedere AWS per aumentare il tuo account limiti. Sarebbe molto più economico per te eseguire istanze spot e aumentare i tuoi numeri quando il prezzo spot è basso (forse un'istanza su richiesta per mantenere tutto organizzato e le rimanenti istanze spot).
Se il tempo ha una priorità maggiore rispetto al costo, le istanze di calcolo del cluster offrono una larghezza di banda di 10 Gbps e dovrebbero produrre la massima larghezza di banda per il download.
Ricapitolando: prova alcune istanze di grandi dimensioni (anziché molte piccole istanze) ed esegui più download simultanei su ciascuna istanza: aggiungi più istanze se la larghezza di banda è limitata, passa a istanze più grandi se ti trovi associato a CPU / memoria.