MiniProfiler là một công cụ phân tích hiệu năng nhẹ, hỗ trợ nhiều nền tảng như .NET, Ruby, Go và Node.js. Nó cho phép theo dõi thời gian thực thi của trang web — bao gồm cả các yêu cầu được gọi qua Ajax, iframe hoặc tham chiếu trực tiếp — đồng thời hiển thị chi tiết các truy vấn cơ sở dữ liệu, kể cả câu lệnh SQL khi sử dụng Entity Framework (EF), EF Code First, LINQ to SQL, RavenDB hay MongoDB.
Công cụ này đặc biệt hữu ích trong việc phát hiện các mẫu truy vấn kém hiệu quả như N+1, bằng cách nhận diện các truy vấn lặp lại chỉ khác nhau ở giá trị tham số. MiniProfiler được phát hành theo giấy phép Apache License 2.0 và có sẵn trên NuGet.
Trong khi SQL Server Profiler truyền thống đòi hỏi nhiều thao tác cấu hình phức tạp và khó lọc kết quả, MiniProfiler cung cấp giao diện trực quan ngay trên chính trang web đang được kiểm thử.
Chuẩn bị môi trường
- Hệ điều hành: Windows 10
- IDE: Visual Studio 2013
- Dự án: Ứng dụng MVC sử dụng cơ sở dữ liệu Northwind
Cài đặt các gói cần thiết
- Cài đặt
MiniProfiler - Cài đặt
MiniProfiler.Mvc4 - Cài đặt
MiniProfiler.EF6
Cấu hình trong Global.asax
Chỉ kích hoạt MiniProfiler trong chế độ gỡ lỗi (DEBUG) để tránh ảnh hưởng đến môi trường production:
using StackExchange.Profiling;
using StackExchange.Profiling.EntityFramework6;
using System.Web.HttpApplication;
namespace WebAppEF
{
public class MvcApplication : HttpApplication
{
protected void Application_Start()
{
#if DEBUG
MiniProfilerEF6.Initialize();
#endif
// Các cấu hình khởi tạo khác...
}
protected void Application_BeginRequest()
{
#if DEBUG
MiniProfiler.Start();
#endif
}
protected void Application_EndRequest()
{
#if DEBUG
MiniProfiler.Stop();
#endif
}
}
}
Chèn UI vào layout
Thêm đoạn mã sau vào file _Layout.cshtml trước thẻ đóng </body>:
@using StackExchange.Profiling
@MiniProfiler.RenderIncludes()
Cấu hình Web.config
Đảm bảo xử lý đúng các tài nguyên tĩnh của MiniProfiler trong IIS:
<system.webServer>
<handlers>
<add name="MiniProfiler"
path="mini-profiler-resources/*"
verb="*"
type="System.Web.Routing.UrlRoutingModule"
resourceType="Unspecified"
preCondition="integratedMode" />
</handlers>
</system.webServer>
Ví dụ sử dụng trong Controller
public ActionResult Index()
{
using (var profiler = MiniProfiler.Current)
{
using (profiler.Step("Lấy danh sách khách hàng"))
{
using (var context = new NorthwindEntities())
{
ViewBag.Customers = context.Customers.ToList();
}
}
}
return View();
}
Giao diện MiniProfiler sẽ đánh dấu các truy vấn trùng lặp (duplicate queries) — dấu hiệu của vấn đề hiệu năng cần tối ưu.
Lỗi thường gặp và cách khắc phục
1. Lỗi khởi tạo EF với DbConfiguration
Thông báo: "The Entity Framework was already using a DbConfiguration instance..."
Nguyên nhân: Gọi MiniProfilerEF6.Initialize() sau khi EF đã được khởi tạo.
Khắc phục: Đảm bảo gọi MiniProfilerEF6.Initialize() trước bất kỳ thao tác nào liên quan đến DbContext, ví dụ trước dòng Database.SetInitializer<...>(null);.
2. Lỗi xung đột phiên bản assembly
Thông báo: "Could not load file or assembly 'MiniProfiler...'"
Nguyên nhân: Phiên bản tham chiếu trong Web.config không khớp với phiên bản thực tế trong thư mục bin hoặc packages.config.
Khắc phục: Thêm hoặc cập nhật phần bindingRedirect trong Web.config:
<dependentAssembly>
<assemblyIdentity name="MiniProfiler"
publicKeyToken="b44f9351044011a3"
culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.2.0.157"
newVersion="3.2.0.157" />
</dependentAssembly>
Kiểm tra kỹ phiên bản trong packages.config và đảm bảo newVersion khớp chính xác.