2014-07-15 11 views
5

Attualmente sto cercando di dividere un'attività di simulazione ad alta intensità di processore in poche centinaia di blocchi elaborati in parallelo in Azure. Ho pensato che i WebSite di Azure che offrono una macchina virtuale dedicata e un WebJob facili da configurare con la loro astrazione facile da usare su una coda di archiviazione si adattassero perfettamente alla mia bolletta.In Azure, perché lo stesso WebJob non funziona su un'unica scala di archiviazione quando si esegue su più siti Web?

Ho la seguente configurazione Azure che viene appena creato da mio codice ogni volta che l'eseguo

  • Un unico di stoccaggio conto
  • coda Uno storage con le descrizioni del lavoro
  • un contenitore di stoccaggio con dati statici
  • Un contenitore di archiviazione per i risultati (file univoci per lavoro)
  • n (ad esempio 8) WebSites "standard", che significa che ci sono n diversi URI * .azurewebsites.net
  • Soltanto WebJob su ciascun sito web funzionamento continuo (8 WebJobs nell'esempio) utilizzando il WebJobs SDK (JobHost)
  • Ogni descrizione del lavoro è < 1k
  • Ogni processo consiste di circa 100k di Blob-input-dati
  • ogni risultato è di circa 100k di Blob-uscita-dati
  • Con la scala della corrente, ogni lavoro viene eseguito per circa un minuto e mezzo

Ecco la firma del lavoro.

public static void RunGeant4Simulation(
    [QueueTrigger("simulationjobs")] JobDescription jobDescription, 
    [Blob("input/{Archive}", FileAccess.Read)] Stream archive, 
    [Blob("result/{Name}-{Energy}-output.zip", FileAccess.Write)] Stream output, 
    [Blob("result/{Name}-{Energy}-log.dat")] TextWriter debug 
) 

Il codice va poi avanti per impostare una, directory specifica professione Sito web locale, estrae l'archivio zip contenente un eseguibile, corre questo eseguibile con Process.Start e scrive l'output catturato al blob. Tutto ciò che l'accesso al processo è disponibile sulla macchina. Il debug TextWriter serve per acquisire le informazioni di temporizzazione all'interno del lavoro.

Quello che mi aspettavo di vedere era che ogni sito Web prendeva un lavoro dalla coda, lo eseguiva, inviava i risultati nel contenitore e prendeva il lavoro successivo.

Quello che sto vedendo è che solo un singolo WebSite sta effettivamente eseguendo dei lavori mentre i restanti sono solo inattivi, sebbene WebJob sia segnalato come avviato e in esecuzione su ciascun sito. Il risultato netto è lo stesso numero di lavori finiti al minuto come con un sito Web. Ecco un registro di una corsa, in cui due WebSite "hanno deciso" di partecipare ai lavori in esecuzione: simulation-log.zip. L'account di archiviazione menzionato nelle stringhe di connessione è già stato eliminato, quindi non ho eliminato le chiavi di accesso dai log.

Ho aggiunto un po 'di strumentazione tempismo per il WebJob e da quel che posso vedere che a volte in esecuzione l'eseguibile richiede il doppio o tre volte (più o meno esattamente) il tempo che ci vuole in un "normale" correre

stopwatch.Start(); 
using (var process = Process.Start(processStartInfo)) 
{ 
    debug.WriteLine("After Starting Process: {0}", DateTime.UtcNow); 
    var outputData = process.StandardOutput.ReadToEnd(); 

    process.WaitForExit(); 

    stopwatch.Stop(); 
    debug.WriteLine("Process Finished: {0} {1}", DateTime.UtcNow, stopwatch.Elapsed); 

    outputBytes = Encoding.UTF8.GetBytes(outputData); 
} 

Il cronometro mostra i tempi 1:15, 2:27, 3:43, ecc. Ma alcuni dei lavori che richiedono più tempo del previsto mostrano anche un tempo previsto per il cronometro. Tuttavia, in entrambi i casi, i lavori su un altro sito Web vengono eseguiti invece e nel contenitore dei risultati dello storage, i risultati vengono visualizzati. Alla fine, il numero di lavori completati al minuto non cambia.

Aggiornamento

Oggi, sono andato un passo avanti e ha creato un account di archiviazione separata per ogni sito web e distribuito i posti di lavoro manualmente tra 8 code a 8 stoccaggio conti ciascuno per uno degli 8 siti web. Ciò significa che dal mio punto di vista esterno, nulla aveva nulla in comune oltre a eseguire lo stesso codice per sbaglio.

Questo ha fatto non aiuto.

Sembra ancora che io abbia un singolo processore che deve eseguire tutti i WebJob su qualsiasi WebSite che creo, indipendentemente da quanto siano indipendenti. Ho creato un'immagine del tempo di CPU, come mostrato nel portale: CPU Time as shown in the portal

+0

Puoi condividere i file di registro in cui mostra che i lavori sono in esecuzione? Hai configurato correttamente le stringhe di connessione per ogni istanza di lavoro? Inoltre, se è possibile condividere del codice, sarebbe fantastico –

+0

I WebJob vengono caricati tramite FTP e il file * .config viene generato al volo contenente la stringa di connessione per l'account di archiviazione appena creato. Una volta che le stringhe di connessione erano sbagliate, il WebJob rimaneva in un ciclo "In attesa di riavvio". – Tragetaschen

risposta

0

Il mio pensiero sui siti web Azure è stato effettivamente sbagliato e per questo mi sono confuso:

in siti web non-free, ci sono due cose che scala completamente indipendente

  • Potenza di calcolo disponibile per tutti quei siti Web (un "ServerFarm" nell'SDK). Ciò significa che selezioni una dimensione della macchina (da piccola a grande) e un numero di quelli ("Istanze") e questi sono responsabili dell'esecuzione di tutti i tuoi siti Web di base o standard.
  • software in esecuzione su un URI come ASP.NET, PHP, o WebJobs

nel mio pensiero, siti web sono stati direttamente collegati alla macchina virtuale (s) che li appoggiano, ma non v'è alcun collegamento diretto.

Ora ho un ServerFarm con n istanze di grandi dimensioni. In questo ServerFarm, ci sono n WebSites. Ogni sito Web dispone di 5 WebJob, in modo che i 4 processori di un'istanza di grandi dimensioni possano essere utilizzati a fondo.

Ora, tutto si adatta come previsto.

Problemi correlati