적용 버전: JBoss EAP 6.4 / 7.x | OS: RHEL 6/7, CentOS 7
1. Apache HTTPD 튜닝 (MPM 설정)
Apache가 JBoss 앞에서 프록시 역할을 할 경우 MPM(Multi-Processing Module) 선택이 전체 처리량에 직접 영향을 줍니다.
| MPM | 특징 | 권장 환경 |
|---|---|---|
prefork | 프로세스 기반, 안정성 최우선 | mod_php 사용 시 |
worker | 프로세스+스레드 혼합, 메모리 효율↑ | 고트래픽 프록시 |
event | KeepAlive 연결 비동기 처리, 최고 효율 | Apache 2.4+ 권장 |
# /etc/httpd/conf.modules.d/00-mpm.conf
# worker MPM 예시 (JBoss 프록시 환경 권장)
LoadModule mpm_worker_module modules/mod_mpm_worker.so
StartServers 4
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 10000
튜닝 포인트: MaxRequestWorkers × ThreadsPerChild가 실제 최대 동시 연결 수를 결정합니다. 메모리 여유분 확인 후 설정하세요. (ab -n 1000 -c 100 http://... 부하 테스트 병행 권장)
2. JBoss Thread Pool 튜닝
JBoss EAP 7.x의 스레드 풀은 Undertow 커넥터와 IO 워커 두 계층으로 구분됩니다.
2-1. Thread Pool (standalone.xml)
<!-- EAP 6.x: threads 서브시스템 -->
<subsystem xmlns="urn:jboss:domain:threads:1.1">
<blocking-queueless-thread-pool name="http-executor">
<max-threads count="200"/>
<keepalive-time time="60" unit="seconds"/>
</blocking-queueless-thread-pool>
</subsystem>2-2. IO Worker (EAP 7.x Undertow)
<!-- EAP 7.x: io 서브시스템 -->
<subsystem xmlns="urn:jboss:domain:io:1.1">
<worker name="default"
io-threads="16"
task-max-threads="256"
task-keepalive="60"/>
</subsystem>| 파라미터 | 기본값 | 권장값 | 설명 |
|---|---|---|---|
io-threads | CPU×2 | CPU×2 ~ CPU×4 | I/O 이벤트 처리 스레드. CPU 코어 수에 비례하여 조정 |
task-max-threads | CPU×16 | 128~256 | 비동기 작업 스레드 최대치. 과도하게 높이면 컨텍스트 스위칭 증가 |
task-keepalive | 60 | 60 | 유휴 스레드 유지 시간(ms). 기본값 유지 |
검증 명령어:
$JBOSS_HOME/bin/jboss-cli.sh --connect \
command="/subsystem=io/worker=default:read-resource(include-runtime=true)"3. JVM 튜닝 (Heap & GC)
JBoss 성능 문제의 상당수는 잘못된 JVM 힙 설정과 GC 정책에서 비롯됩니다. G1GC는 EAP 7.x(JDK 8+) 환경에서 가장 권장되는 GC 알고리즘입니다.
3-1. 힙 크기 설정
# standalone.conf (또는 domain.conf)
JAVA_OPTS="-Xms2048m -Xmx4096m"
JAVA_OPTS="$JAVA_OPTS -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"| 옵션 | 기본값 | 권장값 | 설명 |
|---|---|---|---|
-Xms | 256m | 서버 RAM × 25% | 초기 힙. -Xmx와 동일하게 설정 시 힙 조정 오버헤드 제거 |
-Xmx | 512m | 서버 RAM × 50% | 최대 힙. 물리 RAM의 50% 이상은 OS/캐시용으로 남겨야 함 |
MetaspaceSize | 21m | 256m | 초기 Metaspace 크기. OutOfMemoryError 예방 |
MaxMetaspaceSize | 무제한 | 512m | 반드시 상한 설정. 무제한 시 메모리 누수로 서버 OOM 가능 |
3-2. G1GC 설정
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"
JAVA_OPTS="$JAVA_OPTS -XX:MaxGCPauseMillis=200"
JAVA_OPTS="$JAVA_OPTS -XX:G1HeapRegionSize=16m"
JAVA_OPTS="$JAVA_OPTS -XX:InitiatingHeapOccupancyPercent=45"
# GC 로그 (운영 환경 필수)
JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:file=/app/was/logs/gc.log:time,uptime:filecount=5,filesize=20m"주의: MaxGCPauseMillis=200은 목표값이지 보장값이 아닙니다. 실제 GC 로그를 확인하며 점진적으로 조정하세요.
4. OS 튜닝 (Linux 커널 파라미터)
고트래픽 환경에서는 OS 레벨의 네트워크 백로그와 파일 디스크립터 제한이 병목이 될 수 있습니다.
4-1. sysctl 파라미터
# /etc/sysctl.conf
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_keepalive_time=300
net.ipv4.tcp_tw_reuse=1
# 적용
sysctl -p4-2. 파일 디스크립터 제한 (ulimit)
# /etc/security/limits.conf
jboss soft nofile 65536
jboss hard nofile 65536
# 적용 확인 (JBoss 프로세스 PID로 확인)
cat /proc/$(pgrep -f jboss.modules)/limits | grep "open files"| 파라미터 | 기본값 | 권장값 | 설명 |
|---|---|---|---|
somaxconn | 128 | 65535 | 소켓 연결 큐 최대 크기. 부족 시 SYN Dropped 발생 |
tcp_fin_timeout | 60 | 30 | TIME_WAIT 소켓 유지 시간. 줄이면 포트 재사용 빨라짐 |
nofile | 1024 | 65536 | 열 수 있는 파일/소켓 수. 부족 시 "Too many open files" 오류 |
5. 검증 체크리스트
# ① JBoss IO Worker 런타임 상태 확인
$JBOSS_HOME/bin/jboss-cli.sh --connect \
command="/subsystem=io/worker=default:read-resource(include-runtime=true)"
# ② JVM 메모리 현재 상태
$JBOSS_HOME/bin/jboss-cli.sh --connect \
command=":read-attribute(name=max-memory)"
# ③ OS 파라미터 적용 확인
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog
# ④ GC 로그 실시간 모니터링
tail -f /app/was/logs/gc.log튜닝 적용 순서 (권장)
- ① OS 파라미터 적용 (sysctl, limits) — 재부팅 불필요, 즉시 적용 가능
- ② JVM 힙 및 GC 옵션 조정 후 JBoss 재기동
- ③ 스레드 풀 설정 변경 후 reload (재기동 없이 적용 가능한 항목도 있음)
- ④ Apache MPM 변경은 httpd 재기동 필요 — 점검 시간 확보 후 진행





