Làm cách nào để cải thiện hiệu năng ứng dụng ASP.NET MVC?


Câu trả lời:


311

Dưới đây là danh sách tổng hợp các nguồn cải tiến có thể:

Chung

  • Sử dụng một trình lược tả để khám phá các rò rỉ bộ nhớ và các vấn đề về hiệu năng trong ứng dụng của bạn. cá nhân tôi đề nghị dotTrace
  • Chạy trang web của bạn ở chế độ Phát hành, không phải chế độ Gỡ lỗi, khi đang sản xuất và cả trong quá trình định hình hiệu suất. Chế độ phát hành nhanh hơn nhiều. Chế độ gỡ lỗi có thể ẩn các vấn đề về hiệu suất trong mã của riêng bạn.

Bộ nhớ đệm

  • Sử dụng CompiledQuery.Compile() đệ quy tránh biên dịch lại các biểu thức truy vấn của bạn
  • Bộ nhớ cache không dễ thay đổi nội dung bằng cách sử dụng OutputCacheAttribute để lưu các thực thi không cần thiết và hành động
  • Sử dụng cookie cho thông tin không nhạy cảm thường xuyên truy cập
  • Sử dụng ETags và hết hạn - Viết ActionResultphương thức tùy chỉnh của bạn nếu cần thiết
  • Cân nhắc sử dụng RouteNameđể tổ chức các tuyến đường của bạn và sau đó sử dụng nó để tạo các liên kết của bạn và cố gắng không sử dụng phương thức ActionLink dựa trên cây biểu thức.
  • Xem xét thực hiện chiến lược bộ nhớ đệm giải quyết tuyến đường
  • Đặt mã lặp đi lặp lại bên trong của bạn PartialViews, tránh hiển thị nó xxxx lần: nếu cuối cùng bạn gọi cùng một phần 300 lần trong cùng một chế độ xem, có thể có điều gì đó không đúng với điều đó. Giải thích và Điểm chuẩn

định tuyến

Bảo vệ

  • Sử dụng Xác thực mẫu, Giữ dữ liệu nhạy cảm thường xuyên truy cập của bạn trong vé xác thực

DAL

Cân bằng tải

  • Sử dụng proxy ngược, để phân tán tải khách trên toàn bộ ứng dụng của bạn. (Stack Overflow sử dụng HAProxy ( MSDN ).

  • Sử dụng Bộ điều khiển không đồng bộ để thực hiện các hành động phụ thuộc vào xử lý tài nguyên bên ngoài.

Phía khách hàng

  • Tối ưu hóa phía khách hàng của bạn, sử dụng một công cụ như YSlow cho các đề xuất để cải thiện hiệu suất
  • Sử dụng AJAX để cập nhật các thành phần của giao diện người dùng của bạn, tránh cập nhật toàn bộ trang khi có thể.
  • Xem xét triển khai kiến ​​trúc pub-sub -ie Comet- để phân phối nội dung chống lại tải lại dựa trên thời gian chờ.
  • Di chuyển biểu đồ và logic tạo biểu đồ sang phía máy khách nếu có thể. Tạo đồ thị là một hoạt động đắt tiền. Trì hoãn phía máy khách của bạn khỏi một gánh nặng không cần thiết và cho phép bạn làm việc với các biểu đồ cục bộ mà không cần đưa ra yêu cầu mới (ví dụ: biểu đồ Flex, jqbargraph , MoreJqueryCharts ).
  • Sử dụng CDN cho các tập lệnh và nội dung phương tiện để cải thiện tải ở phía máy khách (ví dụ: Google CDN )
  • Thu nhỏ - Biên dịch - JavaScript của bạn để cải thiện kích thước tập lệnh của bạn
  • Giữ kích thước cookie nhỏ, vì cookie được gửi đến máy chủ theo mọi yêu cầu.
  • Cân nhắc sử dụng DNS và Liên kết tìm nạp trước khi có thể.

Cấu hình Toàn cầu

  • Nếu bạn sử dụng Dao cạo, hãy thêm mã sau vào global.asax.cs của bạn, theo mặc định, Asp.Net MVC hiển thị với công cụ aspx và công cụ dao cạo. Điều này chỉ sử dụng RazorViewEngine.

    ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine());

  • Thêm gzip (nén HTTP) và bộ đệm tĩnh (hình ảnh, css, ...) trong web.config của bạn <system.webServer> <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/> </system.webServer>

  • Loại bỏ các mô-đun HTTP không sử dụng
  • Xóa HTML của bạn ngay khi được tạo (trong web.config) và vô hiệu hóa viewstate nếu bạn không sử dụng nó <pages buffer="true" enableViewState="false">

6
chờ đã, ý bạn là tôi sẽ mất hiệu suất khi tôi có một chế độ hiển thị kết quả được đặt bằng cách kích thích thông qua IList và gọi Render.PartialView ("Hàng", mục) cho từng mục danh sách? tôi mất bao nhiêu hoặc làm thế nào tôi có thể đo lường hiệu suất đạt được?
marc.d

@SDReyes - ý nghĩa của kiến trúc pub-sub là gì?
Mohammed Zameer

1
Điều này thật tuyệt Liên kết Uber Profiler đã chết. Thay vào đó, điều này có nên được liên kết với một trong các trình biên dịch cụ thể ORM không?
shanabus

12

Gợi ý cơ bản là tuân theo các nguyên tắc REST và các điểm sau đây liên kết một số nguyên tắc này với khung công tác ASP.NET MVC:

  1. Hãy điều khiển của bạn không quốc tịch - đây là chi tiết của một ' Web hiệu suất / khả năng mở rộng' gợi ý (như trái ngược với hiệu suất tốt nghiệp / Thực máy vi) và một quyết định thiết kế chính sẽ ảnh hưởng đến tương lai ứng dụng của bạn - đặc biệt là trong trường hợp nó trở nên phổ biến hoặc nếu bạn cần một số khả năng chịu lỗi chẳng hạn.
    • Không sử dụng phiên
    • Không sử dụng tempdata - sử dụng phiên
    • Đừng cố gắng 'lưu trữ' mọi thứ 'sớm'.
  2. Sử dụng xác thực mẫu
    • Giữ dữ liệu nhạy cảm thường xuyên truy cập của bạn trong vé xác thực
  3. Sử dụng cookie cho thông tin không nhạy cảm thường xuyên truy cập
  4. Làm cho tài nguyên của bạn được lưu trữ trên web
  5. Biên dịch JavaScript của bạn. Cũng có thư viện trình biên dịch đóng để làm điều đó (chắc chắn có những thư viện khác, chỉ cần tìm kiếm 'trình biên dịch JavaScript' )
  6. Sử dụng CDN (Mạng phân phối nội dung) - đặc biệt đối với các tệp phương tiện lớn của bạn, v.v.
  7. Xem xét các loại lưu trữ khác nhau cho dữ liệu của bạn, ví dụ: tệp, lưu trữ khóa / giá trị, v.v. - không chỉ SQL Server
  8. Cuối cùng nhưng không kém phần quan trọng, hãy kiểm tra hiệu suất trang web của bạn

10

Code Climbermục blog này cung cấp các cách chi tiết để tăng hiệu suất của ứng dụng.

Truy vấn biên dịch sẽ tăng hiệu năng của ứng dụng của bạn, nhưng nó không có gì chung với ASP.NET MVC. Nó sẽ tăng tốc mọi ứng dụng db, vì vậy nó không thực sự về MVC.


7

Điều này có vẻ rõ ràng, nhưng chạy trang web của bạn ở chế độ Phát hành, không phải chế độ Gỡ lỗi, khi đang sản xuất và cả trong quá trình định hình hiệu suất. Chế độ phát hành nhanh hơn nhiều . Chế độ gỡ lỗi có thể ẩn các vấn đề về hiệu suất trong mã của riêng bạn.



6

Không phải là tối ưu hóa rung chuyển trái đất, nhưng tôi nghĩ rằng tôi muốn ném này ngoài kia - Sử dụng CDN cho jQuery, vv .

Trích dẫn từ chính ScottGu: Microsoft Ajax CDN cho phép bạn cải thiện đáng kể hiệu năng của các ứng dụng ASP.NET Web Forms và ASP.NET MVC sử dụng ASP.NET AJAX hoặc jQuery. Dịch vụ này có sẵn miễn phí, không yêu cầu đăng ký và có thể được sử dụng cho cả mục đích thương mại và phi thương mại.

Chúng tôi thậm chí sử dụng CDN cho các trang web của chúng tôi trong Moss sử dụng jQuery.


6

Ngoài ra nếu bạn sử dụng NHibernate, bạn có thể bật và thiết lập bộ đệm cấp hai cho các truy vấn và thêm vào phạm vi truy vấn và thời gian chờ. Và có trình hồ sơ kick ass cho EF , L2S và NHibernate - http://hibernatingrhinos.com/products/UberProf . Nó sẽ giúp điều chỉnh các truy vấn của bạn.


Ayende gần đây đã viết blog về cách EF Profiler giúp anh điều chỉnh một ứng dụng MVC mẫu: ayende.com/Blog/archive/2010/05/17/ Kẻ
Frank Schwieterman

5

Tôi cũng sẽ thêm:

  1. Sử dụng Sprites : Sprites là một điều tuyệt vời để giảm yêu cầu. Bạn hợp nhất tất cả các hình ảnh của bạn thành một hình duy nhất và sử dụng CSS để có được phần tốt của sprite. Microsoft cung cấp một thư viện tốt để làm điều đó: Xem trước tối ưu hóa hình ảnh và Sprite 4 .

  2. Bộ nhớ cache Đối tượng máy chủ của bạn : Nếu bạn có một số danh sách tham chiếu hoặc dữ liệu sẽ hiếm khi thay đổi, bạn có thể lưu chúng vào bộ nhớ thay vì truy vấn cơ sở dữ liệu mỗi lần.

  3. Sử dụng ADO.NET thay vì Entity Framework : EF4 or EF5rất tốt để giảm thời gian phát triển, nhưng sẽ rất khó để tối ưu hóa. Thật đơn giản để tối ưu hóa một thủ tục được lưu trữ hơn Entity Framework. Vì vậy, bạn nên sử dụng thủ tục cửa hàng càng nhiều càng tốt. Dapper cung cấp một cách đơn giản để truy vấn và ánh xạ SQL với hiệu suất rất tốt.

  4. Trang bộ đệm hoặc trang một phần : MVC cung cấp một số bộ lọc dễ dàng cho trang bộ đệm theo một số tham số, vì vậy hãy sử dụng nó.

  5. Giảm các cuộc gọi cơ sở dữ liệu : Bạn có thể tạo một yêu cầu cơ sở dữ liệu duy nhất trả về nhiều đối tượng. Kiểm tra trên trang web của Dapper.

  6. Luôn có một kiến ​​trúc sạch sẽ : Có một kiến ​​trúc n-tiers sạch sẽ, ngay cả trên một dự án nhỏ. Nó sẽ giúp bạn giữ mã của bạn sạch sẽ, và sẽ dễ dàng hơn để tối ưu hóa nó nếu cần.

  7. Bạn có thể xem mẫu này " Mẫu MVC Neos-SDI " sẽ tạo ra một kiến ​​trúc sạch cho bạn với nhiều cải tiến hiệu suất theo mặc định (kiểm tra trang web MvcTemplate ).


Bạn có nghĩ rằng tốt hơn là chạy một thủ tục được lưu trữ sẽ trả về nhiều tập kết quả hơn sau đó chạy nhiều thủ tục được lưu trữ hơn trong chế độ không đồng bộ?
Muflix

4

Ngoài tất cả các thông tin tuyệt vời về tối ưu hóa ứng dụng của bạn ở phía máy chủ, tôi muốn nói rằng bạn nên xem YSlow . Đó là một nguồn tài nguyên tuyệt vời để cải thiện hiệu suất trang web về phía khách hàng.

Điều này áp dụng cho tất cả các trang web, không chỉ ASP.NET MVC.


3

Một điều cực kỳ dễ làm là suy nghĩ không đồng bộ khi truy cập dữ liệu bạn muốn cho trang. Cho dù đọc từ dịch vụ web, tệp, cơ sở dữ liệu hoặc thứ gì khác, hãy sử dụng mô hình async càng nhiều càng tốt. Mặc dù nó không nhất thiết phải giúp bất kỳ một trang nào nhanh hơn, nhưng nó sẽ giúp máy chủ của bạn hoạt động tổng thể tốt hơn.


2

1: Nhận thời gian. Cho đến khi bạn biết sự chậm lại ở đâu, câu hỏi quá rộng để trả lời. Một dự án tôi đang làm có vấn đề chính xác này; Không có đăng nhập để biết những thứ nhất định mất bao lâu; chúng tôi chỉ có thể đoán các phần chậm của ứng dụng cho đến khi chúng tôi thêm thời gian cho dự án.

2: Nếu bạn có các hoạt động liên tiếp, đừng ngại đa luồng nhẹ. ĐẶC BIỆT nếu các hoạt động chặn có liên quan. PLINQ là bạn của bạn ở đây.

3: Tạo trước chế độ xem MVC của bạn khi xuất bản ... Điều đó sẽ giúp với một số 'trang đầu tiên nhấn'

4: Một số tranh luận về thủ tục lưu trữ / lợi thế của tốc độ ADO. Những người khác tranh luận về tốc độ phát triển của EF và sự phân chia rõ ràng hơn về các tầng và mục đích của họ. Tôi đã thấy các thiết kế thực sự chậm khi SQL và các cách giải quyết sử dụng Sprocs / Lượt xem để truy xuất và lưu trữ dữ liệu. Ngoài ra, khó khăn của bạn để kiểm tra tăng lên. Cơ sở mã hiện tại của chúng tôi mà chúng tôi đang chuyển đổi từ ADO sang EF không hoạt động kém hơn (và trong một số trường hợp tốt hơn) so với mô hình cuộn tay cũ.

5: Điều đó nói rằng, Hãy nghĩ về ứng dụng Khởi động. Một phần trong những gì chúng tôi làm để giúp loại bỏ hầu hết các tai ương về hiệu suất của chúng tôi là thêm một phương pháp khởi động đặc biệt. Nó không biên dịch trước bất kỳ truy vấn hay bất cứ điều gì, nhưng nó giúp cho phần lớn việc tải / tạo siêu dữ liệu. Điều này có thể còn quan trọng hơn khi xử lý các mô hình Code First.

6: Như những người khác đã nói, Đừng sử dụng trạng thái Phiên hoặc ViewState nếu có thể. Chúng không nhất thiết phải là tối ưu hóa hiệu suất mà các nhà phát triển nghĩ đến, nhưng một khi bạn bắt đầu viết các ứng dụng web phức tạp hơn, bạn muốn có sự đáp ứng. Phiên trạng thái loại trừ điều này. Hãy tưởng tượng một truy vấn chạy dài. Bạn quyết định mở một cửa sổ mới và thử một cửa sổ ít phức tạp hơn. Vâng, bạn cũng có thể đã đợi với trạng thái phiên, vì máy chủ sẽ đợi cho đến khi yêu cầu đầu tiên được thực hiện trước khi chuyển sang yêu cầu tiếp theo cho phiên đó.

7: Tối thiểu hóa các chuyến đi khứ hồi đến cơ sở dữ liệu. Lưu những thứ bạn thường xuyên sử dụng nhưng sẽ không thực sự thay đổi thành .Net Cache của bạn. Cố gắng để hàng loạt chèn / cập nhật của bạn nếu có thể.

7.1: Tránh mã Truy cập dữ liệu trong chế độ xem Dao cạo của bạn mà không có lý do chính đáng. Tôi sẽ không nói điều này nếu tôi đã không nhìn thấy nó. Họ đã truy cập dữ liệu của họ khi đặt mô hình lại với nhau, tại sao họ không đưa nó vào mô hình?


2
  1. Thực hiện Gzip.
  2. Sử dụng kết xuất không đồng bộ cho chế độ xem một phần.
  3. Giảm thiểu lượt truy cập cơ sở dữ liệu.
  4. Sử dụng một truy vấn được biên dịch.
  5. Chạy một hồ sơ và tìm ra lượt truy cập không cần thiết. Tối ưu hóa tất cả các thủ tục được lưu trữ mất hơn 1 giây để trả về phản hồi.
  6. Sử dụng bộ nhớ đệm.
  7. Sử dụng tối ưu hóa gói bó .
  8. Sử dụng các tiện ích HTML 5 như bộ đệm phiên và bộ nhớ cục bộ cho nội dung chỉ đọc.

2

Chỉ muốn thêm 2 xu của tôi. Cách hiệu quả nhất để tối ưu hóa việc tạo lộ trình URL trong ứng dụng MVC là ... hoàn toàn không tạo ra chúng.

Hầu hết chúng ta ít nhiều đều biết cách tạo URL trong ứng dụng của mình, vì vậy, chỉ cần sử dụng tĩnh Url.Content("~/Blahblah")thay vì Url.Action()hoặc Url.RouteUrl()khi có thể, đánh bại tất cả các phương thức khác gần 20 lần và thậm chí nhiều hơn.

Tái bút Tôi đã chạy một số điểm chuẩn của vài nghìn lần lặp và đăng kết quả lên blog của mình nếu quan tâm.


1

Trong tiếng kêu của bạn để tối ưu hóa phía máy khách, đừng quên lớp cơ sở dữ liệu. Chúng tôi đã có một ứng dụng đi từ 5 giây để tải tối đa 50 giây qua đêm.

Khi kiểm tra, chúng tôi đã thực hiện một loạt các thay đổi lược đồ. Khi chúng tôi làm mới các số liệu thống kê, nó đột nhiên trở nên nhạy bén như trước.


0

Sau đây là những việc cần làm

  1. Chế độ kernel kernel
  2. Chế độ đường ống
  3. Loại bỏ các mô-đun không sử dụng
  4. run ALLManagedModulesFor ALLRequests
  5. Đừng viết bằng wwwroot
  6. Loại bỏ các công cụ và ngôn ngữ xem không sử dụng

0

Sử dụng Gói và Giảm thiểu cũng giúp bạn cải thiện hiệu suất. Về cơ bản nó làm giảm thời gian tải trang.


0

Nếu bạn đang chạy ứng dụng ASP.NET MVC của mình trên Microsoft Azure (IaaS hoặc PaaS), thì hãy thực hiện các thao tác sau ít nhất trước khi triển khai đầu tiên.

  • Quét mã của bạn với bộ phân tích mã tĩnh cho bất kỳ loại nợ mã, trùng lặp, độ phức tạp và để bảo mật.
  • Luôn bật Thông tin chi tiết về ứng dụng và thường xuyên theo dõi hiệu suất, trình duyệt và phân tích để tìm các sự cố trong thời gian thực trong ứng dụng.
  • Triển khai Azure Redis Cache cho dữ liệu thay đổi tĩnh và ít thường xuyên hơn như Hình ảnh, tài sản, bố cục phổ biến, v.v.
  • Luôn dựa vào các công cụ APM (Quản lý hiệu suất ứng dụng) do Azure cung cấp.
  • Xem bản đồ ứng dụng thường xuyên để điều tra hiệu suất liên lạc giữa các phần bên trong của ứng dụng.
  • Giám sát hiệu suất cơ sở dữ liệu / VM quá.
  • Sử dụng Cân bằng tải (Tỷ lệ ngang) nếu được yêu cầu và trong ngân sách.
  • Nếu ứng dụng của bạn có đối tượng mục tiêu trên toàn cầu, thì hãy sử dụng Trình quản lý Azure Trafic để tự động xử lý yêu cầu đến và chuyển hướng nó sang phiên bản ứng dụng khả dụng nhất.
  • Cố gắng tự động hóa giám sát hiệu suất bằng cách viết các cảnh báo dựa trên hiệu suất thấp.

0

Sử dụng phiên bản mới nhất của Thư viện song song tác vụ (TPL) , theo phiên bản .Net. Phải chọn các mô-đun chính xác của TPL cho các mục đích khác nhau.


0

Tôi đã làm tất cả các câu trả lời ở trên và nó không giải quyết được vấn đề của tôi.

Cuối cùng, tôi đã giải quyết vấn đề tải trang chậm của mình bằng cách đặt PrecompileB BeforePublish trong Publish Profile thành true . Nếu bạn muốn sử dụng msbuild, bạn có thể sử dụng đối số này:

 /p:PrecompileBeforePublish=true

Nó thực sự giúp ích rất nhiều. Bây giờ MVC ASP.NET của tôi tải nhanh hơn 10 lần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.