ASP.NET은 트래픽이 많은 웹 애플리케이션을 만들고자 하는 소프트웨어 개발자에게 가장 중요한 선택입니다. ASP.NET 애플리케이션 계층은 확장 가능한 특성으로 인해 매일 수천 명의 사용자와 수백만 개의 요청을 처리할 수 있습니다. 이러한 트래픽이 많은 애플리케이션은 일반적으로 로드 밸런서가 사용자 요청을 여러 웹 서버에 분산하는 로드 밸런싱된 웹 팜에 배포됩니다. ASP.NET 애플리케이션 계층은 높은 트랜잭션 부하 중에도 예외적으로 잘 작동하지만 이러한 애플리케이션은 다른 영역에서 심각한 확장성 병목 현상에 직면합니다. 이러한 ASP.NET 성능 병목 현상은 애플리케이션을 느리게 만들 수 있으며, 심지어 최대 업무 시간 중에 중단될 수도 있습니다.
주요 요점
데이터베이스 확장성: 웹 서버는 선형적으로 확장되는 반면, 관계형 데이터베이스는 높은 트랜잭션 부하가 발생할 경우 주요 병목 현상이 되는 경우가 많습니다.
세션 저장 제한: InProc과 같은 기본 옵션은 웹 팜의 확장성을 제한하는 반면, SQL Server 스토리지는 BLOB 직렬화로 인해 지연 시간을 발생시킵니다.
주정부 비대화 현황 보기: 클라이언트로 전송되는 대용량 뷰 상태 문자열은 대역폭 사용량을 증가시키고 응답 시간을 늦추며 보안 위험을 초래할 수 있습니다.
중복 처리: 변경되지 않은 데이터에 대해 페이지를 반복적으로 실행하면 CPU 및 메모리 리소스가 낭비됩니다.
해결 방법 : 예를 들어 인메모리 분산 캐시를 구현하는 방법 NCache 스토리지 부하를 줄이고 데이터베이스 접근 횟수를 85~90% 감소시켜 이러한 병목 현상을 해결합니다.

그림: ASP.NET 애플리케이션의 4가지 성능 병목 현상
잠재적인 성능 병목 현상
이 네 가지 ASP.NET 성능 병목 현상은 아래에 설명되어 있습니다.
데이터베이스 병목 현상
부하 분산 웹 팜에서 트랜잭션 부하가 증가함에 따라 선형 확장성을 허용하기 위해 웹 서버를 추가할 수 있습니다. 안타깝게도 이 접근 방식은 확장성이 낮은 데이터베이스 계층(SQL Server, Oracle 등)에서는 작동하지 않습니다. 따라서 추가 웹 서버에 관계없이 데이터베이스가 느려지고 결국 충돌하여 애플리케이션에서 발생할 수 있는 가장 심각한 성능 병목 현상이 됩니다.
ASP.NET 세션 상태 저장소 병목 현상
ASP.NET 세션 상태를 저장하는 것은 필수적이지만, 상당한 병목 현상이 될 수 있습니다. 이러한 문제의 심각성을 인식하고 Microsoft는 사용자에게 세 가지 가능한 솔루션을 제공합니다. 유감스럽게도 이러한 솔루션에는 아래에서 설명하는 대로 제한 사항이 있습니다.
- InProc: 이 옵션은 웹 서버당 하나의 작업자 프로세스로 제한하므로 여러 작업자 프로세스가 선호되는 다중 프로세서 또는 다중 코어 환경에는 적합하지 않습니다.
- 부하 분산 웹 팜: InProc 설정은 다른 사용자가 유휴 상태일지라도 사용자 요청이 세션을 생성한 동일한 웹 서버로 전송되도록 보장하기 위해 스티키 세션이 필요합니다.
- SQL 서버: ASP.NET 세션 상태 저장에 SQL Server를 사용하는 것은 세션을 BLOB로 저장하기 때문에 최적이 아닙니다. SQL Server는 이를 효율적으로 처리하지 못해 성능이 저하됩니다.
ASP.NET 뷰 상태 병목 현상
ASP.NET의 뷰 상태(View State) 메커니즘은 웹 컨트롤의 데이터를 서버에 저장하고 포스트백 시 브라우저로 전송합니다. 그러나 뷰 상태는 수백 킬로바이트까지 커질 수 있어, 대규모 폼이나 잦은 포스트백이 발생하는 경우 성능 저하를 초래할 수 있습니다. 이는 대역폭 사용량과 비용을 증가시키고, 기밀 데이터가 전송될 경우 보안 위험을 야기합니다. 이러한 문제를 해결하기 위해 웹 서버에 뷰 상태를 캐싱하고 브라우저로 소량의 토큰만 전송하는 방식이 더 효율적이고 안전한 해결책이며, 대량의 데이터를 전송할 필요성을 없애줍니다.
불필요한 페이지 실행
많은 경우, 기본 데이터가 변경되지 않은 경우 ASP.NET 페이지는 여러 요청에 걸쳐 동일한 출력을 생성합니다. 그러나 페이지는 계속 실행되어 메모리와 CPU 리소스를 낭비하고 불필요한 데이터베이스 호출은 말할 것도 없습니다. 이러한 반복적인 쿼리 실행은 성능을 저하시킵니다.
솔루션: 인메모리 분산 캐시
이러한 모든 ASP.NET 성능 문제에 대한 이상적인 솔루션은 ASP.NET에 메모리 내 분산 캐시를 통합하는 것입니다. ASP.NET 코어 분야의 다양한 어플리케이션에서 사용됩니다. NCache, .NET을 위한 선도적인 오픈소스 분산 캐시는 이러한 네 가지 주요 병목 현상을 극복하기 위한 효과적인 솔루션을 제공합니다. 간단히 논의해 보겠습니다. NCache 이러한 과제를 해결합니다.
애플리케이션 데이터 캐싱
NCache 애플리케이션 데이터(읽기 전용 참조 및 자주 변경되는 트랜잭션 데이터)를 캐싱하여 비용이 많이 드는 데이터베이스 접근 횟수를 줄일 수 있습니다. 데이터베이스와는 달리, NCache 이기 때문에 결코 병목 현상이 되지 않습니다. 분산 캐시 선형으로 확장.
NCache 캐시 서버 클러스터를 구축하고 트랜잭션 부하가 증가함에 따라 클러스터에 서버를 추가할 수 있습니다. 다음 예제는 캐시 사이드 패턴을 구현하여 캐시에 데이터가 없는 경우에만 데이터베이스에서 데이터를 가져오도록 합니다.
|
1 2 3 4 5 6 7 8 9 10 11 |
string customerKey = $"Customer:ALFKI"; Customer customer = FetchCustomerFromDB(customerKey); // Get customer from database if not found in cache if (customer == null) { // Get customer from database customer = FetchCustomerFromDB("ALFKI"); cache.Add(customerKey, customer); } // Item added in cache successfully |
분산 세션 상태 구성
NCache 또한 캐시에 ASP.NET 세션을 저장할 수 있습니다. 이것은 다른 스토리지 옵션보다 훨씬 빠른 인메모리 스토어입니다. 신뢰성을 제공하기 위해, NCache 여러 서버에서 세션을 복제합니다. 따라서 서버가 충돌해도 세션 데이터가 손실되지 않습니다. ASP.NET 세션 상태 저장소의 장점은 다음과 같습니다. NCache 프로그래밍 작업이 전혀 필요 없고, web.config 파일 변경만으로 간편하게 통합할 수 있다는 것이 가장 큰 장점입니다. 다음 web.config XML 코드 조각은 등록 방법을 보여줍니다. NCacheSessionProvider 코드 변경 없이 고가용성 세션 저장소를 활성화하려면:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<sessionState cookieless ="false" regenerateExpiredSessionId="true" mode="Custom" customProvider="NCacheSessionProvider" timeout="60" sessionIDManagerType="Alachisoft.NCache.Web.SessionStateManagement.CustomSessionIdManager, Alachisoft.NCache.SessionStateManagement"> <providers> <add name ="NCacheSessionProvider" type="Alachisoft.NCache.Web.SessionState.NSessionStoreProvider" sessionAppId="demoApp" cacheName="demoCache" writeExceptionsToEventLog="false" asyncSession="false" enableLogs="false"/> </providers> </sessionState> |
뷰 상태 캐싱 구성
NCache 캐시할 수 있습니다. ASP.NET 뷰 상태 웹 서버에서 브라우저에 식별자 키만 보내면 됩니다. 포스트백 중에, NCache HTTP 핸들러를 통해 식별자 키를 가로채서 뷰 상태 결과를 가져옵니다. 가져온 뷰 상태는 ASP.NET 페이지로 전송됩니다. 이 접근 방식은 ASP.NET 애플리케이션의 속도를 크게 향상시키고 대역폭 낭비를 줄입니다. 분산 캐시에 ASP.NET 뷰 상태를 캐싱하는 방법에 대한 자세한 내용은 다음을 참조하십시오. 블로그.
또한, NCache 수 ASP.NET 뷰 상태 그룹화 특정 세션을 사용하여 세션이 종료될 때 뷰 상태도 자동으로 만료되도록 합니다. 뷰 상태와 세션은 별도의 캐시 또는 동일한 캐시에 저장할 수 있습니다. expireViewstateWithSession 에 True뷰 상태 캐싱을 활성화하고 세션과 그룹화하려면 다음 구성을 사용하십시오. 이렇게 하면 사용자 세션이 만료될 때 데이터가 자동으로 지워집니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<ncContentOptimization> <settings enableMinification="false" enableViewstateCaching="true" groupedViewStateWithSessions="true" viewstateThreshold="1" cacheUriMapping="true" enableTrace="true" expireViewstateWithSession="true" sessionCacheName="demoSessionCache" sessionAppId="demoApp"> <cacheSettings cacheName="demoCache"> <expiration type="None" duration="0" > </cacheSettings> </settings> </ncContentOptimization> |
ASP.NET 출력 캐시 사용
불필요한 ASP.NET 페이지 실행을 방지하기 위해 ASP.NET은 단일 서버 및 단일 작업자 구성을 위한 Output Cache 프레임워크를 제공합니다. 또한, NCache, 연관된 데이터베이스 값이 업데이트될 때 페이지가 만료되도록 합니다. 등록하려면 NCache ASP.NET 출력 캐시 공급자로 사용하려면 응용 프로그램의 Web.config 파일에서 기본 공급자로 추가하세요. 섹션은 다음과 같습니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// caching section group <caching> <outputCache defaultProvider ="NOutputCacheProvider"> <providers> <add name="NOutputCacheProvider" type= "Alachisoft.NCache.OutputCacheProvider.NOutputCacheProvider, Alachisoft.NCache.OutputCacheProvider, Version=x.x.x.x, Culture=neutral, PublicKeyToken=cff5926ed6a53769" cacheName="demoCache" exceptionsEnabled="false" enableDetailLogs="false" enableLogs="true" writeExceptionsToEventLog="false"/>" </providers> </outputCache> </caching> |
다음으로, 아래와 같이 캐시하려는 출력이 있는 페이지에 OutputCache 태그를 추가해야 합니다.
|
1 |
<%@ OutputCache VaryByParam="ID" Duration="300"> |
맺음말
즉, NCache 사용자에게 주요 성능 병목 현상을 쉽게 해결할 수 있는 강력한 인메모리 분산 캐싱 솔루션을 제공합니다. 선형 확장성, 간단한 뷰 상태 구성 및 원활한 통합으로 .NET 애플리케이션의 성능을 향상시키는 데 이상적인 선택입니다.
자주 묻는 질문 (FAQ)
질문: ASP.NET 성능 저하의 가장 중요한 원인은 무엇입니까?
A: 트래픽이 많은 애플리케이션에서 가장 흔한 네 가지 병목 현상은 데이터베이스 확장성 한계, 비효율적인 세션 상태 저장 방식, 과도하게 축적된 뷰 상태 데이터, 그리고 중복된 페이지 실행입니다.
질문: SQL Server가 ASP.NET 세션 상태 관리에 비효율적인 이유는 무엇입니까?
A: SQL Server는 세션을 BLOB(Binary Large Objects) 형태로 저장하기 때문에 세션 저장에 최적화되어 있지 않습니다. 이로 인해 비용이 많이 드는 직렬화 및 역직렬화 프로세스가 필요하며, 이는 인메모리 저장 방식에 비해 성능 저하를 초래합니다.
질문: 캐싱은 ASP.NET 뷰 상태 문제를 어떻게 해결하나요?
A: 분산 캐시는 용량이 큰 뷰 상태 페이로드를 서버에 저장하고 사용자의 브라우저에는 작고 고유한 식별 토큰만 전송합니다.これにより 대역폭 사용량이 크게 줄어들고 페이지 로딩 속도가 향상됩니다.
질문: 불필요한 ASP.NET 페이지 실행을 어떻게 막을 수 있나요?
A: 출력 캐시 공급자(예: )를 사용할 수 있습니다. NCache페이지에서 생성된 출력을 캐시합니다. 이렇게 하면 데이터베이스의 기본 데이터가 실제로 변경될 때만 페이지가 다시 실행되어 CPU 리소스를 절약할 수 있습니다.






