Cách tắt Server GC trong ứng dụng ASP.NET Framework chạy trên Azure App Service


8

Tôi đang thực hiện một số lưu trữ mật độ cao của các ứng dụng ASP.NET MVC 5 / WCF trên Azure App Service và các ứng dụng nhàn rỗi đang sử dụng 600 ~ 1000 MB bộ nhớ, mỗi thứ khá nhiều, do một đống bộ nhớ cho thấy heap của GC là chỉ khoảng ~ 40 MB đầy đủ. Tôi nghi ngờ đây là do máy chủ GC vì vậy tôi đã cố gắng vô hiệu hóa nó bằng cách theo dõi https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/r nb/gcserver-element và thêm

<gcServer enabled="false" />

vào web.config của tôi, nhưng điều này dường như không có bất kỳ ảnh hưởng nào như

GCSettings.IsServerGC

vẫn đang trở về đúng Tôi đang thiếu gì ở đây?

BIÊN TẬP:

Sử dụng IIS bình thường có thể được thực hiện bằng cách sử dụng https://weblogs.asp.net/owscott/setting-an-aspnet-config-file-per-application-pool nhưng trong Dịch vụ ứng dụng Azure, bạn thiếu quyền để thực hiện việc này.


1
Vấn đề bạn nghĩ bạn có là gì? Ứng dụng sử dụng quá nhiều bộ nhớ? Âm thanh với tôi như bạn nghĩ rằng bạn có một vấn đề nhưng bạn thì không.
Neil

@ Như tôi đã giải thích, các ứng dụng đang sử dụng tới 1GB bộ nhớ, không làm gì cả và như tôi đã phân tích, heap GC chỉ có khoảng 40 MB sử dụng. Máy chủ GC được biết là có dung lượng bộ nhớ cao hơn máy trạm GC nên việc sử dụng bộ nhớ hiệu quả hơn quan trọng hơn lợi ích của máy chủ gc đối với tôi trong trường hợp này.
Thatiman

Nếu họ không thực sự sử dụng nó thì trong khi họ yêu cầu, thì nó không thực sự ở đó. Có nghĩa là bạn săn ma (đặt phòng không sử dụng).
TomTom

@TomTom, ý tôi là, nó vẫn chiếm tài nguyên vật lý trong Gói dịch vụ ứng dụng của tôi, mức sử dụng bộ nhớ tương đương 80%. Nó chỉ không được sử dụng hiệu quả.
Thatiman

1
Dường như cài đặt này không hoạt động nữa đối với ASP.NET. Tôi đã thử và nó thậm chí không hoạt động trong môi trường địa phương của tôi. Nó hoạt động tốt cho ASP.NET Core mặc dù.
Tom Luo

Câu trả lời:


0

Ok, trước hết, có vẻ như bạn có thể phải gỡ lỗi thủ công việc sử dụng bộ nhớ của các thành phần bằng cách sử dụng GC.Collect (): https://docs.microsoft.com/en-us/dotnet/api/system.gc.collect ? view = netcore-3.1

Bằng cách này, bạn có thể xác định chính xác một phần mã cụ thể gây rò rỉ bộ nhớ do bộ sưu tập rác xấu hoặc các bộ phận đang sử dụng một số thư viện của bên thứ ba.

Khi bạn đã hoàn thành phần khá tẻ nhạt này, tùy thuộc vào những gì bạn nghĩ là gây ra sự cố, bạn nên xem xét sử dụng xử lý thủ công khối mã sử dụng (using var item = new NameOfClass()) hoặc thậm chí thử thực hiện IDisposetrên các lớp gây ra nó: https: / /docs.microsoft.com/en-us/dotnet/stiteria/garbage-collection/imâying-aim .

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.