Summary: WebSphere Liberty(Open Liberty) 환경에서 성능 최적화를 위해 조정 가능한 주요 매개변수를 정리한 문서입니다. JVM 힙 설정부터 Connection Pool, Executor, 그리고 유휴 자원 관리까지
server.xml및jvm.options를 통한 튜닝 포인트를 다룹니다.
WebSphere Liberty는 기본적으로 자가 튜닝(Self-tuning) 기능을 갖추고 있으나, 운영 환경의 특성이나 애플리케이션의 워크로드 패턴에 따라 명시적인 설정 변경이 필요할 수 있습니다. 본 문서는 IBM Documentation을 기반으로 성능에 직접적인 영향을 주는 핵심 속성들을 정리했습니다.
1. JVM Tuning
가장 기본적이며 중요한 단계입니다. ${server.config.dir}/jvm.options 파일을 사용하여 설정합니다.
- 개발 환경: 빠른 서버 시작을 위해 최소 힙(Min Heap)은 작게, 최대 힙(Max Heap)은 필요한 만큼 설정.
- 운영 환경: 런타임 중 힙 크기 조정(Expansion/Contraction)에 따른 오버헤드를 제거하기 위해 최소 힙과 최대 힙을 동일한 값으로 설정하는 것을 권장합니다.
2. Transport Channel Service Tuning
클라이언트 연결, HTTP I/O 처리, 스레드 풀 및 연결 풀 관리를 담당하는 영역입니다. server.xml에서 설정합니다.
HTTP Options
SSL 핸드셰이크 비용이 높거나 처리량이 중요한 애플리케이션의 경우 지속적 연결(Persistent Connection) 설정을 최적화해야 합니다.
maxKeepAliveRequests: 단일 HTTP 연결에서 허용되는 최대 요청 수입니다.-1로 설정 시 무제한을 의미하며, 연결 맺는 비용을 절감할 수 있습니다.
<httpOptions maxKeepAliveRequests="-1" />
Connection Manager
데이터베이스 연결 풀(Connection Pool) 성능을 결정짓는 핵심 속성입니다.
maxPoolSize: 최대 실제 연결 수 (Default: 50). 모든 스레드가 DB 연결을 필요로 한다면coreThreads와 1:1 매핑을 고려하십시오.purgePolicy: Stale Connection 발견 시 처리 정책. 기본값은EntirePool이나,FailingConnectionOnly로 설정하여 실패한 연결만 제거하는 것이 효율적입니다.numConnectionsPerThreadLocal: 실행 스레드별로 DB 연결을 캐싱하여 락 경합(Contention)을 줄입니다. 멀티 코어 시스템에서 성능 향상에 유리합니다.
<connectionManager id="defaultConnectionManager"
maxPoolSize="40"
purgePolicy="FailingConnectionOnly"
numConnectionsPerThreadLocal="1" />
Note:
numConnectionsPerThreadLocal사용 시,maxPoolSize는 (애플리케이션 스레드 수 × 스레드당 연결 수) 이상으로 설정해야 합니다.
3. Data Source Optimization
DB 쿼리 성능 및 데이터 무결성 수준을 조정합니다.
Statement Cache
PreparedStatement 캐싱을 통해 파싱 비용을 줄입니다. 애플리케이션에서 사용하는 고유한 SQL 문장 수보다 크게 설정해야 합니다.
<dataSource ... statementCacheSize="60" > ... </dataSource>
Isolation Level
데이터 무결성과 동시성(Concurrency)은 트레이드오프 관계입니다. isolationLevel 속성으로 조정합니다.
TRANSACTION_READ_UNCOMMITTED: 성능 최상, 무결성 최저 (Dirty Read 발생).TRANSACTION_READ_COMMITTED: Dirty Read 방지.TRANSACTION_REPEATABLE_READ: Dirty/Non-repeatable Read 방지.TRANSACTION_SERIALIZABLE: 성능 최저, 무결성 최상 (완전한 직렬화).
4. Executor (Thread Pool) Tuning
Liberty의 Executor는 워크로드에 따라 스레드를 동적으로 조절하는 자가 튜닝 로직을 가지고 있습니다.
- 기본 원칙: 특별한 문제가 없다면 설정을 변경하지 않는 것이 권장됩니다.
- 예외 상황: 교착 상태(Deadlock) 해결 로직이 과도하게 작동하거나, 시스템 자원 한계로 스레드 수를 제한해야 할 경우
coreThreads및maxThreads를 명시합니다.
5. Reducing Overhead & Startup Time
불필요한 CPU 사이클을 줄이고 기동 시간을 단축하기 위한 설정입니다.
Servlet Response Time
WebContainer가 정적 리소스 처리를 위해 META-INF 디렉토리를 스캔하는 과정을 생략합니다.
<webContainer skipMetaInfResourcesProcessing="true"/>
Idle Server CPU
운영 환경에서는 빈번한 애플리케이션/구성 파일 변경 감지가 불필요하므로, 모니터링 주기를 비활성화하거나 늘립니다.
<!-- 아예 비활성화 (권장) -->
<applicationMonitor dropinsEnabled="false" updateTrigger="disabled"/>
<config updateTrigger="disabled"/>
<!-- 혹은 MBean 트리거로 변경 및 폴링 주기 완화 -->
<applicationMonitor updateTrigger="mbean" pollingRate="60s"/>
<config updateTrigger="mbean" monitorInterval="60s"/>
CDI 1.2 Scanning
CDI 1.2 기능은 기본적으로 모든 아카이브를 스캔합니다. 대규모 애플리케이션에서 기동 속도 저하의 주원인이 되므로, 암시적 스캔(Implicit Bean Archives)을 비활성화합니다.
<cdi12 enableImplicitBeanArchives="false"/>
Next Step: 위 설정들은 워크로드의 특성에 따라 효과가 다릅니다. 운영 환경 적용 전, 부하 테스트를 통해 각 파라미터 변경에 따른 처리량(Throughput)과 응답 시간 변화를 측정하시기 바랍니다.