
우리는 두 대의 서버(IIS8 및 10)에서 IIS를 실행하고 있으며 최근 ASP.NET WebForms 응용 프로그램의 메모리 사용량이 매우 높으며 주로 aspx 페이지를 통해 액세스합니다.
시간이 지나면서 서버의 물리적 메모리(64GB)가 거의 고갈될 때까지 애플리케이션 풀이 점점 더 많은 메모리를 소비하게 됩니다. 이것은 확실히 정상이 아닙니다.
우리는 왜 이런 일이 발생하는지 알아내려고 노력했지만 아이디어가 부족했습니다. 날씨가 불분명한 것은 애플리케이션의 메모리 누수이거나 정상적인 동작이므로 누군가가 이에 대해 밝힐 수 있을 것입니다.
사리:
시간이 지남에 따라 응용 프로그램 풀은 해제되지 않는 더 많은 메모리를 예약하고 사용합니다(작업 관리자는 작업 세트와 커밋 크기가 모두 매우 높기 때문에 실제로 사용/보유된다고 말합니다. 맞습니까?)
ANTS, .dotMemory, .NET MemoryProfiler와 같은 메모리 프로파일러에서는 관리되는 메모리 소비량이 20~200MB로 다소 낮으며 사용되지만 무료인 관리되지 않는 메모리가 많이 표시된다고 말합니다.
스냅샷 및 자세한 프로파일링 방법을 사용하더라도 관리되지 않는 사용의 원인이 무엇인지에 대한 힌트를 제공하지 않습니다.
F5 키를 놓지 않은 채 시작 페이지를 "해머"하면 1분 안에 메모리 사용량을 최대 2~5GB까지 늘릴 수 있습니다. 이건 좀 미친 짓이다.
우리는 IIS/응용 프로그램 풀이 사용 가능한 메모리가 많을수록 기회주의적인 방식으로 메모리를 예약하는 경향이 있다는 것을 알고 있지만 이는 너무 많은 것입니다.
우리가 볼 수 있는 유일한 것은 첫 페이지가 컨트롤과 ComponentModel 개체를 사용하여 메모리에 보관되어 있는 것처럼 보이지만 메모리 프로파일러의 어느 곳에서도 페이지 개체나 자체 네임스페이스 클래스에 대한 단일 참조가 없다는 것입니다.
1년 전에는 메모리 소비가 괜찮았고 총 2~3GB로 멈췄지만 이전 버전의 애플리케이션에서는 더 이상 이를 재현할 수 없습니다.
이는 WIN10에서 IIS를 새로 로컬에 설치하는 경우에도 발생합니다.
응용 프로그램은 릴리스 모드로 구축되고 최적화되었으며 현재 단일 DLL로 컴파일되었으며 추적 플래그 없이도 시도되었으며 크기는 5MB입니다.
애플리케이션을 분리하여 여러 모듈로 나누고 이들이 어떻게 작동하는지 확인해야 할 것 같습니다. 런타임에 로드된 어셈블리/라이브러리는 문제가 될 수 있지만 문제가 되어서는 안 됩니다. 우리는 실제로 그다지 많이 참조하지 않았습니다(FreeTextBox, Microsoft ReportViewer, SharpCompress, Crystal Reports, AjaxControlToolKit 15). 어떤 일이 일어나는지 확인하기 위해 이미 CrystalReports/AjaxControlToolKit을 제외한 모든 항목을 제거했지만 변경되지 않았습니다.
또한 때때로 Timers 및 UpdatePanels를 포함하여 많은 WebForms 컨트롤을 사용합니다.
또한 .NET 클래스 인스턴스가 어떤 링크도 표시하지 않기 때문에 하나 이상의 aspx 페이지가 메모리에 유지되도록 하는 숨겨진 참조가 있다고 가정할 때 메모리 프로파일러를 사용하여 범인을 찾는 방법도 모릅니다.
메모리 예약과 관련하여 우리가 오해할 수 있는 내용이나 이 메모리 소비 문제를 해결하는 방법에 대한 힌트를 얻으면 기쁠 것입니다.
시간 내 주셔서 대단히 감사합니다!
편집(언급하는 것을 잊음): - 도움이 되는지 확인하기 위해 시작 페이지의 Page_Load 함수에 GC.Collect/WaitForPendingFinalizers/GC.Collect를 추가했으며, 또 다른 압력이 있을 때까지 잠시 동안 실제로 도움이 되었습니다. 메모리 사용량이 극단적으로 다시 증가하는 상황(F5 사용)
답변1
GC.WaitForPendingFinalizers가 도움이 되면 스레드에서 메모리를 사용한다는 신호일 수 있습니다. page_load에서 별도의 새 스레드를 시작하면 많은 메모리를 사용할 수 있습니다. 작업 관리자에서 스레드 수를 확인하여 문제 진단을 시작하세요.