IIS Worker Process (w3wp) 로 높은 CPU 사용량 문제를 해결하는 방법 (3)

728x90
반응형

 

 

 

 

 


 

 

들어가며

이 포스트는 아래의 Blog를 번역한 글이며, 영어공부 겸, 지식을 전달하기 위한 목적으로 작성된 글입니다.

보시기 불편하시거나, 해당글의 무분별한 포스팅이 문제가 된다면, 삭제하겠습니다.

 

https://stackify.com/w3wp-high-cpu-usage/

 

Guide to w3wp.exe High CPU Usage for IIS Worker Processes

If you're having problems with w3wp.exe high CPU usage, get tips to troubleshoot IIS worker process for your ASP.NET web app.

stackify.com

 

 

 

 

6가지 공통된 원인과 IIS 작업자 프로세스의 높은 CPU문제를 해결하는 방법 

w3wp.exe IIS 작업자 프로세스의 높은 CPU 점유율은 많은 이유가 있습니다.

6개의 공통된 원인을 이 포스트에서 선택했습니다. 

  • ASP.NET 어플리케이션의 높은 에러율
  • 높은 CPU의 원인이 되는 웹 트래픽 증가.
  • 어플리케이션의 의존성 문제
  • GC (Garbage collection)
  • ASP.NET 파이프 라인에서 요청이 차된되거나, 중단된 경우
  • 최적화가 필요한 비효율적인 .NET 코드

 

 

 

4. GC 가비지 컬렉션 (Garbage Collection) 

Microsoft.NET 은 가비지 수집을 활용해서 메모리 할당 및 해제를 관리합니다.

어플리케이션이 수행하는 작업에 따라, 어플리케이션의 메모리 할당 및 정리에 많은 GC 활동이 발생 할 수 있습니다. 

예를들어, 대형 개체 힙에 대형 문자열 변수를 많이 사용하면, 가비지 수집에 문제가 발생합니다. 

 

가비지 컬렉션이 어플리케이션에 문제를 일이킬 수 있는지 측정하려면, Windows의 성능 모니터를 확인하세요.

 

 

 

.NET CLR Memory -> % Time in GC

이 카운터는 어플리케이션이 가비지 컬렉션을 수행하는데 소요되는 시간 (%) 을 반영합니다. 만약 이 수치가 5~10%를 넘게 급증하면 메모리 사용량을 더 자세히 조사해야 합니다. 

 

.NET Framework 2.0 버전을 사용중이라면, 서버모드를 활성화 해야 할 수도 있습니다. 

 

Configuring Garbage Collection on the Server

Table of contents Configuring Garbage Collection on the Server Article 05/23/2014 In this article --> This content is no longer actively maintained. It is provided as is, for anyone who may still be using these technologies, with no warranties or claims of

learn.microsoft.com

<configuration
   <runtime>
      <gcServer enabled="true"/>
   </runtime>
</configuration>

 

 

 

 5. ASP.NET 파이프 라인에서 요청이 차된되거나, 중단된 경우 

ASP.NET request 의 lifecycle 에는 여러 단계가 있습니다. 여기에는 요청시작, 인증, 권한 부여, 올바른 HTTP 핸들러 평가 및 요청완료와 같은 기본적인 단계가 포함됩니다. 그 일환으로 사용 가능한 표준 및 사용자 정의 HTTP 모듈이 많이 있습니다.

 

성능문제가 있는 경우 모든 요청이 특정 HTTP모듈에 정지된 것처럼 보이는지 살펴보는 것이 좋습니다. 

 

HTTP 모듈은 네이티브 코드이거나 관리되는 .NET 코드일 수 있습니다. 

FormsAuthenticaion 또는 SessionStateModule과 같은 표준 .NET 모듈일 수 있습니다. 많은 애플리케이션은 타사 또는 사용자 정의 HTTP 모듈도 사용합니다.

 

세션을 사용하고 있습니까?
대부분의 사람들은 ASP.NET 세션으로 인해 얼마나 많은 성능 오버헤드가 발생하는지 알지 못합니다.
페이지를 로드할 때마다 IIS 작업자 프로세스가 세션 개체를 검색하고 잠근 다음 요청이 끝나면 해제합니다.
세션으로 인해 잠금이 발생하고 애플리케이션 내에서 병목 현상이 발생할 수 있습니다.
Redis 또는 SQL과 같은 세션 공급자를 사용하는 경우 성능 저하가 애플리케이션 성능에 영향을 미칩니다.

 

 

 

 

 

 6. 최적화가 필요한 비효율적인 .NET 코드 

다른 일반적인 원인중 어느것도 문제가 되지 않는 경우, 코드를 자세히 살펴보고 개선해야 할 수 도 있습니다.

코드에서 호출되는 메서드와 소요시간을 캐처하려면 .NET 코드 프로파일러를 사용해야 합니다.

프로파일러는 코드에서 속도가 매우 느린 특정 메서드를 식별하는데 도움이 됩니다.

 

경고: 프로파일러는 어플리케이션의 오버헤드를 추가합니다. 따라서 어플리케이션의 CPU 사용량이 이미 매우 높으면 (90%+) 프로파일링이 매우 느려지고 어플리케이션 성능이 저하됩니다.

 

이로 인해 수행중인 프로파일링의 세부수준과 프로파일링을 시작하기 전의 CPU 사용량에 따라 어플리케이션을 사용 할 수 없게 될 수 있습니다. 

 

.NET 프로파일러는 RedGate의 ANTS 성능프로파일러가 있습니다. 

https://www.red-gate.com/products/ants-performance-profiler/

 

.NET Profiler To Boost Application Performance| ANTS Performance Profiler

Drill down to slow lines of code with line-level timings Profile C# or any other .NET code line by line, with precise timing data so you can find issues at a glance. Expensive lines of code are automatically highlighted for quick visual inspection.

www.red-gate.com

 

 

 

 

 

 

 

참조

https://stackify.com/w3wp-high-cpu-usage/

 

 

 

 

 

 

 

 

END


 

 

 

 

728x90