Tác giả: Maoni0
Thời gian đọc: 20 phút
Ngày đăng: 4 ngày trước
Mục lục
Chuẩn bị cho DATAS trong .NET 10
Trong .NET 9, chúng tôi đã bật DATAS (Dynamic Adaptation To Application Sizes) theo mặc định. Tuy nhiên, .NET 9 không phải là phiên bản LTS, vì vậy đối với nhiều người, họ sẽ được trải nghiệm DATAS lần đầu tiên khi nâng cấp lên .NET 10. Đây là một quyết định khó khăn vì các tính năng GC thường là loại không yêu cầu sự can thiệp của người dùng – nhưng DATAS có chút khác biệt. Đó là lý do bài viết này có tiêu đề “chuẩn bị cho” thay vì chỉ là “điều gì mới” 😊.
Tại sao bạn cần quan tâm
Nếu bạn đang sử dụng Server GC, bạn có thể nhận thấy một hồ sơ hiệu suất khác biệt rõ rệt hơn so với những gì bạn thấy trong các bản nâng cấp runtime trước đó. Việc sử dụng bộ nhớ có thể trông hoàn toàn khác (rất có thể nhỏ hơn) – và điều đó có thể hoặc không thể mong muốn. Tất cả phụ thuộc vào việc sự đánh đổi có đáng chú ý hay không, và nếu có, liệu nó có phù hợp với mục tiêu tối ưu hóa của bạn hay không. Tôi khuyên bạn nên ít nhất nhìn nhanh qua các chỉ số hiệu suất ứng dụng của mình để xem bạn có hài lòng với kết quả của sự thay đổi này không. Nhiều người sẽ hoàn toàn hoan nghênh nó – nhưng nếu bạn không thuộc nhóm đó, đừng hoảng sợ. Tôi khuyến khích bạn đọc tiếp để xem liệu có hợp lý khi chỉ cần tắt DATAS hay không, hoặc nếu một chút điều chỉnh có thể khiến nó hoạt động có lợi cho bạn.
Nội dung bài viết
Tôi sẽ nói về cách chúng tôi thường quyết định thêm các tính năng hiệu suất nào, tại sao DATAS lại khác biệt so với các tính năng GC điển hình và các thay đổi điều chỉnh được giới thiệu kể từ bài đăng blog DATAS trước của tôi. Tôi cũng sẽ chia sẻ hai ví dụ về cách tôi điều chỉnh DATAS trong các kịch bản nội bộ.
Nếu bạn chủ yếu ở đây để xem những kịch bản nào DATAS không được thiết kế cho – để giúp quyết định có nên tắt nó hay không – hãy thoải mái chuyển đến phần này.
Chính sách chung về việc thêm các tính năng hiệu suất GC
Hầu hết các tính năng hiệu suất GC – cho dù đó là một loại GC mới, một cơ chế mới cho phép GC làm điều gì đó mà trước đây không thể, hoặc các tối ưu hóa cải thiện một cơ chế hiện có – thường được bật tự động khi bạn nâng cấp lên phiên bản runtime mới. Chúng tôi không yêu cầu người dùng thực hiện hành động vì các tính năng này được thiết kế để cải thiện nhiều kịch bản khác nhau. Trên thực tế, đó thường là lý do tại sao chúng tôi chọn triển khai chúng: chúng tôi phân tích nhiều kịch bản để hiểu các vấn đề phổ biến nhất, tìm ra những gì cần thiết để giải quyết chúng, sau đó ưu tiên những cái cần thiết kế và triển khai.
Tất nhiên, với bất kỳ thay đổi hiệu suất nào, luôn có nguy cơ suy giảm – và đối với một framework được hàng triệu người sử dụng, bạn chắc chắn sẽ làm suy giảm hiệu suất của ai đó. Những sự suy giảm này có thể đặc biệt rõ ràng trong các microbenchmark, nơi hành vi quá cực đoan đến mức ngay cả những thay đổi nhỏ cũng có thể gây ra dao động mạnh trong kết quả.
DATAS nhắm mục tiêu vào hai loại kịch bản cụ thể
- Khối lượng công việc bùng nổ chạy trong môi trường hạn chế bộ nhớ: DATAS nhằm thu hồi kích thước heap khi ứng dụng không yêu cầu nhiều bộ nhớ và mở rộng nó khi ứng dụng yêu cầu nhiều hơn. Điều này đặc biệt quan trọng đối với các ứng dụng chạy trong container với giới hạn bộ nhớ.
- Khối lượng công việc nhỏ sử dụng Server GC: ví dụ: nếu ai đó muốn thử một ứng dụng asp.net core nhỏ để xem trải nghiệm như thế nào trong .NET, DATAS nhằm cung cấp kích thước heap phù hợp hơn nhiều với những gì ứng dụng nhỏ thực sự cần.
Sự khác biệt về hiệu suất giữa DATAS và Server GC truyền thống
DATAS là một tính năng GC mà tôi đã dành nhiều thời gian để giải thích cho đồng nghiệp hơn bất kỳ tính năng nào khác – là một tính năng có thể nhìn thấy rõ ràng đối với người dùng, nó tự nhiên thu hút nhiều câu hỏi hơn hầu hết các tính năng GC khác mà tôi đã thêm vào. Và có rất nhiều quan niệm sai lầm.
Server GC không thích ứng với kích thước ứng dụng – đó không bao giờ là mục tiêu. Server GC chủ yếu nhìn vào tỷ lệ sống sót của mỗi thế hệ và thực hiện GC dựa trên đó. DATAS, mặt khác, nhằm mục đích thích ứng với kích thước ứng dụng, có nghĩa là bạn sẽ thấy kích thước heap tương tự ngay cả khi số lượng lõi thay đổi nhiều.
Tôi có cần quan tâm nếu tôi đang sử dụng Workstation GC không?
Câu trả lời phụ thuộc vào lý do bạn sử dụng Workstation GC. Nếu bạn sử dụng Workstation GC vì khối lượng công việc của bạn đơn giản là không yêu cầu sử dụng Server GC, thì không cần thay đổi. Nhưng nếu bạn sử dụng nó vì việc sử dụng bộ nhớ của Server GC quá lớn và bạn chỉ sử dụng Workstation để hạn chế việc sử dụng bộ nhớ, bạn có thể thấy DATAS rất hấp dẫn vì nó có thể vừa hạn chế việc sử dụng bộ nhớ vừa giảm thời gian tạm dừng GC với nhiều luồng GC hơn thực hiện công việc thu gom.
Cách DATAS thực hiện công việc của nó
Mục tiêu của DATAS là thích ứng với kích thước ứng dụng, hay LDS (Kích thước Dữ liệu Sống). DATAS bao gồm 2 thành phần chính:
- Giới thiệu khái niệm “Ngân sách Được Tính toán qua DATAS (BCD)” được tính dựa trên kích thước ứng dụng.
- Trong giới hạn trên này, chúng ta có thể giảm bộ nhớ hơn nữa nếu vẫn duy trì được hiệu suất hợp lý. Và chúng tôi định nghĩa “hiệu suất hợp lý” này với mục tiêu Phần trăm Chi phí Thông lượng (TCP).
Khi nào DATAS có thể không áp dụng cho kịch bản của bạn
- Nếu bạn không có nhu cầu sử dụng bộ nhớ trống: Bạn không cần DATAS nếu không có kế hoạch sử dụng bộ nhớ được giải phóng bởi DATAS.
- Nếu hiệu suất khởi động là quan trọng: DATAS không dành cho bạn vì nó luôn bắt đầu với 1 heap.
- Nếu bạn không chấp nhận bất kỳ sự suy giảm thông lượng nào: DATAS có thể không dành cho bạn.
- Nếu bạn chủ yếu thực hiện GC gen2: DATAS có thể không dành cho bạn trong trường hợp này.
Điều chỉnh DATAS nếu cần thiết
Tôi đã thử DATAS trên một số khối lượng công việc nội bộ và nhìn chung nó hoạt động rất tốt. Tôi sẽ cho thấy một vài ví dụ mà các tham số mặc định của DATAS không tuyệt vời nhưng việc điều chỉnh một hoặc 2 cấu hình đã làm cho nó hoạt động.
Trường hợp khách hàng 1
Đây là một ứng dụng máy chủ chạy trên các máy chuyên dụng. Với DATAS, họ quan sát thấy sự suy giảm 6.8% trong thông lượng với việc giảm 10% bộ làm việc. Để điều chỉnh DATAS cho kịch bản này, chúng tôi có thể sử dụng cấu hình GCDGen0GrowthPercent để tăng hằng số lên 2.6x và tăng GCDGen0GrowthMinFactor để nó không bị giới hạn ở 0.1.
Trường hợp khách hàng 2
Đây là một ứng dụng asp.net trên máy chủ staging. Nhóm đã sử dụng một số cấu hình GC. Bằng cách kích hoạt DATAS và điều chỉnh BCD lên 2x giá trị mặc định, quá trình hoạt động theo cách mong muốn hơn nhiều với các đặc điểm:
- % thời gian tạm dừng thấp hơn đáng kể
- Các lần tạm dừng GC cá nhân thấp hơn nhiều
- Khi tải trở nên nhẹ hơn, heap cũng trở nên nhỏ hơn
Sự kiện DATAS
Tôi mong đợi hầu hết người dùng không bao giờ cần nhìn vào các sự kiện này, vì vậy tôi sẽ giữ nó ngắn gọn. Các xấp xỉ mà tôi đã đề cập ở trên sẽ đủ. Đối với số ít những người muốn thực hiện phân tích chi tiết vì bất kỳ lý do gì, DATAS kích hoạt một sự kiện biểu thị chính xác các số liệu chúng ta đã thảo luận.
Kết luận: DATAS đại diện cho một thay đổi đáng kể trong cách tiếp cận của .NET đối với quản lý bộ nhớ, đặc biệt cho các ứng dụng server-side. Trong khi nó mang lại lợi ích đáng kể cho nhiều kịch bản, điều quan trọng là phải hiểu khi nào nó phù hợp và khi nào cần điều chỉnh hoặc thậm chí tắt nó đi. Hy vọng rằng bài viết này cung cấp cho bạn thông tin cần thiết để đưa ra quyết định sáng suốt khi nâng cấp lên .NET 10.



