2014-09-25 34 views
6

Tôi đang sử dụng Máy ảo Windows Azure với Trung tâm dữ liệu Windows Server 2012, trên phiên bản D2 (Phiên bản SSD mới), để giải nén tệp zip 1,8 GB có chứa 51 GB XML tệp đã giải nén. Không cần phải nói, quá trình này có thể được tăng tốc với một đĩa nhanh, đó là lý do mà tôi đang thử nghiệm một trường hợp D2.Hiệu suất đĩa SSD chậm trên Azure VM

Tuy nhiên, hiệu suất đĩa tôi nhận được không ấn tượng, và không đạt đến mong đợi performacne của một đĩa SSD, vì tôi chỉ nhận được khoảng 20-30 MB/s ở tốc độ ghi trung bình.

Chương trình tôi đang sử dụng để giải nén tệp là ứng dụng giao diện điều khiển .NET được phát triển cho mục đích duy nhất này. Mã nguồn như sau:

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(); 
} 

Khi chạy ứng dụng này cục bộ trên máy tính của riêng tôi với ổ SSD, tôi nhận được 180-200 MB/giây liên tục trong suốt quá trình giải nén. Nhưng khi tôi chạy nó trên máy ảo Azure, tôi nhận được hiệu suất tốt (100-150 MB/s) trong 10 giây đầu tiên, và sau đó nó giảm xuống còn khoảng 20 MB/s và ở lại đó, với sự suy giảm định kỳ hơn nữa đến 8-9 MB/s. Nó không cải thiện. Toàn bộ quá trình giải nén mất khoảng 42 phút trên máy ảo Azure, trong khi máy cục bộ của tôi có thể thực hiện nó trong khoảng 10 phút.

Điều gì đang xảy ra ở đây? Tại sao hiệu năng đĩa lại tệ đến vậy? Có phải ứng dụng của tôi đang làm điều gì sai?

Cả cục bộ lẫn trên máy ảo Azure, tệp nén được đặt trên đĩa SSD và tệp được trích xuất vào cùng một đĩa SSD. (Trên Azure VM, Tôi đang sử dụng ổ lưu trữ tạm thời, vì đó là SSD)

Đây là một ảnh chụp màn hình từ Azure VM giải nén file: Azure Virtual Machine disk performance

Chú ý cách hiệu suất là rất tốt tại bắt đầu, nhưng sau đó đột ngột từ chối và không phục hồi. Tôi đoán là có một số bộ nhớ đệm đang diễn ra, và sau đó hiệu suất giảm khi bộ nhớ cache bị mất.

Đây là một ảnh chụp màn hình từ máy tính địa phương của tôi giải nén file: The performance of my local development machine

Việc thực hiện thay đổi một chút nhưng vẫn ở trên 160 MB/s.

Đó là cùng một nhị phân tôi đang sử dụng trên cả hai máy, được biên dịch cho x64 (Không phải AnyCPU). Đĩa SSD tôi có trong máy của tôi khoảng 1,5 năm tuổi, do đó, nó không phải là bất kỳ điều gì mới hoặc đặc biệt. Tôi không nghĩ rằng đó là một vấn đề bộ nhớ, như là trường hợp D2 có khoảng 7 GB RAM, trong khi máy địa phương của tôi có 12 GB. Nhưng 7 GB là đủ, phải không?

Có ai có bất kỳ đầu mối nào về những gì đang xảy ra không?

Cảm ơn bạn rất nhiều vì đã giúp đỡ.

Added
tôi đã cố gắng theo dõi việc sử dụng bộ nhớ khi làm việc khai thác, và những gì tôi nhận thấy rằng khi ứng dụng bắt đầu, dung lượng bộ nhớ thay đổi đã phát nổ và chỉ tiếp tục tăng trưởng. Trong khi nó đã làm điều đó, hiệu suất được báo cáo bởi ứng dụng của tôi là rất lớn (100+ MB/s). Sau đó, bộ nhớ đã sửa đổi bắt đầu co lại (Mà, theo như tôi biết, có nghĩa là bộ nhớ đang được flushed vào đĩa), hiệu suất giảm ngay lập tức đến 20-30 MB/s. Một vài lần, hiệu suất thực sự được cải thiện, và tôi có thể thấy rằng khi nó đã làm, việc sử dụng bộ nhớ đã sửa đổi tăng lên.Khoảnh khắc sau đó, hiệu suất lại giảm xuống, và tôi có thể thấy rằng lượng bộ nhớ đã sửa đổi giảm. Vì vậy, có vẻ như việc xả dữ liệu vào đĩa gây ra các vấn đề về hiệu suất ứng dụng của tôi. Nhưng tại sao? Và làm thế nào tôi có thể giải quyết vấn đề này?

Added
Được rồi, vì vậy tôi cố gắng gợi ý của David và chạy các ứng dụng trên một ví dụ D14, và tôi đã nhận hiệu suất đĩa thực sự tốt bây giờ, ổn định 180-200 + MB/s. Tôi sẽ tiếp tục thử nghiệm trên các kích thước khác nhau của các cá thể và xem mức độ thấp mà tôi có thể tiếp tục và vẫn nhận được hiệu suất đĩa tốt. Nó vẫn chỉ có vẻ lạ rằng tôi đã có hiệu suất đĩa tệ hại như vậy trên một máy ảo với một đĩa SSD địa phương, như tôi đã nhận với trường hợp D2.

+0

Điều này sẽ được đăng lên ServerFault chứ không phải Stackoverflow. –

+0

Bạn có thể đúng. Tôi đăng nó ở đây bởi vì tôi nghi ngờ nó là ứng dụng của tôi mà là vấn đề, không phải bất kỳ phần cứng hoặc thiết lập trên máy chủ. –

+2

Vâng ... Tôi đã biết, nếu mã của bạn hoạt động tốt tại địa phương, nhưng cho thấy vấn đề giảm tốc độ khi chạy trong một máy ảo D-class, nó là một cái gì đó cụ thể cho các đặc điểm VM. Nhân tiện: Trong khi bạn đang điều tra, hãy thử chạy thử bằng máy ảo lớn nhất (D14) để loại bỏ các vấn đề ồn ào. –

Trả lời

0

Tệp nằm ở đâu? C: hoặc D: D series VM chỉ có ổ D tạm thời là SSD. tất cả các đĩa khác là các ổ đĩa bình thường.

Nếu bạn cần đĩa đính kèm làm ổ đĩa khác thì bạn cần phải truy cập tài khoản lưu trữ cao cấp trong bản xem trước cùng với máy ảo dòng G.

Cảm ơn, Subodh

Các vấn đề liên quan