IIS가 내 응용 프로그램을 재활용하지 않도록하려면 어떻게해야합니까?


82

IIS에서 호스팅되는 WCF 서비스 앱이 있습니다. 시작시 로컬 캐시로 사용하기 위해 시간과 CPU 측면에서 비용이 많이 드는 리소스를 가져옵니다.

불행히도 IIS는 프로세스를 상당히 정기적으로 재활용하는 것 같습니다. 따라서 IIS가 응용 프로그램을 재활용하지 않도록 응용 프로그램 풀의 설정을 변경하려고합니다. 지금까지 다음을 변경했습니다.

  • CPU에서 간격을 5에서 0으로 제한합니다.
  • 프로세스 모델에서 유휴 시간 초과가 20에서 0 사이입니다.
  • 1740에서 0으로 재활용되는 정기 시간 간격.

이것으로 충분합니까? 그리고 변경 한 항목에 대한 구체적인 질문이 있습니다.

  1. CPU에서 간격 제한 설정은 구체적으로 무엇을 의미합니까? 특정 CPU 사용량을 초과하면 응용 프로그램 풀이 재활용된다는 의미입니까?
  2. "재활용"이란 정확히 무엇을 의미합니까? 응용 프로그램이 완전히 종료되었다가 다시 시작 되었습니까?
  3. "작업자 프로세스 종료"와 "응용 프로그램 풀 재활용"의 차이점은 무엇입니까? 프로세스 모델 아래의 유휴 시간 초과에 대한 설명서는 작업자 프로세스 종료에 대해 설명합니다. 재활용 아래 정규 시간 간격에 대한 문서는 응용 프로그램 풀 재활용에 대해 설명합니다. 나는 그 둘의 차이점을 잘 알지 못했다. w3wp.exe가 응용 프로그램 풀을 실행하는 작업자 프로세스라고 생각했습니다. 누군가 두 응용 프로그램의 차이점을 설명 할 수 있습니까?

IIS7 및 IIS7.5 태그를 사용하는 이유는 앱이 둘 다에서 실행되고 버전간에 응답이 동일하기를 희망하기 때문입니다.

참고를위한 심상 : 여기에 이미지 설명을 입력하십시오


IIS 설정으로 위의 스크린 샷을 어디에서 얻었습니까?
Andrew William Ross

고급 앱 풀 속성 시트입니다.
TristanK

답변:


105

재활용

재활용은 일반적으로 IIS가 응용 프로그램의 컨테이너로 새 프로세스를 시작한 다음 이전 프로세스를 종료하기 전에 ShutdownTimeLimit까지 자신의 의지에서 벗어나도록합니다.

*-일반적 : DisallowOverlappingRotation / "중복 재활용 비활성화"설정 참조

그것은 인 파괴 원래 프로세스의 모든 상태 정보가 폐기에 있음. Out-of-process 세션 상태 (예 : State Server 또는 데이터베이스 또는 상태가 작은 경우 쿠키)를 사용하면이 문제를 해결할 수 있습니다.

그러나 기본적으로 겹칩니다 . 즉, 새 프로세스가 시작되고 요청 큐에 연결되어 이전 프로세스에 "[ShutdownTimeLimit] 초가 걸립니다. 준수하십시오."라는 메시지가 표시되기 전에 중단 시간이 최소화됩니다.

설정

귀하의 질문에 : 해당 페이지의 모든 설정은 어떤 방식으로 재활용을 제어합니다. "종료"는 "사전 예방 적 재활용"으로 설명 될 수 있습니다. 여기서 프로세스 자체는 갈 시간을 결정하고 순서대로 종료됩니다.

반응성 재활용은 WAS가 문제를 감지하고 프로세스를 처리하는 곳입니다 (적절한 교체 W3WP를 설정 한 후).

자, 다음은 한 형태 또는 다른 형태의 재활용을 유발할 수있는 것들입니다.

  • 건강하지 않다고 결정하는 ISAPI
  • 모든 모듈 충돌
  • 유휴 시간 초과
  • CPU 제한
  • 앱 풀 속성 조정
    • 네 엄마는 다음과 같이 할 수있다 한 지점에서 소리를 질렀습니다 : "정지 따기 그것을, 또는 더 나은 못할거야!"
  • "ping"실패 * 실제로는 ping 자체가 아니며 명명 된 파이프를 사용하므로 더 "인명 감지"
  • 위 스크린 샷의 모든 설정

해야 할 일 :

일반적으로:

  • 유휴 시간 초과를 비활성화합니다 . 20 분 동안 활동이 없으면 붐! 다음에 들어오는 요청에 대한 새로운 프로세스. 이를 0으로 설정하십시오.

  • 정기적 인 시간 간격 사용 안함 -29 시간 기본값은 다양한 당사자에 의해 "미친", "성가신"및 "영리한"으로 설명되었습니다. 실제로, 그 중 두 가지만 사실입니다.

  • 선택적으로 재생을 중지 할 수없는 경우 DisallowRotationOnConfigChange (위의 구성 변경에 대한 Reycling 사용 안함)를 켜십시오. 이렇게하면 종료해야하는 작업자 프로세스에 즉시 알리지 않고 앱 풀 설정을 변경할 수 있습니다. 설정을 적용하려면 앱 풀을 수동으로 재활용해야합니다. 설정을 사전 설정 한 다음 변경 창을 사용하여 재활용 프로세스를 통해 적용 할 수 있습니다.

  • 일반적인 원칙으로 핑을 활성화 된 상태로 둡니다 . 이것이 안전망입니다. 사람들이 사용 중지 한 다음 사이트가 때때로 중단되어 패닉 상태가되는 것을 보았습니다. 설정이 너무 느리게 반응하는 앱에 비해 너무 공격적인 경우에는 조금 뒤로 물러서십시오 당신이 그것을 끄는 것이 아니라 얻는 것을보십시오. 자체 모니터링 프로세스를 통해 중단 된 W3WP에 대해 자동 충돌 모드 덤프를 설정하지 않은 경우

그것은 잘 동작하는 과정을 영원히 살리기에 충분합니다. 죽으면 교체됩니다. 중단 된 경우 핑은이를 수신하고 2 분 내에 새로운 것을 시작해야합니다 (기본적으로 최악의 경우 계산은 최대 핑 빈도 + 핑 시간 초과 + 요청이 다시 시작되기 전에 시작 시간 제한 이어야 함 ).

CPU 제한은 일반적으로 재미 있지 않습니다. 기본적으로 꺼져 있고 어쨌든 아무것도하지 않도록 설정되어 있기 때문입니다. 프로세스를 강제 종료하도록 구성된 경우 이는 재활용 트리거 일 것입니다. 그대로 두십시오. IIS 8.x의 경우 CPU 스로틀 링도 옵션이됩니다.

(IIS) AppPool은 (.Net) AppDomain이 아니지만 하나 또는 일부를 포함 할 수 있습니다.

그러나 .Net 토지와 AppDomain 재활용에 들어가면 상태가 손실 될 수 있습니다. ( https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/ 참조 )

짧은 버전, 당신은 (따기 다시!) 콘텐츠 폴더에 web.config 파일을 터치하면, 또는 다른 것들 해당 폴더의 폴더 또는 ASPX 파일 또는 ... ...를 작성하여 그리고 그 그렇게 기본 코드 시작 비용을 제외한 App Pool 재활용만큼 파괴적입니다 (순전히 관리 코드 (.Net) 개념이므로 관리 코드 항목 만 발생합니다).

바이러스 백신은 web.config 파일을 스캔하여 변경 알림을 유발하여이를 트리거 할 수 있습니다.


2
잠깐만 기다리세요 ... 왜 안티 바이러스에서 web.config를 읽으면 변경 알림이 트리거됩니까? 아무 이유없이 web.config를 "만지는"바이러스 백신은 휴지통에 있습니다.
Shiv

AV는 파일을 스캔 할 때 사용한 마지막 엔진 버전을 기록하는 대체 데이터 스트림과 같이 읽을뿐 아니라 쓸 수도 있습니다. 생각으로.
TristanK

7

친절하게 확인하십시오.

왜 우리는 응용 프로그램 풀을 재활용합니까?

웹을 탐색하여 응용 프로그램 풀이 주기적으로 자동으로 재활용되도록 구성되는 이유 를 찾으면 메모리 문제와 관련이없는 합리적인 답변을 찾기가 어려울 것입니다. 일반적으로 커뮤니티는 메모리 문제를 피하기 위해 웹 응용 프로그램 (또는 IIS에서 호스팅되는 서비스 계층)을 재활용해야 한다는 사실을 거의 받아 들였습니다 .

나는 항상 코드가 올바르게 작동하기 위해 주기적으로 다시 시작 해야하는 경우 무언가 잘못되었다는 의견을 항상 알고 있습니다. 이 버그가 어딘가에 코드는 당신이 대신 문제 '사라'를 만들기 위해 가끔 과정을 다시 시작으로, 그 문제를 해결해야합니다.

.NET의 메모리 관리 에 더 집중 하고 응용 프로그램이 문제없이 계속 실행될 수 있도록해야합니다.


3
한 가지 이유는 .NET이 가비지 수집이 발생할 때 압축되지 않는 '대형 객체'(일반적으로 85K 이상 또는 그 이상)에 대해 별도의 힙을 사용하기 때문입니다 (.NET 4.5.1에서는 LOH 압축 옵션을 추가했다고 생각합니다). ASP.NET에서 서버 측에서 HTML을 렌더링 할 때 85K의 HTML (특히 테이블 및 그리드와 같은 반복되는 내용의 경우)을 보는 것은 드문 일이 아니며이 HTML은 기본적으로 서버의 거대한 String 객체 일뿐입니다. 큰 목적은 결국 따라서에서 OutOfMemoryException 결과 재활용, 대형 개체 힙 단편화에 기여
nothingisnecessary

0

OP 시나리오 (시작 / 예열시 긴 초기화)를 기준으로 확인해야 할 또 다른 사항은 시작 시간 제한 (초)이며 기본값은 90 초입니다. 초기화가 시작 시간 제한을 초과하면 작업자 프로세스가 종료 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.