2014-09-25 14 views
6

Utilizzo una macchina virtuale Windows Azure con Windows Server 2012 Datacenter, su un'istanza D2 (Le nuove istanze SSD), per decomprimere un file zip da 1,8 GB, contenente un XML da 51 GB file decompresso. Inutile dire che questo processo può essere velocizzato con un disco veloce, motivo per cui sto testando un'istanza D2.Prestazioni del disco SSD lento su VM Azure

Tuttavia, le prestazioni del disco che sto ottenendo non sono impressionanti, e non sono all'altezza dell'aspettativa attesa di un disco SSD, dato che ottengo in media solo 20-30 MB/s in velocità di scrittura.

Il programma che sto utilizzando per decomprimere il file è un'app per console .NET personalizzata sviluppata per questo solo scopo. Il codice sorgente è la seguente:

static void Main(string[] args) 
{ 
    if (args.Count() < 1) 
    { 
     Console.WriteLine("Missing file parameter."); 
     return; 
    } 

    string zipFilePath = args.First(); 
    if (!File.Exists(zipFilePath)) 
    { 
     Console.WriteLine("File does not exist."); 
     return; 
    } 

    string targetPath = Path.GetDirectoryName(zipFilePath); 

    var start = DateTime.Now; 
    Console.WriteLine("Starting extraction (" + start.ToLongTimeString() + ")"); 
    var zipFile = new ZipFile(zipFilePath); 
    zipFile.UseZip64 = UseZip64.On; 
    foreach (ZipEntry zipEntry in zipFile) 
    { 
     byte[] buffer = new byte[4096];  // 4K is optimum 
     Stream zipStream = zipFile.GetInputStream(zipEntry); 

     String entryFileName = zipEntry.Name; 
     Console.WriteLine("Extracting " + entryFileName + " ..."); 
     String fullZipToPath = Path.Combine(targetPath, entryFileName); 
     string directoryName = Path.GetDirectoryName(fullZipToPath); 
     if (directoryName.Length > 0) 
     { 
      Directory.CreateDirectory(directoryName); 
     } 

     // Unzip file in buffered chunks. This is just as fast as unpacking to a buffer the full size 
     // of the file, but does not waste memory. 
     // The "using" will close the stream even if an exception occurs. 
     long dataWritten = 0; 
     long dataWrittenSinceLastOutput = 0; 
     const long dataOutputThreshold = 100 * 1024 * 1024; // 100 mb 
     var timer = System.Diagnostics.Stopwatch.StartNew(); 
     using (FileStream streamWriter = File.Create(fullZipToPath)) 
     { 
      bool moreDataAvailable = true; 
      while (moreDataAvailable) 
      { 
       int count = zipStream.Read(buffer, 0, buffer.Length); 
       if (count > 0) 
       { 
        streamWriter.Write(buffer, 0, count); 
        dataWritten += count; 
        dataWrittenSinceLastOutput += count; 
        if (dataWrittenSinceLastOutput > dataOutputThreshold) 
        { 
         timer.Stop(); 
         double megabytesPerSecond = (dataWrittenSinceLastOutput/timer.Elapsed.TotalSeconds)/1024/1024; 
         Console.WriteLine(dataWritten.ToString("#,0") + " bytes written (" + megabytesPerSecond.ToString("#,0.##") + " MB/s)"); 
         dataWrittenSinceLastOutput = 0; 
         timer.Restart(); 
        } 
       } 
       else 
       { 
        streamWriter.Flush(); 
        moreDataAvailable = false; 
       } 
      } 

      Console.WriteLine(dataWritten.ToString("#,0") + " bytes written"); 
     } 
    } 

    zipFile.IsStreamOwner = true; // Makes close also shut the underlying stream 
    zipFile.Close(); // Ensure we release resources 

    Console.WriteLine("Done. (Time taken: " + (DateTime.Now - start).ToString() +")"); 
    Console.ReadKey(); 
} 

Quando si esegue l'applicazione a livello locale sulla mia macchina con un disco SSD, ottengo 180-200 MB/s in termini di prestazioni costantemente durante l'intero processo di decompressione. Ma quando lo eseguo su Azure VM, ottengo buone prestazioni (100-150 MB/s) i primi 10 secondi circa, e poi diminuisce a circa 20 MB/se rimane lì, con ulteriore calo periodico a 8-9 MB/s. Non migliora L'intero processo di decompressione richiede circa 42 minuti sulla macchina virtuale di Azure, mentre la mia macchina locale può farlo in circa 10 minuti.

Cosa sta succedendo qui? Perché le prestazioni del disco sono così negative? È la mia applicazione che sta facendo qualcosa di sbagliato?

Sia localmente che sulla macchina virtuale di Azure, il file zip viene inserito nel disco SSD e il file viene estratto nello stesso disco SSD. (Sul Azure VM, sto utilizzando l'unità temporanea bagagli, come quello è lo SSD)

Ecco uno screenshot dal Azure VM estrarre il file: Azure Virtual Machine disk performance

Notate come la performance è grande a l'inizio, ma poi improvvisamente diminuisce e non si riprende. La mia ipotesi è che ci sia del caching in corso, e poi le prestazioni diminuiscono quando manca la cache.

Ecco uno screenshot dalla mia macchina locale l'estrazione del file: The performance of my local development machine

Le prestazioni variano un po ', ma rimane al di sopra di 160 MB/s.

È lo stesso binario che sto usando su entrambe le macchine, che è compilato per x64 (non AnyCPU). Il disco SSD che ho nella mia macchina ha circa 1,5 anni, quindi non è niente di nuovo o speciale. Non penso che sia un problema di memoria, poiché l'istanza D2 ha circa 7 GB di RAM, mentre la mia macchina locale ha 12 GB. Ma 7 GB dovrebbero essere sufficienti, non dovrebbe?

Qualcuno ha idea di cosa sta succedendo?

Grazie mille per qualsiasi aiuto.

Aggiunto
ho provato monitorare l'utilizzo della memoria, mentre facendo l'estrazione, e quello che ho notato è che quando l'applicazione è stata avviata, la quantità di memoria modificata esploso e continuava a crescere. Mentre lo faceva, le prestazioni riportate dalla mia applicazione erano fantastiche (oltre 100 MB/s). Poi la memoria modificata ha iniziato a ridursi (il che, per quanto ne so, significa che la memoria viene scaricata su disco), le prestazioni sono diminuite immediatamente a 20-30 MB/s. Un po 'di volte, le prestazioni sono migliorate e ho notato che, quando si è verificato, l'utilizzo della memoria modificata è aumentato.Qualche istante dopo, la performance è diminuita di nuovo, e ho potuto vedere che la quantità di memoria modificata è diminuita. Quindi sembra che lo svuotamento dei dati sul disco stia causando problemi di prestazioni dell'applicazione. Ma perché? E come posso risolvere questo?

Aggiunto
Va bene, così ho provato il suggerimento di David e corse l'applicazione su un'istanza D14, e mi sono davvero buone prestazioni del disco ora, costante 180-200 + MB/s. Continuerò a provare su diverse dimensioni di istanze e vedrò quanto posso scendere e ottenere comunque buone prestazioni del disco. Sembra ancora strano che abbia ottenuto prestazioni del disco così pessime su una VM con un disco SSD locale, come ho ottenuto con l'istanza D2.

+0

Questo dovrebbe essere pubblicato a ServerFault, non StackOverflow. –

+0

Potresti avere ragione. L'ho pubblicato qui perché sospettavo che fosse la mia applicazione il problema, non l'hardware o l'installazione sul server. –

+2

Bene ... Ho pensato che, se il codice funziona bene localmente, ma mostra il problema del deterioramento della velocità durante l'esecuzione in una VM di classe D, è qualcosa di specifico per le caratteristiche della macchina virtuale. A proposito: mentre stai indagando, prova un test-run usando la VM (D14) più grande, per eliminare i problemi di rumore vicino. –

risposta

0

Dove si trova il file? C: o D: L'unità temporanea D della VM serie D è SSD. tutti gli altri dischi sono unità normali.

Se è necessario un disco collegato come altra unità, è necessario disporre di un account di archiviazione premium che in anteprima insieme alla VM serie G.

Grazie, Subodh