+2

Tăng Hiệu Suất Ứng Dụng ASP.NET Bằng Cách Tối Ưu Session

Hi anh em, cũng sắp tết rồi anh em đã chuẩn bị đón tết tới đâu rồi. Hôm nay cũng là ngày Ông Công Ông Táo, tranh thủ mình muốn chia sẻ với anh em một case study thú vị về việc tối ưu hiệu năng khi xử lý concurrent requests trong ứng dụng ASP.NET MVC.

Vấn đề

Vào cuối tuần trước mình được EM dự án giao cho task xử lý các vấn đề liên quan đến SLO (Service Level Objectives) trong dự án, cụ thể là tình trạng một số request có thời gian phản hồi chậm bất thường.

image.png

Đây là hình ảnh trên APM hiển thị danh sách các transactions của ứng dụng. Có một số các API xử lý nghiệp vụ nặng thì không nói, nhưng có một số API đơn giản như GetCountNewNotice, GetNumberContactNoRead, CheckUserAcceptPrivacy có latency cao.

image.png

Quá Trình Debug

  • Sau khi review code trên các API này thì mình thấy logic xử lý trong service layer của các API trên khá đơn giản và đã được cache.
  • Mình thử tìm tiếp các đoạn liên quan xử lý middleware authen, permission, ... thì thấy trong các middleware này có xử lý thao tác gọi tới database (nhưng cũng có cache lại hết rồi), thôi thì cứ comment vào cho chắc cú. Thử F5 trên client xem như thế nào nào hmmmm => Response time vẫn chậm.
  • Sau đó mình mới thử đặt đoạn code để kiểm tra xem trong các middleware xử lý thời gian có lâu không.

image.png

Xem debug console thì thấy ngoài các request xử lý nghiệp vụ nặng còn các request khác xử lý chỉ mất vài chục ms.

Sau đó mình mới thử Reply XHR lại một số API trên client thì thấy response time rất nhanh (đến đoạn này nghi ngờ chắc có một số request gọi đồng thời đang bị blocking calls), thử review các request khác gọi đồng thời thì thấy không có vấn đề gì cả.

Tiếp tục thử Reply XHR lại từng request 1 thì thấy response time rất nhanh (tương tự với cách trên - đến lúc này bó tay rồi)

Sau đó mình thử hỏi anh SA thì sau một buổi chiều anh ý review thì nguyên nhân chính là do cơ chế Session State (cách hoạt động của nó ra sao thì mọi người có thể tham khảo bài viết Session State in ASP.Net của anh hongocdoanh hoặc là ASP.NET Session State Overview)

image.png

Khi Session State được bật, IIS sẽ khóa session trong mỗi request để đảm bảo tính toàn vẹn dữ liệu. Điều này dẫn đến tình trạng các request từ cùng một người dùng phải chờ nhau, ngay cả khi chúng không thực sự cần sử dụng session.

Giải Pháp

Do là project dự án mình đã chuyển sang thiết kế theo hướng Stateless và mình có tìm kiếm trong solution từ khóa liên quan tới get, set trong session không thấy nữa nên thôi mạnh dạn sửa lại cấu hình.

<configuration>
  <system.web>
    <sessionState mode="Off" />
  </system.web>
</configuration>

Kết Quả

image.png

Sau khi áp dụng giải pháp, latency của các API đã giảm đáng kể.

Bài Học Rút Ra

Việc tối ưu hóa hiệu suất ứng dụng không chỉ nằm ở logic xử lý tại server mà còn phụ thuộc nhiều vào cách quản lý tài nguyên, đặc biệt là cơ chế Session State trong ASP.NET MVC. Nếu anh em cũng đang gặp phải vấn đề tương tự:

  • Hãy kiểm tra xem ứng dụng có thực sự cần sử dụng session không.
  • Nếu cần, hãy tối ưu cách sử dụng session để tránh tình trạng khóa không cần thiết.

Hy vọng bài viết này sẽ giúp anh em hiểu rõ hơn về Session State và cách xử lý để cải thiện hiệu suất ứng dụng của mình.

Tham khảo

  1. ASP.NET Session State Overview
  2. ASP.NET Concurrent Ajax Requests and Session State Blocking

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí