2010년 6월 18일 금요일

asp.net 성능 튜닝 (processModel)

<processModel
   enable="true"
   timeout="Infinite"
   idleTimeout="Infinite"
   shutdownTimeout="0:00:05"
   requestLimit="Infinite"
   requestQueueLimit="5000"
   restartQueueLimit="10"
   memoryLimit="60"    
   webGarden="false"
   cpuMask="0xffffffff"
   userName="machine"
   password="AutoGenerate"
   logLevel="Errors"
   clientConnectedCheck="0:00:05"
   comAuthenticationLevel="Connect"
   comImpersonationLevel="Impersonate"
   responseRestartDeadlockInterval="00:09:00"
   responseDeadlockInterval="00:03:00"    
   maxWorkerThreads="25"
   maxIoThreads="25"/>

(여기서 말하는 프로세스는 ASP.NET worker process를 말함)
   
1) enable="[true|false]"
processModel의 설정을 이용할 것인지 결정함(false일 경우 processModel설정이 무시됨)
true일 경우 웹어플리케이션이 ASP.NET worker process에서 실행되기 때문에 processModel 세팅이 이용되나, false일 경우 IIS process에서 실행되므로 이 설정이 의미가 없어진다.

2) timeout="[Infinite | HH:MM:SS]"
프로세스의 수명, 즉 얼마동안 프로세스가 실행이 되고 새로운 프로세스로 대체되는지 결정. (책에서는 이렇게 설명함 - 새 작업자 프로세스로 대체하기 전까지 구 작업자 프로세스를 얼마나 오래 살아있게 할 것인지 결정)
디폴트값인 Infinite를 사용하게 되면 한 프로세스만 쭉 사용하게 되므로, 몇일 혹은 몇주후에 프로세스 성능이 저하되는 경우는 이값을 설정하여 자동으로 새로운 프로세스를 시작하도록 한다.

3) idleTimeout="[Infinite | HH:MM:SS]"
프로세스가 어떤 작업도 처리하지 않을때 자동으로 종료되는 시간설정. Infinite일 경우 한 번 시작되면 요청이 들어오지 않더라도 종료되지 않는다.

4) shutdownTimeout="[Infinite | HH:MM:SS]"
프로세스를 kill명령(프로세스를 강제로 제거하는 저수준 명령)을 내리기전에 프로세스에게 주어진 시간.

5) requestLimit="[Infinite | number]"
프로세스가 처리할 Request개수. 이 설정값만큼 처리하게 되면 프로세스가 자동으로 재시작한다.
timeout과 비슷한 개념이지만 timeout은 시간을 기준으로 하는 반면, 이 설정은 요청 개수를 기준으로 한다.

6) requestQueueLimit="[Infinite | number]"
프로세스는 Request를 처리하기 위해 Thread를 이용하게 되는데, Thread 상태가 Request를 처리할 수 없을경우 해당 Request는 Queue에 쌓이게 된다.
만약 Queue에 쌓인 Request개수가 이 설정값을 넘어서면 프로세스를 재시작한다.

7) restartQueueLimit="[Infinite | number]"
프로세스가 재시작하는 동안 Queue에 보관한 Request개수.

8) memoryLimit="[number]"
프로세스가 사용가능한 물리적 메모리 사용율. 프로세스가 이 설정값을 넘으면 자동으로 재시작한다.
(작업관리자에 프로세스탭의 메모리사용 값과 일치)

9) webGarden="[true|false]"
다중 프로세스(CPU)를 지원하는지 여부를 결정. cpuMask값(아래에 설명)과 같이 이용.

10) cpuMask="[bit mask]"
webGarden값이 true일때 어느 프로세스를 사용할지 결정한는 bitmask이다.
먄악 CPU가 4개 있을경우 (왼쪽부터 3,2,1,0 번 CPU) 3,1,0번만 사용할려면 이 값이 1011이 되므로 16진수로 0x0000000B가 된다.
디폴트값인 Oxffffffff은 모든 CPU를 사용하겠다는 뜻이다.

11) userName="[user]", password="[AutoGenerate | password]"
프로세스가 사용할 계정. 만약 userName이 "SYSTEM"이면 localsystem의 계정(높은권한)으로 실행이 되고, "machine"이면 ASPNET 계정(낮은권한)으로 실행된다.
IIS6.0에서는 이 설정이 의미가 없다.

12) logLevel="[All|None|Errors]"
프로세스가 이벤트로그에 어떤 이벤트를 기록할 것인지 결정. "Errors"는 에러만 기록함.

13) clientConnectedCheck="[HH:MM:SS]"
Queue에 쌓여진 Request에 대해 해당 Request에 대해서 클라이언트가 연결되었는지 체크하는 시간.
체크할 당시 클라이언트가 연결되어있지 않다면 Request을 취소한다.

14) comAuthenticationLevel="[Default|None|Connect|Call|Pkt|PktIntegrity|PktPrivacy]"
DCOM 보안에 대한 인증 수준을 결정.

15) comImpersonationLevel="[Default|Anonymous|Identify|Impersonate|Delegate]"
COM 보안에 대한 인증 수준을 결정.

16) responseDeadlockInterval="[Infinite | HH:MM:SS]"
프로세스가 요청을 처리하는 동안 Deadlock이 걸릴수 있는데, 이 설정값이 지나게 되면 자동으로 빠져나오게 된다. (프로세스를 재시작함.)

17) responseRestartDeadlockInterval="[Infinite | HH:MM:SS]"
연속적인 Deadlock이 걸렸을 경우에 프로세스 재시작이 자주 일어나는것을 방지하기 위해 시간을 설정.
만약 교착 상태 문제로 프로세스가 다시 시작하면, 이 설정값 만큼의 시간이 지나야 reaponsDeadlockInterval의 값을 체크한다.
즉, 이 설정값 만큼의 시간동안은 Deadlock을 체크하지 않는다.

18) maxWorkerThreads="[number]"
프로세스는 요청을 처리하기 위해 Thread를 이용하는데 Thread pool내에 존재하는 최대 CPU당 Thread수.

19) maxIoThreads="[number]"
Thread pool내에 존재하는 최대 CPU당 IO Thread개수.

20) serverErrorMessageFile="[filename]"
프로세스가 재시작할 때, Server Unavailable 에러 메세지를 만날 수 있는데, 이 때 filename(machine.config에 대한 상대경로)을 보여준다.

출처 : http://www.xdotnet.com/xdotnet/board/BoardRead.aspx?B_Index=1109&F_Code=24&B_Code=1084&B_Page=0