2013-03-18 33 views
8

Khi trang web được truy cập bởi một vài người dùng đầu tiên, hiệu suất rất chậm.Windows Azure chậm trên một vài yêu cầu đầu tiên

Thiết lập Windows Azure đang sử dụng IIS 7.0 để mô-đun khởi tạo khởi động không phải là một tùy chọn.

Có cách nào để "khởi động" trang web để tốc độ hiệu suất này không phải là vấn đề không?

Tôi đã xem xét điều này: Controlling Application Pool Idle Timeouts in Windows Azure, nhưng không chắc chắn nếu điều này vẫn sẽ gây ra một vấn đề khi Azure tái sử dụng các hồ bơi ứng dụng mỗi 29 giờ khoảng.

UPDATE:

Việc triển khai là 1 vai trò web có chứa nhiều trang web. Có thể thực hiện việc biên dịch trước cho việc này không? hoặc sử dụng vai trò web như được đề xuất trong một trong các câu trả lời dưới đây?

EDIT:

Như @Igorek đã nêu dưới đây liên quan đến sử dụng Vai trò web tự động tải bản thân trong quá trình khởi động Vai trò của mà có thể trong thiết lập tôi có. Có ai có một ví dụ về làm thế nào để đạt được điều này?

+0

làm thế nào về việc có một tập lệnh curl hoặc wget nhấn một số url trong trang web của bạn? – rene

+0

@rene Điều này có phù hợp với một ứng dụng có số lượng lớn (hàng nghìn?) Các trang, mỗi trang có một số đường dẫn mã không? –

+0

@flem Tôi đoán không ... nhưng tôi đã không đọc điều đó trong câu hỏi ... giả sử nguyên nhân gốc rễ của vấn đề chủ yếu liên quan đến việc lấy đồ từ đĩa trong bộ nhớ (hội đồng, chỉ mục/bảng) bạn có thể có một vài url đảm bảo tất cả các thành phần đều được nhấn. Tôi không nói nó dễ dàng hay đơn giản. – rene

Trả lời

5

Tôi đã xem xét điều này: Kiểm soát hồ sơ ứng dụng nhàn rỗi Timeout trong Windows Azure, nhưng không chắc chắn nếu điều này vẫn sẽ gây ra một vấn đề khi Azure tái sử dụng hồ bơi ứng dụng mỗi 29 giờ khoảng.

Nó sẽ không gây ra vấn đề khi Azure tái tạo nhóm ứng dụng, nhưng bạn cũng có thể thêm vào nhiệm vụ khởi động đó để ngăn chặn/tăng thời gian tái chế hồ bơi của ứng dụng.

Hãy thử điều này:

Xác định nhiệm vụ trong bạn ServiceDefinition:

<Startup> 
    <Task commandLine="startup\disableTimeout.cmd" executionContext="elevated" /> 
</Startup> 

Sau đó có file cmd của bạn với đoạn mã sau (chỉ cần đặt nó vào notepad, sau đó lưu như một tập tin .cmd):

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00 

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.recycling.periodicRestart.time:00:00:00 

Hai điều cần đảm bảo là:

1) Đảm bảo bạn lưu tệp bằng mã hóa ANSI.
2) Khi bạn đã thêm tập lệnh đó vào Visual Studio, hãy đảm bảo bạn chọn "Sao chép Luôn luôn" làm tùy chọn "Sao chép vào Thư mục Đầu ra" trong thuộc tính.

2

Bạn có đang biên dịch trước ứng dụng không? Theo mặc định, ứng dụng sau khi được triển khai vẫn cần được biên dịch lần đầu tiên. Tùy thuộc vào kích thước của ứng dụng, việc biên dịch có thể mất nhiều giây http://msdn.microsoft.com/en-us/library/399f057w(v=vs.85).aspx

+0

Tôi đã xem xét liên kết bạn cung cấp và xem xét sử dụng công cụ aspnet_compiler. Tôi có nhiều trang web với nhiều thư mục mà tôi cần phải sử dụng công cụ này cho. Bạn đã sử dụng nó chưa? Tôi có thể hỏi một câu hỏi khác về công cụ này. – 97ldave

+0

Thành thật mà nói, tôi khuyên bạn nên đảm bảo rằng ứng dụng của bạn không chậm trong các yêu cầu đầu tiên sau khi được triển khai, hãy sử dụng các Vai trò Web tự động tải trong khi khởi động của Vai trò. Nó sẽ dễ dàng hơn. – Igorek

+0

Vâng, cần đảm bảo ứng dụng không chậm vì mất tối đa 30 giây cho các yêu cầu đầu tiên sau khi được triển khai và khi Azure quyết định tái chế máy. – 97ldave

2

Khi yêu cầu HTTP đầu tiên đến được nhiều công việc thực sự được thực hiện - bắt đầu ứng dụng, tất cả các hội đồng cần thiết được tìm thấy, tất cả các gói được gửi dưới dạng MSIL được biên dịch thành mã máy, sau đó các khung nhìn ASP.NET cần thiết được biên dịch sẵn (trừ khi bạn triển khai chúng biên dịch sẵn, nhưng nó khá khó với các công cụ Azure, vì vậy tôi đoán bạn không làm điều đó). Tất cả điều này mất một thời gian và do đó những người dùng đầu tiên không may mắn phải đợi.

Cách khắc phục là làm nóng trang web từ điểm nhập vai bên trong OnStart() - làm cho nó biên dịch trước trang web và sau đó gửi yêu cầu HTTP đến máy chủ cục bộ.

0

câu trả lời của mattytommo hoạt động hoàn toàn tốt, nhưng tôi thích đạt được mục tiêu tương tự bằng chương trình thay vì dựa vào tệp cmd. Bạn có thể thực hiện theo 3 bước:

Bước 1: Bạn phải cài đặt gói NuGet Microsoft.Web.Administration. Gói chứa thư viện cần thiết để kiểm soát IIS từ mã ứng dụng của bạn.

Bước 2: Sau đó, bạn chỉ cần thêm một cuộc gọi đến phương thức này từ RoleEntryPoint của Role Web. Nếu nó không tồn tại, chỉ cần thêm một lớp kế thừa từ RoleEntryPoint.

private void ConfigureAppPools() 
{ 
    using (ServerManager serverManager = new ServerManager()) 
    { 
     foreach (var appPool in serverManager.ApplicationPools) 
     { 
      appPool.ProcessModel.IdleTimeout = TimeSpan.Zero; 
      appPool.Recycling.PeriodicRestart.Time = TimeSpan.Zero; 
     } 
     serverManager.CommitChanges(); 
    } 
} 

Mã này chỉ định cấu hình tất cả các hồ bơi ứng dụng trên máy để không bao giờ tái chế hoặc hết thời gian chờ.

Bước 3: Để làm việc này, nó cũng là cần thiết để thêm một dòng này để ServiceDefinition.csdef:

<WebRole name="YourWebRoleName" vmsize="ExtraSmall"> 
    ... 
    <Runtime executionContext="elevated" /> 
    ... 
    </WebRole> 

Điều này đảm bảo web của bạn RoleEntryPoint của OnStart() phương pháp được thực hiện với các điều khoản cao . Các phần khác của mã của bạn sẽ không bị ảnh hưởng, do đó, đó không phải là vấn đề từ quan điểm bảo mật.

Đó là tất cả. Vấn đề với tải chậm hiện đã được giải quyết :)

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