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 |
|
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
}
{
"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
}
{
"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>
<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>
<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 차규철