Performance tuning WebLogic 8.1 Systems
2013.02.14 05:47
원문 : http://www.ischo.net -- 조인상 // 시스템 엔지니어
Writer : http://www.ischo.net -- ischo // System Engineer in Replubic Of Korea
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
원문 : http://www.ischo.net -- 조인상 //시스템 엔지니어
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
아젠다 ---------------------------------------------
1. 목표
2. 튜닝 측면
- 어플리케이션
- 디비
- 웹로직서버
- JVM
- 네트웍/ 하드웨어
- OS
3. 튜닝 도구
아젠다 ---------------------------------------------
성능 목표
1. 어플리케이션 이해
- 유저수
- request 수
- data의 양
- data의 구성
2. 성능 요구사항
- 처리율 (system 측면)
- 응답시간 (유저 측면)
언제 튜닝을 하는가?
1. 프로젝트를 시작할때 튜닝단계를 계획한다.
- release할 모든 코드들이 정상 동작하면, 튜닝한다.
2. 마찬가지로 튜닝단계의 끝을 계획한다.
- 남은기간을 체크하지 않으면 영원히 튜닝해야 한다.
3. 성능튜닝은 진행형이며, 되풀이 되는 프로세스이다.
- 규모에 관계없이 튜닝은 모든 release 마다 해야하는 경우도 있다.
- 성능현황을 모니터링하는 메카니즘을 시스템에 포함시키면 언제 튜닝해야하는지를 알수 있다.
성능목표를 명시적으로 정의하라
- 목표는 반드시 측정가능해야 한다.
- 그러지 않으면, 언제 목적을 완수했는지 어떻게 알수 있겠는가?
튜닝 측면
* 모든 노드와 연결선들은 잠재적인 병목지점이다.
가장 높고, 낮은 충격을 동반하는 ... 중요도의 순서가 있다.
- 어플리케이션
- 데이터베이스
- 웹로직 서버
- Java Virtual Machine
- 네트웍 / 하드웨어
- 운영체제
1. 어플리케이션
1-1. 단순함을 유지하라
1-2. 오버-엔지니어링을 피하라
- 부적절하고 쓸데없는 published-pattern에 의한 경우가 종종있다.
1-3. 현명하게 caching 하라
- Service locator, JMS connection objects cache, JDBC connection pooling, thread pooling
1-4. Network call을 최소화하라
- distributed computing golden rule
1-5. 데이터베이스 call을 최소화하라
1-6. Synchronized calls vs. Asynchronizedcalls
2. 좋은 J2EE performance design pattern 을 적용하라
- Service locator, Session facade, Message facade, Value object, Composite entity
3. EJB
- EJB home을 caching 하기
- Caching stateless session EJB remote
- Use concurrency strategy
- 사용가능할때는 언제나 local interface를 사용하기
4. JSP/서블릿
- redirect 대신에 forward를 사용하기
- http 세션에 과다한 데이터를 넣는것을 피하기
- 상태를 유지하기 위하여 stateful session bean보다는 http 세션을 이용하기
- 불필요한 세션생성을 피하기
- deploy 하기 전에 JSP의 pre-compile 하기
5. JDBC
- prepared 되고 callable한 statements를 cache 한다
- 트랜잭션들을 batch기반으로(batch-oriented) 만든다.
6. 몇몇 JAVA 팁들
- Use primitive types rather than encapsulated classes
- Use StringBuffer rather than String
- Use static final when declaring constants
- Declare methods as final whenever possible
- Use the non-synchronized collection classes rather then Vector
- Avoid unnecessary casting
- Minimize use of instanceof
- Avoid synchronized methods
- Synchronized blocks are worse then synchronized methods
7. DATABASE
- Second only to application code in potential for optimization
- Database tuning is a joint exercise between developers, DBA’s, QA and Testing
8. DATABASE 최적화 팁
- DB 스키마
: 올바른 indexing이 매우 중요하다 (인덱스 추가/삭제를 의미할수 있음)
- shared memory를 사용하는 것을 고려하라
- disk access를 줄이기 위하여 block size를 늘려라
- open cursor 의 개수를 제한하라
- 체크포인트 빈도를 줄여라
- DBMS는 그 자체로 다양한 튜닝옵션들을 제공한다
* 웹로직 서버튜닝
1. 웹로직 서버의 튜닝 파라미터들
- Core server
- web application
- JMS
- EJB
- JDBC
- Transaction
- Web Service
2. Core Server의 키 튜닝 파라미터들
2-1. Thread Count
- 가장 경험적으로 튜닝됨
- 최적의 구성은 CPU 사용율을 최대로 사용할 수 있는 최소의 쓰레드개수이다.
: 너무 적은 쓰레드개수는 CPU 사용률이 적은 것이며; 작업은 쓰레드가 사용가능하게 될때까지 대기해야만 한다.
: 너무 많은 쓰레드는 자원을 낭비한다.
- 노는 CPU사용율은 정의되어야 한다.
: CPU idle 은 10% 이하로...
2-2. Web Applications / 모듈에 특정된 실행큐(Excute Queues)
- 데드락을 방지하는데 유용하다.
- 요청의 급증을 관리하는데 유용하다.
- EJB는 weblogic-ejb-jar.xml 의 dispatch-policy 구성요소를 사용할 수 있다.
<displatch-policy>MyQueue</dispatch-policy>
- 웹 어플리케이션은 weblogic.xml의 wl-dispatch-policy나 web.xml의 param-name 서블릿으로써 사용 할 수 있다.
2-3. Performance Packs
- 팩은 서버 성능을 높이기 위한 플랫폼에 최적화된(native) 소켓 muxer를 사용한다.
- Windows 2000 이상, Solaris 2.6, AIX 4.3, HPUX, Linux 이상에서 사용 가능
- server attribute tab에서 Enable Native I/O를 체크해준다.
: config.xml 의 <NativeIOEnabled>를 추가한다.
- 퍼포먼스 팩을 사용하기를 강력히 권고한다.
: 퍼포먼스팩으로 약 150%의 성능향상이 기대됨.
2-4. Socket Readers
- 소켓 리더로써 전용으로 배정되는 실행쓰레드의 비율을 지정함.
: Server Attribute 의 “ThreadPoolPercentSocketReaders”를 사용함
: 남아있는 쓰레드는 worker 쓰레드
- 퍼포먼스 팩을 사용하지 않을 때만 적용할 수 있음
: 가능하면 퍼포먼스팩을 사용할 것을 권장함
- Default VS 권장
: Default값은 33
: 권장값은 33~99
- 최적값은 어플리케이션에 따라 매우 다르다
2-5. Connection Backlog Buffering
- 대기 큐에 얼마나 많은 TCP 연결이 버퍼될 수 있는지를 지정한다.
: 많은 connection 이 drop 되거나 거절 되면 서버에는 에러가 남지 않으며, 이것은 문제가 될 수 있다.
: 메시지가 더 이상 나오지 않을때까지 25% 단위로 증가시킨다.
- Server Attribute 에서 Accept Backlog 를 설정한다
: config.xml 에서 Accept Backlog 값을 지정한다
: connection 거절을 피하기 위하여 Accept Backlog값을 늘린다
- Default VS 권장
: Default 는 50
: 권장은 50~(운영체제에 따라)
2-6. Chunk-Tuning
- 많은 요청/응답이 있는 경우에만 필요함
- 소켓 read/write 의 개수를 적절하게 줄이는 것으로 튜닝
- -Dweblogic.ChunkSize and -Dweblogic.utils.io.chunkpoolsize
- 주요 요인은 MTU와 request size
- 클라이언트와 서버 양쪽 모두를 세팅한다
- 메모리 사용량이 더 많이 요구된다
2-7. Clustering
- 클러스터링은 응답시간과 HA의 기본 요소이다.
: 로드밸런싱, Fail-over, Scalability
3. web application
3-1. HTTP Session State를 조심히 다뤄라
- session state와 size를 최소화 하라
- 여러개의 single object 보다는 aggregate object를 이용하라
- 적합한 세션 유지 메카니즘을 선택하라
3-2. JSP 페이지 체크와 servlet reloading 을 비활성화 하라
- jsp-param pageCheckSeconds = -1 로 세팅하라
- container descriptor 에서 servlet-reload-check-secs = -1 로 세팅하거나
- config.xml 의 WebAppComponent 에서 ServletReloadCheckSecs = -1 로 세팅하라
- 5~8%의 성능향상 효과가 있다.
3-3. Precompile JSP
- 모든 JSP들은 precompile되어야 한다
- 서버가 restart될때마다 JSP들을 recompile 하는것을 피한다
- 서버 startup 시간에 영향을 끼친다
- jsp-param precompile=true 로 설정한다
3-4. 서블릿과 EJB에 별도의 실행큐를 배정한다.
4. JMS
4-1. 메시지 디자인 팁
- 메시지 타입에 따라 Serialization cost는 다양함
: 일반적으로 Byte, Stream < Object, Map < Text, XML
- message properties의 Stings의 사용을 피한다.
- 큰 메시지를 압축하는것을 고려하여 메시지 사이즈를 최소화 한다
- Message selectors는 비싸다.(특히 Xpath)
: 가능하면 indexed topic subscribers를 사용하라
: selector 대신에 여러개의 destination 을 사용하라
- message paging은 성능을 떨어뜨린다( 기본값으로 disable)
5. EJB
( 생략 )
6. JDBC
6-1. min-capacity 와 max-capacity 값을 같게 설정하라.
6-2. 큰 오버헤드 환경 : ConnectionLeakProfiling, CheckConnectionOnReserve/Release
6-3. 풀 사이즈 >= DB작업을 실행할 것으로 예상되는 모든 실행큐들의 쓰레드카운트의 총 합계
6-4. Prepared statement cache
- 준비되고 호출 가능한 statement를 캐쉬한다
- 네트웍 roundtip과 데이터베이스에서 준비작업을 줄인다.
- connection pool의 각 connection 은 자신의 개별 캐시를 가진다.
- 올바른 드라이버를 선택하는것이 중요하다. (type 2 드라이버는 빠르지 않다)
- 오라클 10g thin 드라이버가 9i 것보다 빠르다.
- 컴파일된 SQL문의 connection-specific 캐시
- java.sql.PreparedStatement 의 사용이 필요
- 기본값은 10이며, 어플리케이션의 prepared statement들의 총 개수로 설정해야한다.
7. Transaction Performance
7-1. Keep transactions short
7-2. Choose appropriate isolation level
7-3. Minimize distributed transaction Two-phase commit costs - Use local transactions and non-XA drivers where possible
- Experiment with various JDBC drivers for your database (JDBC driver performance is highly variable, especially XA JDBC drivers)
- Make sure database server CPU is not the bottleneck
- Use separate physical drives for transaction logs and JMS file stores
- Use of Direct-Write for transaction log files may improve performance with hardware write cache enabled
7-4.XA overhead
- Due to transaction logging and inefficient XA implementation of JDBC drivers
7-5. JMS and JDBC in a transaction
- Requires two-phase commit (even if it is the same database)
- JMS has to use an XA-enabled Connection Factory
- Therefore, JDBC has to use an XA driver (slow!)
7-6. JMS and JMS in a transaction
- Using 2 destinations from different JMS servers in a transactionwill use two-phase commit
8. Web Service
8-1. Operations with small simple method invocations perform much better than large complex invocations or arrays.
8-2. Prefer the use of the US-ASCII character set, it is the most efficient and the fastest.
8-3. Security Overhead: data encryption and digital signatures adversely affect performance
- be very judicious when adding security to a Web Service.
8-4. Be sure to turn off all debugging flags you might have turned onduring development
9. JVM
9-1. Heap size
- 32bit JVM은 4GB까지의 최대 메모리를 갖는다.
- 디스크로 swap될 어떠한 heap 도 허용하지 말라
- 1개의 거대한 heap을 가진 단일 서버보다는 작은 heap을 가진 여러개의 서버가 더 낫다
: GC가 더 짧아지고 분산되어 충격이 적어진다
- 메모리 expansion과 shrinking 을 방지하기 위해서 -ms 와 -mx을 같은 값으로 잡아준다.
9-2. Heap size와 Gabage Collection
- RAM보다 더 큰 heap사이즈는 page swapping을 일으킨다.
- 큰 heap은 느리지만, GC를 덜한다
- 작은 heap은 빠르지만, GC를 자주한다
- 목표는 어플리케이션에 적합한 중간포인트를 잡는 것이다.
- GC 현황을 분석하기 위해서 -verbosegc 옵션을 사용한다.
- 경험적으로 Full GC는 3~5초사이에 일어난다.
9-3. Garbage collection
- -XX:NewSize와 -XX:MaxNewSize 를 같은 값으로 설정하라
- 위의 값들을 최대 heap 사이즈의 약 1/4 정도로 구성하라
: 다른 값들을 시험하라. 최적값은 어플리케이션의 오브젝트 instantiation 비율에 따라 다르다.
- 위의 값들이 heap 사이즈의 1/2을 넘지 않도록 한다.
: Full GC를 모니터링 한다
- -XX:SurvivorRatio 값을 4-8로 지정하고, minor GC를 모니터링 한다
- Full GC의 interval을 3-5분이 넘지 않도록 한다
10. JVM to CPU Ratio
- 웹로직 JVM당 2-4개의 CPU