너무 많은 메모리를 차지하는 IIS 응용 프로그램 풀

너무 많은 메모리를 차지하는 IIS 응용 프로그램 풀

우리는 두 대의 서버(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에서 별도의 새 스레드를 시작하면 많은 메모리를 사용할 수 있습니다. 작업 관리자에서 스레드 수를 확인하여 문제 진단을 시작하세요.

관련 정보