Tăng tốc .NET Core: 10+ checklist tối ưu hiệu năng

Công nghệ - 27/06/2025 03:15:44

⏳ Chậm 3 giây – Mất 50% người dùng. Đó không còn là lý thuyết, đó là thực tế.

Trong gần 20 năm phát triển và tối ưu hệ thống backend, database và API trên .net, tôi nhận ra một điều đơn giản rằng: Code tốt chưa đủ. Code phải chạy nhanh, ổn định, tiết kiệm chi phí hạ tầng - phù hợp với tài nguyên doanh nghiệp.

Trong bối cảnh người dùng hiện đại không muốn chờ đợi, với các trang web mất hơn 3 giây để phản hồi thường bị bỏ qua, và Google ưu tiên các trang được tối ưu, việc cải thiện hiệu suất ASP.NET Core là điều không thể thiếu.

Trong bài viết này, tôi sẽ chia sẻ 10 mẹo (hay có thể xem là checklist) thiết yếu để tối ưu hóa hiệu suất ứng dụng ASP.NET Core, dựa trên kinh nghiệm thực tế và các tài liệu uy tín. Tôi cũng cung cấp danh sách kiểm tra chi tiết cùng với các ví dụ minh họa, hi vọng bạn áp dụng ngay vào công việc của mình.


1. Sử dụng phiên bản mới nhất của .NET Core

Cố gắng luôn cập nhật phiên bản mới nhất, vì mỗi bản phát hành mang lại cải tiến hiệu suất đáng kể.

Tất nhiên điều này phụ thuộc vào hệ thống bạn xây dựng có đủ tương thích hay không nhưng upgrade lên phiên bản mới nhất luôn là best practice về performance và bảo mật

2. Lập trình bất đồng bộ (Async/Await)

Lập trình bất đồng bộ là nền tảng cho các ứng dụng web hiệu suất cao, đặc biệt trong môi trường nhiều yêu cầu đồng thời. Sử dụng async/await giúp tránh chặn luồng, tăng khả năng mở rộng. Ví dụ rất đơn giản trong controller:

public async Task<IActionResult> GetPosts()
{
    var posts = await postRepository.GetPostsAsync();
    return Ok(posts);
}

Tránh Task.Wait() hoặc Task.Result, vì chúng có thể gây deadlock và làm phức tạp xử lý ngoại lệ. Nghiên cứu cho thấy lập trình bất đồng bộ giảm nguy cơ thread pool starvation, đặc biệt trong các ứng dụng lớn.

3. Bất đồng bộ trong mọi thao tác I/O

Thao tác I/O, như đọc/ghi tệp, gọi database hoặc gọi API, nên được thực hiện bất đồng bộ để tránh chặn luồng chính. Ví dụ, sao chép tệp bất đồng bộ:

public async Task CopyFileAsync(string sourceFile, string destFile)
{
    using (var sourceStream = new FileStream(sourceFile, FileMode.Open))
    {
        using (var targetStream = new FileStream(destFile, FileMode.Create))
        {
            await sourceStream.CopyToAsync(targetStream);
        }
    }
}

Điều này giúp ứng dụng xử lý nhiều yêu cầu đồng thời mà không bị chậm lại, đặc biệt quan trọng cho các ứng dụng web với lưu lượng cao .

4. Luôn tận dụng cache

Bộ nhớ cache giảm số lần gọi server, tăng tốc độ phản hồi. ASP.NET Core hỗ trợ nhiều loại cache:

  • In-Memory Caching: Phù hợp cho ứng dụng nhỏ, dùng IMemoryCache.
  • Distributed Caching: Dùng Redis hoặc SQL Server, phù hợp cho ứng dụng mở rộng.
  • Response Caching: Cache toàn bộ phản hồi HTTP, giảm tải cho server.
  • Hybrid Caching: dùng kết hợp các loại cache khác nhau

 

Cụ thể phương án implement cache, bạn có thể xem lại bài post trước của tôi ở đây.

5. Tối ưu hóa truy cập dữ liệu

Truy cập dữ liệu hiệu quả là yếu tố quan trọng, vì thao tác cơ sở dữ liệu thường chậm nhất. Một số chiến lược:

  • Giảm lượt gọi DB bằng cách lấy tất cả dữ liệu cần thiết trong một truy vấn.
  • Sử dụng phân trang cho tập dữ liệu lớn, ví dụ: Take Skip trong EF Core.
  • Lọc dữ liệu tại mức database, dùng LINQ để giảm dữ liệu truyền tải.
  • Với EF Core, dùng AsNoTracking khi chỉ đọc dữ liệu.
  • Tránh truy vấn database nhiều lần trong 1 request.`

 

6. Tối ưu hóa chi tiết các nghiệp vụ tùy chỉnh

Mã tùy chỉnh như middleware, logging, hoặc xử lý xác thực có thể ảnh hưởng hiệu suất nếu không tối ưu. Chung ta cần đảm bảo:

  • Tránh các tác vụ dài đồng bộ, dùng dịch vụ nền (Background job) hoặc hàng đợi tin nhắn (Queue) như Redis, RabittMQ, Azure Service Bus.
  • Sử dụng SignalR cho giao tiếp thời gian thực, đảm bảo không chặn luồng chính.
  • Tối ưu logging, tránh ghi log quá nhiều, đặc biệt trong môi trường production.

 

Trong các ứng dụng lớn, đôi khi chậm lại không ở luồng chính mà ở các nghiệp vụ tùy chỉnh và sẽ rất khó xác định. Nên lưu ý vấn đề này ngay khi implement từng nghiệp vụ nhỏ.

7. Sử dụng nén phản hồi

Nén phản hồi giảm kích thước dữ liệu truyền tải, tăng tốc độ tải trang, đặc biệt cho nội dung văn bản. .NET Core hỗ trợ nén gzip và brotli.

Cấu hình trong Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<BrotliCompressionProvider>();
    });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseResponseCompression();
    // Các middleware khác...
}

Nén phản hồi có thể giảm băng thông sử dụng lên đến 70%, giúp cải thiện trải nghiệm người dùng.

8. Giảm phân bổ đối tượng lớn

Đối tượng lớn (>85,000 byte) được phân bổ trên large object heap (LOH), gây ra thu gom rác tốn kém, làm gián đoạn ứng dụng. Để giảm tác động:

  • Cache đối tượng lớn nếu được sử dụng thường xuyên.
  • Dùng ArrayPool<T> để thuê/mượn và trả lại mảng lớn, giảm phân bổ không cần thiết.

 

var array = ArrayPool<byte>.Shared.Rent(1024);
try
{
    // Sử dụng mảng
}
finally
{
    ArrayPool<byte>.Shared.Return(array);
}

Tối ưu hóa phân bổ đối tượng lớn có thể giảm thời gian thu gom rác lên đến 40%. Tham khảo thêm https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/performance

9. Giảm thiểu Exceptions

Ngoại lệ tốn tài nguyên vì liên quan đến việc unwind stack và xử lý chi tiết. Chỉ dùng ngoại lệ cho tình huống bất thường, không dùng cho luồng chính. Hãy kiểm tra điều kiện để tránh ném ngoại lệ

if (someCondition)
{
    // Xử lý thay vì ném ngoại lệ
    return BadRequest("Invalid state");
}

Dùng logging và Application Insights để theo dõi ngoại lệ phổ biến, giảm tác động hiệu suất.

10. Tối ưu hóa tài nguyên phía client

Dù là phía client, tối ưu hóa tài sản ảnh hưởng lớn đến trải nghiệm người dùng:

  • Bundling và Minification: Kết hợp và thu nhỏ CSS/JS để giảm số yêu cầu HTTP và kích thước tệp.
  • Tải JavaScript cuối trang: Đặt <script> cuối <body> để trang render nhanh hơn.
  • Nén hình ảnh: Sử dụng công cụ nén hình ảnh mà không mất chất lượng.
  • Dùng CDN: Phục vụ tệp tĩnh từ Content Delivery Network để giảm độ trễ cho người dùng xa server.

 

💡 Bonus từ góc nhìn phía Database:

  • Chỉ số Index: Xem lại execution plan, thêm index phù hợp
  • Deadlock: Kiểm tra Transaction Isolation Level, tránh hold lock quá lâu
  • Connection Pooling: Tối ưu pool size, tránh open/close connection lung tung
  • Backup/Restore: Thực hiện ngoài giờ cao điểm để không làm nghẽn DB

 


Kết luận

Tối ưu hóa hiệu suất ASP.NET Core không chỉ là kỹ thuật, mà là nhiều phương án cân bằng giữa phía server và client. Bằng cách áp dụng 10 mẹo trên, bạn có thể cải thiện đáng kể tốc độ và khả năng mở rộng ứng dụng của mình. Hãy sử dụng danh sách kiểm tra để đảm bảo không bỏ sót bất kỳ điểm nào.

Nhớ rằng, mỗi cải tiến nhỏ cũng có thể dẫn đến kết quả lớn. Hãy cùng nhau cố gắng làm cho ứng dụng của chúng ta tốt hơn 1% mỗi ngày! Chia sẻ kinh nghiệm của bạn trong phần bình luận, và đừng quên theo dõi tôi để nhận thêm bài viết công nghệ hữu ích.

Tài liệu tham khảo

 

/Son Do - I share real-world lessons, team building & developer growth.

#PerformanceOptimization #DotNet #WebDevelopment #CodingTips #SoftwareEngineering #1percentbetter

Nguồn: Son Do

Công nghệ - 19/08/2025 21:13:07

Tìm hiểu cách xây dựng hệ thống phát hiện ngôn ngữ ký hiệu theo thời gian thực bằng AI, sử dụng DETR để tăng cường khả năng tiếp cận và đổi mới. Kết nối lời nói và cử chỉ.

Công nghệ - 18/08/2025 13:38:25

Tối ưu hóa các hệ thống RAG bằng cách tận dụng siêu dữ liệu để truy xuất thông tin chính xác và nhanh chóng hơn, giải quyết các thách thức về dữ liệu dư thừa hoặc lỗi thời với công cụ LangExtract nguồn mở. Khám phá cách LangExtract sử dụng các mô hình ngôn ngữ tiên tiến để trích xuất và cấu trúc siêu dữ liệu, tạo ra một quy trình truy xuất hợp lý và hiệu quả.

Công nghệ - 01/08/2025 07:00:00

Gỡ lỗi LLM rất quan trọng vì quy trình làm việc của chúng phức tạp và liên quan đến nhiều phần như chuỗi, lời nhắc, API, công cụ, trình truy xuất, v.v.

Công nghệ - 19/06/2025 03:05:09

Code xong chạy được là chưa đủ – phải biết khi nào nó "chết" nữa chứ 😅

Bạn đang triển khai ứng dụng trên Kubernetes, Docker hay môi trường production nào? Và bạn từng "toát mồ hôi" vì service chết mà không ai báo?

Công nghệ - 16/07/2025 13:41:17

Bạn có bao giờ tự hỏi tại sao trang web của mình tải chậm, đặc biệt là trên các thiết bị di động? Rất có thể, thủ phạm chính là những hình ảnh chưa được tối ưu. May mắn thay, có một công cụ miễn phí và cực kỳ hữu ích có thể giúp bạn giải quyết vấn đề này: Responsive Image Linter – một tiện ích mở rộng trên Chrome. Video này sẽ giới thiệu chi tiết về công cụ này, giúp bạn xác định và tối ưu hóa các hình ảnh gây tốn hiệu năng trên trang web của mình.

Công nghệ - 11/12/2025 15:05:29

[Góc chuyện nghề] bán account game để đi học nghệ - bạn dám không?

Làm nghề 20 năm, gặp nhiều sinh viên, nhưng chiều qua tôi khá bất ngờ với một cậu em tên Quang. Em Quang muốn theo nghề BA và mong muốn lương 20 triệu sau khi làm việc 1.5 năm tới 2 năm trong nghề.

Công nghệ - 22/09/2025 08:59:20

Dừng ngay việc dùng DateTime.Now trong APIs, đó là ổ lỗi tiềm ẩn trong hệ thống của bạn

⏱️ Tôi từng nghĩ DateTime.Now là một thứ vô hại, đơn giản và tiện lợi, cho đến khi gặp những vấn đề về múi giờ. Những lỗi "tưởng chừng nhỏ" này lại chính là nguồn cơn của sự thất vọng và tốn kém thời gian cho nhiều đội ngũ phát triển.

Công nghệ - 14/03/2025 04:30:32

💡Bạn muốn tăng tốc tìm kiếm toàn văn nhưng hạ tầng hạn chế? Lucene có thể là giải pháp bất ngờ! Bài viết tiết lộ cách nó vượt trội hơn SQL Server, tối ưu truy vấn và những ứng dụng thực tế đáng khám phá.