1. 미들웨어이야기/03. JBoss

JBoss EAP6 (AS7) 튜닝 - ajp connector 에 대한 Thread Pool 생성하기

알 수 없는 사용자 2014. 12. 2. 20:39
JBoss EAP6 (AS7) 의 웹 서브시스템은 클라이언트 요청에 대해서 스레드를 할당해 처리한다. 웹 서브시스템은 클라이언트의 요청을 수신하면 풀에서 대기 상태의 스레드를 할당하고 요청이 완료(클라이언트에의 응답 완료 시)되면 스레드 풀에 반환한다.

클라이언트 요청이 들어왔을 때 스레드 풀이 최대값에 도달하지 않는 경우 새로운 스레드를 생성하여 할당한다. 스레드 풀이 최대값에 도달한 경우에는 클라이언트와 연결되지 않는다. 클라이언트의 동시 접속 수는 이 스레드 풀의 최대값에 의해 결정된다. 스레드 풀은 커넥터마다 생성하여 관리한다. 

Http와 AJP 커넥터에서  사용자 요청을 처리하기 위해서는 미리 최대 사용자에 맞게 커넥터의 "Max Connections" 수와 thread 생성에 제한이 없는 unbounded-queue-thread-pool을 할당해 놓는다.

다음은  Http 커넥터에 unbounded-queue-thread-pool executor 를  설정하는 과정이다. 


1. AJP Connector 생성과  max-connections  설정하기

위치
속성
설명
/subsystem=web/connector=ajp
max-connections
  • 할당된 스레드 풀의 최댓값. 
  • 기본값은 JVM이 사용할 수 있는 CPU 코어수 × 512 
  
1-1. ajp connector 생성 하기

[domain@localhost:9999 /] /profile=default/subsystem=web/connector=ajp:add(socket-binding=ajp, protocol="AJP/1.3", enabled=true, scheme=http)
{
    "outcome" => "success",
    "result" => undefined,
    "server-groups" => undefined
}

1-2 ajp connector 에 max-connections 설정하기

[domain@localhost:9999 /] /profile=default/subsystem=web/connector=ajp:write-attribute(name=max-connections,value=2000)
{
    "outcome" => "success",
    "result" => undefined,
    "server-groups" => undefined
}

 
2. AJP Connector 를 위한 Thread Factory 정의

[domain@localhost:9999 /] /profile=default/subsystem=threads/thread-factory=ajp-connector-factory:add(thread-name-pattern="AJP-%t", priority="9", group-name="uq-thread-pool")
{
    "outcome" => "success",
    "result" => undefined,
    "server-groups" => undefined
}

3. AJP Connector 를 위한 Executor 생성

[domain@localhost:9999 /] /profile=default/subsystem=threads/unbounded-queue-thread-pool=uq-thread-pool:add(thread-factory="ajp-connector-factory", keepalive-time={time=30, unit="seconds"}, max-threads=30)
{
    "outcome" => "success",
    "result" => undefined,
    "server-groups" => undefined
}

4. AJP Connector 에 새로 생성한 Thread Pool를 지정

[domain@localhost:9999 /] /profile=default/subsystem=web/connector=ajp:write-attribute(name=executor, value="uq-thread-pool")
{
    "outcome" => "success",
    "result" => undefined,
    "server-groups" => undefined
}

5. 생성한 내용을 확인 

5-1. 다음과 같이 domain.xml 에 profile=defalut에 subsystem=thread 에 생성된 것을 확인한다.

      <subsystem xmlns="urn:jboss:domain:threads:1.1">
                <thread-factory name="ajp-connector-factory" group-name="uq-thread-pool" thread-name-pattern="AJP-%t" priority="9"/>
                <unbounded-queue-thread-pool name="uq-thread-pool">
                    <max-threads count="30"/>
                    <keepalive-time time="30" unit="seconds"/>
                    <thread-factory name="ajp-connector-factory"/>
                </unbounded-queue-thread-pool>
            </subsystem>

5-2. 다음과 같이 domain.xml 에 profile=default 에 subsystem=web 에서 변경된 것을 확인한다.
 
        <subsystem xmlns="urn:jboss:domain:web:1.5" default-virtual-server="default-host" native="false">
                <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" />
                <connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp" enabled="true" executor="uq-thread-pool" max-connections="2000"/>
                <virtual-server name="default-host" enable-welcome-root="true">
                    <alias name="localhost"/>
                    <alias name="example.com"/>
                </virtual-server>
            </subsystem>

 

출처 오픈나루 블로그

 

by 차규철