이 사례 연구는 Visual Studio 프로파일링 도구를 사용하여 샘플 ASP.NET 애플리케이션에서 성능 문제를 식별하고 해결하는 방법을 보여 줍니다. 프로파일링 도구를 비교하려면 어떤 도구를 선택해야 하나요?
다음 내용을 배웁니다.
- Visual Studio 프로파일링 도구를 사용하여 애플리케이션 성능을 분석하는 방법입니다.
- 프로파일링 데이터를 해석하여 병목 상태를 찾는 방법입니다.
- .NET 카운터, 호출 수 및 타이밍 데이터를 사용하여 코드를 최적화하기 위한 실용적인 전략입니다.
이러한 기술을 적용하여 사용자 고유의 애플리케이션을 개선합니다.
성능 문제 사례 연구의 사안 식별 및 격리
샘플 ASP.NET 앱은 시뮬레이션된 데이터베이스에 대한 쿼리를 실행하고 진단 샘플을 기반으로 합니다.
주요 성능 증상:
- 낮은 CPU 사용량: CPU가 병목 상태가 아닙니다.
- 높은 ThreadPool 스레드 수: 스레드 수가 꾸준히 증가하여 스레드 풀의 고갈을 나타냅니다.
- 느린 애플리케이션 응답: 사용 가능한 스레드가 부족하여 앱이 느리게 응답합니다.
이 사례 연구는 Visual Studio 프로파일링 도구를 사용하여 이러한 문제를 파악하고 해결하여 코드를 더 빠르고 효율적으로 만드는 데 도움이 됩니다.
도전
이러한 문제를 해결하려면 다음과 같은 몇 가지 문제가 발생합니다.
- 병목 상태 진단: 낮은 CPU 사용량과 느린 성능은 여러 가지 원인으로 인해 발생할 수 있습니다. 프로파일링 도구를 효과적으로 사용하고 출력을 해석하는 것이 필수적입니다.
- 지식 및 리소스 제약 조건: 프로파일링 및 최적화에는 특정 기술과 경험이 필요하며, 항상 사용할 수 있는 것은 아닙니다.
프로파일링 도구, 기술 지식 및 신중한 테스트를 결합하는 전략적 접근 방식이 이러한 문제를 해결하는 데 핵심입니다.
전략
다음은 이 사례 연구에서의 접근 방식에 대한 개략적인 보기입니다.
- 먼저 성능 데이터를 수집하는 동안 .NET 카운터 메트릭을 모니터링합니다. Visual Studio의 .NET 카운터 도구는 좋은 시작점입니다.
- 더 심층적인 인사이트를 위해 호출 수 및 타이밍 데이터에 대한 계측 도구와 같은 추가 프로파일링 도구를 사용하여 추적을 수집합니다.
데이터 수집에는 다음 작업이 필요합니다.
- 앱을 릴리스 빌드로 설정합니다.
- 성능 프로파일러에서 .NET 카운터 도구를 선택합니다(Alt+F2).
- 앱을 시작하고 추적을 수집합니다.
성능 카운터 확인
앱을 실행하는 동안 .NET 카운터 도구에서 카운터를 관찰합니다. 초기 조사의 경우 주의해야 할 몇 가지 주요 메트릭은 다음과 같습니다.
-
CPU Usage; CPU 사용량이 높거나 낮은 경우 성능 문제가 발생하는지 확인하려면 이 카운터를 시청하세요. 이는 특정 유형의 성능 문제에 대한 단서가 될 수 있습니다. 예를 들어:- CPU 사용량이 많으면 CPU 사용량 도구를 사용하여 코드를 최적화할 수 있는 영역을 식별합니다. 이에 대한 자습서는 사례 연구: 코드최적화에 대한 초보자 가이드를 참조하세요.
- CPU 사용량이 적은 경우 계측 도구를 사용하여 벽시계 시간을 기준으로 호출 수 및 평균 함수 시간을 식별합니다. 이는 경합 또는 스레드 풀 부족과 같은 문제를 식별하는 데 도움이 될 수 있습니다.
-
Allocation Rate; 요청을 제공하는 웹앱의 경우 속도가 상당히 안정적이어야 합니다. -
GC Heap Size; 메모리 사용량이 지속적으로 증가하고 잠재적으로 누출되는지 확인하려면 이 카운터를 시청하세요. 높아 보이는 경우 메모리 사용 도구 중 하나를 사용합니다. -
Threadpool Thread Count; 요청을 처리하는 웹앱의 경우 이 카운터를 확인하여 스레드 수가 꾸준히 유지되는지 또는 꾸준한 속도로 상승하는지 확인합니다.
다음은 CPU Usage 낮고 ThreadPool Thread Count 상대적으로 높은 방법을 보여 주는 예제입니다.
CPU 사용량이 적은 스레드 수가 꾸준히 증가하는 것은 스레드 풀 부족의 지표가 될 수 있습니다. 스레드 풀은 새로운 스레드를 계속 생성해야 합니다. 스레드 풀 고갈은 풀에 새 작업 항목을 처리하는 데 사용할 수 있는 스레드가 없고 애플리케이션이 느리게 응답하는 경우가 많을 때 발생합니다.
낮은 CPU 사용량과 상대적으로 높은 스레드 수 및 가능한 스레드 풀 부족 사례 이론에 따라 계측 도구를 사용하도록 전환합니다.
통화 수 및 타이밍 데이터 조사
계측 도구의 추적을 살펴보고 스레드에서 발생하는 일에 대해 자세히 알아볼 수 있는지 알아보겠습니다.
계측 도구를 사용하여 추적을 수집하고 Visual Studio에 로드한 후 먼저 요약된 데이터를 보여 주는 초기 .diagsession 보고서 페이지를 확인합니다. 수집된 추적에서 보고서의 세부 정보 열기 링크를 사용한 후, 플레임 그래프를 선택합니다.
Flame Graph 시각화는 QueryCustomerDB 함수(노란색으로 표시됨)가 앱 실행 시간의 상당 부분을 차지한다는 것을 보여줍니다.
QueryCustomerDB 함수를 마우스 오른쪽 단추로 클릭하고 호출 트리 보기를 선택합니다.
앱에서 CPU 사용량이 가장 높은 코드 경로를 핫 경로라고 합니다. 핫 경로 불꽃 아이콘(
)은 개선될 수 있는 성능 문제를 빠르게 식별하는 데 도움이 될 수 있습니다.
호출 트리 보기에서 핫 경로에 잠재적인 성능 문제를 가리키는 QueryCustomerDB 함수가 포함되어 있음을 확인할 수 있습니다.
다른 함수에서 소요된 시간에 비해 Self 및 값은 매우 높습니다. Total 및 Avg Total달리 Self 값은 다른 함수에서 소요된 시간을 제외하므로 성능 병목 상태를 찾는 데 적합합니다.
팁
Self 값이 높지 않고 상대적으로 낮은 경우 QueryCustomerDB 함수에서 호출한 실제 쿼리를 살펴볼 수 있습니다.
QueryCustomerDB 함수를 두 번 클릭하여 함수의 소스 코드를 표시합니다.
public ActionResult<string> QueryCustomerDB()
{
Customer c = QueryCustomerFromDbAsync("Dana").Result;
return "success:taskwait";
}
우리는 약간의 연구를합니다. 또는 시간을 절약하고 코필로트가 우리를 위해 연구를 할 있도록 할 수 있습니다.
Copilot을 사용하는 경우, 상황에 맞는 메뉴에서 Ask Copilot을 선택한 후 다음 질문을 입력합니다.
Can you identify a performance issue in the QueryCustomerDB method?
팁
/optimize 같은 슬래시 명령을 사용하여 Copilot에 대한 좋은 질문을 작성할 수 있습니다.
Copilot는 이 코드가 await를 사용하지 않고 비동기 API를 호출하고 있음을 알려줍니다. 이는 스레드 풀 부족의 일반적인 원인이며 스레드를 차단할 수 있는 동기화 비동기 코드 패턴입니다.
해결하려면 await를 사용합니다. 이 예제에서 Copilot는 설명과 함께 다음 코드 제안을 제공합니다.
public async Task<ActionResult<string>> QueryCustomerDB()
{
Customer c = await QueryCustomerFromDbAsync("Dana");
return "success:taskwait";
}
데이터베이스 쿼리와 관련된 성능 문제가 표시되는 경우 데이터베이스 도구 사용하여 특정 호출이 느린지 여부를 조사할 수 있습니다. 이 데이터는 쿼리를 최적화할 수 있는 기회를 나타낼 수 있습니다. 데이터베이스 도구를 사용하여 성능 문제를 조사하는 방법을 보여 주는 자습서는 사례 연구: 코드최적화에 대한 초보자 가이드를 참조하세요. 데이터베이스 도구는 ADO.NET 또는 Entity Framework Core를 사용하여 .NET Core를 지원합니다.
Visual Studio에서 개별 스레드 동작에 대한 시각화를 얻으려면 디버깅하는 동안 병렬 스택 창을 사용할 수 있습니다. 이 창에서는 대기 중인 스레드, 다른 스레드를 기다리는 스레드, 그리고 교착 상태 에 대한 개별 스레드 정보를 제공합니다.
스레드 풀 고갈에 대한 자세한 내용은 스레드 풀 고갈 감지를 참조하세요.
다음 단계
다음 문서 및 블로그 게시물은 Visual Studio 성능 도구를 효과적으로 사용하는 방법을 배우는 데 도움이 되는 자세한 정보를 제공합니다.